0

我有一个带有纯虚函数的导出类 Base 的 MyApi.dll。我还有一个派生类,在同一个 dll 中实现了虚函数。工厂函数返回一个派生类对象。

#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。然后我调用一个工厂函数返回派生类指针,然后调用实现的函数。工厂函数返回指向派生类对象的指针,但对虚函数的调用在运行时失败。这没有帮助-> 没有必要只使用虚拟/内联函数导出类?

4

2 回答 2

0
fn pfn = (fn)GetProcAddress(hModule,"factoryFunction");

pfn 是函数的地址。

你必须调用它来获取实例对象。

Base* pcDerived = (Base*)pfn();
于 2018-06-08T16:16:55.473 回答
0

将派生类中的方法声明为虚拟并覆盖。所以它应该如下所示:

class MYAPI_EXPORT  derived: public base
{
    virtual int func() override {
        return 4;
    }
}

只是说它是 ovveride (或者根本没有,就像你的情况一样)会破坏一切

于 2016-02-14T14:45:08.463 回答