首页 > 解决方案 > C++ | DLL / EXE - 如何从导出的类中调用另一个类方法?

问题描述

我有一个项目,我想在其中使用 DLL。

我正在将工厂函数导出到我的 exe 中:

extern "C" __declspec(dllexport) 
BaseInit* __cdecl CreateInterface( void ) 
{
    return new Initializer;
}

这完美地工作。在我的 Init 类中,我有一个方法可以从我的 Initializer 类中创建另一个我想方便地使用的类:

class IAnotherClass {
public:
    virtual void TestFunction();
   ...
class AnotherClass : public IAnotherClass {
public:
    void TestFunction();
  ...
class Initializer : public BaseInit
{
    IAnotherClass* Create(void)
    {
        return new AnotherClass;
    }
    ...

这似乎也有效。我得到一个非空指针。但是,当尝试从此类(在我的 exe 程序中)调用 TestFunction 时,我得到:

LNK2001 未解析的外部符号“public: virtual void __cdecl AnotherClass::TestFunction(void)”(?TestFunction@AnotherClass@@UEAAXXZ)

void AnotherClass::TestFunction-body 在我的 DLL 项目中的单独的 .cpp 文件中

我做错了吗,我实际上需要为每个不同的类实例单独的工厂函数?甚至可以这样做吗?

标签: c++classinheritancedllexe

解决方案


您需要添加__declspec(dllexport)到您希望在 dll 之外可用的每个类和函数,只要导出包含类,您就不需要标记方法。

请注意,在类中,declspec 介于class和类名之间:

class __declspec(dllexport) Exported
{
};

您还需要定义一个宏,它根据您是构建 dll 还是 exe 来切换标题,例如__declspec(dllexport)__declspec(dllimport)

#ifdef BUILDING_MYDLL
#define MYDLL_EXPORT __declspec(dllexport)
#else
#define MYDLL_EXPORT __declspec(dllimport)
#endif

class MYDLL_EXPORT Exported
{
};

推荐阅读