cygwin을 사용하여 dll 파일 빌드에서 정적 함수를 호출하기 위해 C++ Visual Studio 2012에이 작은 코드가 있습니다. 아래 코드는 완전히 작동합니다. 문제는 때로는 함수 호출에서 충돌하거나 결과 값을 일반적으로 콘솔에 출력하지만 Visual Studio의 디버거가 앞으로 나아갈 수 없다는 것입니다. 이상한 행동. 응용 프로그램을 종료 한 후 올바르게 정리하지 않는 것 같습니까? 처음으로 VS를로드하면 작동하지만 일부 디버그 및 충돌이 발생하면이 작업이 시작됩니다. 지금 DLL 정적 함수에서의 char *를 반환 사람들을위한LoadLibrary - CU에서 올바른 정리
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;
내가 알아 차 렸던 한 가지. 외부 DLL에서 __stdcall을 __cdecl로 변경하면 상황이 크게 개선되었지만 여전히 자주 실패합니다. – user2426290
정확히 어떤 문제가 발생합니까? 또한 _bablabla는 무엇입니까? 이 포인터를 나중에 삭제해야합니까? DLL 내부의 정적 데이터에 대한 포인터입니까? 동적으로 할당 된 경우에도 dll은 자체 힙을 사용할 수 있으므로 dll에서 할당을 해제해야하므로 나에게 잘못된 방법을 사용하고 있습니다. 동적으로 할당되지 않은 경우 dll이 언로드 될 때 사용하면 모든 종류의 문제가 발생합니다. – biocomp
이 줄에서 발생합니다 : char * _bablabla = fnHello (_input); fnHello는 dll 내부의 함수로 일부 파일을 열고, 계산을하고, char *를 반환합니다. 그것은 다음과 같이 정의됩니다 : char * __declspec (dllexport) __cdecl runMainRoutine (char _inputString2 []) 그래서 나는 dll 내부에서도 뭔가를 정리해야합니까? – user2426290