2013-07-23 2 views
0

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

, 당신은하지 DLL에서,하지만 응용 프로그램 (발신자)에서 문자 []를 할당해야합니다.

+0

좋은 규칙 (''에서'std :: fgets'처럼 보이는 함수 시그니처와 함께). 그러나 DLL에 관해 중요한 것을 잊어 버리지 않는 한, 반드시 필요하지는 않습니다. 단일 스레드 응용 프로그램이거나 잠금 메커니즘이 있거나 포인터가 가리키는 데이터가 변경되지 않는다고 보장되는 경우 함수 정의 (또는 다른 유사 전역 방식)로 선언 된 정적 배열에 대한 포인터를 반환해야합니다. 안전한. – user