我有一个带有纯虚函数的导出类Base的MyApi.dll。我也有 在同一个dll中具有虚函数实现的派生类。 Factory函数返回派生类对象。
#define MYAPI_EXPORT __declspec(dllexport)
class MYAPI_EXPORT base{ virtual int func() = 0;}
class MYAPI_EXPORT derived: public base
{
int func(){
return 4;
}
}
MYAPI_EXPORT void *factoryfunction()
{
void *obj = new derived;
return obj;
}
以下是调用此派生函数的代码。
CString dllName = _T("MyApi.dll");
typedef void* (*fn)();
HINSTANCE hModule = ::AfxLoadLibrary(dllName);
if(hModule)
{
fn pfn = (fn)GetProcAddress(hModule,"factoryFunction");
Base* pcDerived = (Base*)pfn;
pcDerived->func();
}
我使用LoadLibrary加载了MyApi.dll。 然后我调用一个工厂函数返回派生类指针,然后调用实现的函数。工厂函数返回指向派生类对象的指针,但对虚函数的调用在运行时失败。 这没有帮助 - > Not necessary to export class with only virtual/inline functions?
答案 0 :(得分:0)
将派生类中的方法声明为virtual和override。所以看起来应该如下:
class MYAPI_EXPORT derived: public base
{
virtual int func() override {
return 4;
}
}
只是说它的彻头彻尾(或根本没有,就像你的情况一样)会破坏一切
答案 1 :(得分:0)
fn pfn = (fn)GetProcAddress(hModule,"factoryFunction");
pfn是函数的地址。
你必须调用它来获取实例化对象。
Base* pcDerived = (Base*)pfn();