2013-07-23 46 views
0

我在C++ Visual Studio 2012中有這個小代碼,用於通過cygwin從dll文件構建中調用靜態函數,下面的代碼完全可以工作。問題是,有時它會在函數調用時崩潰,或者通常將結果值輸出到控制檯,但Visual Studio中的調試器不會向前移動。奇怪的行爲。我想也許我在退出應用程序後沒有正確清理?我第一次加載VS,它工作,但經過一些調試和崩潰後,這開始發生。LoadLibrary - 在C++中正確清理

PFN_HELLO fnHello; 
HMODULE hLib, h = LoadLibrary(TEXT("cygwin1.dll")); 
PFN_CYGWIN_DLL_INIT init = (PFN_CYGWIN_DLL_INIT) GetProcAddress(h,"cygwin_dll_init"); 
init(); 

hLib = LoadLibrary (TEXT("cyghello.dll")); 

if (NULL == hLib) 
{ 
DWORD _err = GetLastError(); 
//return 1; 
} 

//typedef LRESULT (WINAPI *PFN)(HWND, UINT, WPARAM, LPARAM); 
// PFN MySendMessageW; 

//MySendMessageW = (PFN) GetProcAddress(hLib,"runMainRoutine"); 

fnHello = (PFN_HELLO) GetProcAddress (hLib, "[email protected]"); 


if (NULL == fnHello) 
{ 
DWORD _err = GetLastError(); 
//return 1; 
} 


char* _bablabla = fnHello(_input); 

FreeLibrary(h); 
FreeLibrary(hLib); 

return _bablabla; 
+0

我注意到了一件事。將外部dll中的__stdcall改爲__cdecl顯着改善了情況,但仍然經常失敗。 – user2426290

+0

問題發生在哪一行?另外,_bablabla是什麼?你以後應該刪除這個指針嗎?它是一個指向內部DLL的一些靜態數據?在我看來,無論如何你都會使用它,因爲即使它是動態分配的,dll也可能使用它自己的堆,因此你需要從dll中釋放它。如果它不是動態分配的,在卸載dll時使用它會導致各種問題。 – biocomp

+0

它發生在這一行:char * _bablabla = fnHello(_input); fnHello是dll中的函數,它打開一些文件,進行一些計算,並返回char *。它被定義爲:char * __declspec(dllexport)__cdecl runMainRoutine(char _inputString2 [])所以我需要清理DLL內部的東西? – user2426290

回答

0

對於誰曾返回的char *從DLL靜態函數的人,你要分配的char []不是在DLL中,但在您的應用程序(主叫)。

+0

良好的經驗法則(與''中的'std :: fgets'類似的函數簽名一起使用),但除非我忘記了一些有關DLL的重要內容,否則不一定非要。如果它是一個單線程應用程序,或者有某種鎖定機制,或者確保指向的數據永遠不會改變,則返回一個指向在函數定義中聲明的靜態數組的指針(或者以其他僞全局方式)應該是安全。 – user