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;
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
À 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
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