主要exe加載dll。從dll調用函數返回簡單的boost :: any。如果boost ::任何在FreeLibrary應用程序在析構函數崩潰後被刪除。沒關係。但我不明白爲什麼這個代碼也會在r2析構函數中崩潰,在main和delete中創建的r2不需要dll代碼。 如何在FreeLibrary之後保存boost :: any。 嘗試無外部「C」 - 相同的效果。boost ::任何析構函數崩潰
控制檯代碼:
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;
}
}
編譯器的Visual Studio 2005
您確定調用約定匹配嗎?我絕不會通過任何比通過動態加載函數的指針更復雜的東西... – PlasmaHH 2012-02-06 13:05:12
我與PlasmaHH。動態鏈接與C++ ABI,模板代碼,異常等無法很好地匹配。 – sehe 2012-02-06 13:07:26
找到了答案,但沒有解決方案。當你複製boost :: any時,它會調用在dll中執行的虛方法clone(),所以新對象的虛表也駐留在dll中。 – micdelt 2012-02-06 13:13:08