기본 exe는 dll을로드합니다. 간단한 boost :: any를 반환하는 dll 함수를 호출합니다. boost :: any가 소멸자에서 FreeLibrary 앱이 충돌 한 후 삭제 된 경우. 괜찮아. 하지만 난 왜이 코드도 r2 소멸자에서 충돌, 메인에서 만든 r2 및 삭제 dll 코드가 필요없는 이해할 수 없다. FreeLibrary 후에 boost :: any를 어떻게 저장할 수 있습니까? extern "C"없이 시도 - 동일한 효과.boost :: any destructor crash
콘솔 코드 :
int _tmain(int argc, _TCHAR* argv[])
{
any r2;
HMODULE hmod = LoadLibrary(L"dll");
typedef any (*dllfunc)(int,int,int);
dllfunc func = (dllfunc) GetProcAddress(hmod,"Export1");
{
any r = func(1,2,3);
r2 = r;
}
FreeLibrary(hmod);
return 0;
}
의 DLL 코드 :
extern "C"
{
DLL_API any Export1(int a,int b, int c)
{
return a+b+c;
}
}
컴파일러 비주얼 스튜디오 2005
호출 규칙이 일치합니까? 동적으로로드 된 함수를 통해 포인터보다 복잡한 것은 전달하지 않습니다. – PlasmaHH
PlasmaHH를 사용하고 있습니다. 동적 링크는 C++ ABI, 템플릿 코드, 예외 등과 잘 매치되지 않습니다. – sehe
해결책을 찾지 못했습니다. boost :: any를 복사하면 dll 내부에서 실행되는 가상 메소드 clone()이 호출되므로 새 객체의 가상 테이블도 dll에 있습니다. – micdelt