2013-07-23 1 views
0

J'ai ce petit code en C++ Visual Studio 2012 pour appeler la fonction statique de la construction du fichier dll avec cygwin, et ce code ci-dessous fonctionne totalement. le problème est, parfois, il se bloque sur l'appel de la fonction, ou affiche les valeurs de résultat comme d'habitude à la console, mais le débogueur dans Visual Studio ne va pas de l'avant. Comportement étrange Je suppose que je ne nettoie pas correctement après avoir quitté l'application? La première fois que je charge VS, ça marche, mais après quelques débogages et plantages, ça commence à arriver.LoadLibrary - Corriger CleanUp en 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

Une chose que j'ai remarquée. Changer __stdcall en dll externe en __cdecl a considérablement amélioré la situation, mais échoue toujours souvent. – user2426290

+0

À quelle ligne exactement le problème se produit-il? Aussi, qu'est-ce que _bablabla? Devriez-vous supprimer ce pointeur plus tard? Est-ce un pointeur vers des données statiques à l'intérieur de dll? Il me semble que vous l'utilisez mal de toute façon, car même s'il est alloué dynamiquement, dll utilise peut-être son propre tas et vous devrez donc le libérer de la dll. Si ce n'est pas dynamiquement alloué, l'utiliser quand Dll est déchargé causera toutes sortes de problèmes. – biocomp

+0

Cela arrive sur cette ligne: char * _bablabla = fnHello (_input); fnHello est une fonction dans dll, qui ouvre un fichier, fait des calculs et retourne char *. Il est défini comme: char * __declspec (dllexport) __cdecl runMainRoutine (char _inputString2 []) J'ai donc besoin de nettoyer quelque chose dans la dll aussi? – user2426290

Répondre

0

Pour ceux qui retourne jamais char * de la fonction statique DLL, vous devez allouer char [] pas dll, mais dans votre application (appelant).

+0

Bonne règle générale (en conjonction avec une signature de fonction qui ressemble à 'std :: fgets' dans' '), mais à moins que j'oublie quelque chose d'important sur les DLL, ce n'est pas forcément nécessaire. S'il s'agit d'une application monothread ou s'il existe une sorte de mécanisme de verrouillage ou s'il est garanti que les données pointées ne changeront jamais, renvoyer un pointeur vers un tableau statique déclaré dans la définition de la fonction (ou d'une autre manière pseudo-globale) sûr. – user