主要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