无法调用导出的虚函数

时间:2013-05-18 11:09:41

标签: c++ visual-studio-2010 dll mfc virtual-functions

我有一个带有纯虚函数的导出类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?

2 个答案:

答案 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();