Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;|DLL/EXE-如何从导出的类调用另一个类方法?_C++_Class_Inheritance_Dll_Exe - Fatal编程技术网

C++ C++;|DLL/EXE-如何从导出的类调用另一个类方法?

C++ C++;|DLL/EXE-如何从导出的类调用另一个类方法?,c++,class,inheritance,dll,exe,C++,Class,Inheritance,Dll,Exe,我有一个项目,我想使用DLL 我正在将factory函数导出到我的exe中: extern "C" __declspec(dllexport) BaseInit* __cdecl CreateInterface( void ) { return new Initializer; } 这很好用。在我的Init类中,我有一个方法来创建另一个类,我想从我的初始值设定项类方便地使用它: class IAnotherClass { public: virtual void TestF

我有一个项目,我想使用DLL

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

extern "C" __declspec(dllexport) 
BaseInit* __cdecl CreateInterface( void ) 
{
    return new Initializer;
}
这很好用。在我的Init类中,我有一个方法来创建另一个类,我想从我的初始值设定项类方便地使用它:

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未解析外部符号“公共:虚拟无效\uuuu cdecl” 另一个类::TestFunction(void)” (?TestFunction@AnotherClass@@UEAAXXZ)

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


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

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

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

class __declspec(dllexport) Exported
{
};
您还需要定义一个宏,根据您是在构建dll还是exe,在
\u declspec(dllexport)
\u declspec(dllimport)
之间切换标头,例如:

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

class MYDLL_EXPORT Exported
{
};

您是否正在链接到使用dll创建的导入库?
extern“C”\uuuudeclspec(dllexport)
通常,您需要一个宏在
\uuudeclspec(dllexport)
\uuudeclspec(dllimport)
之间切换,具体取决于您是在构建dll还是在使用它。@drescherjm我不是在创建导入库,我正在链接。或者至少试着去做。它适用于CreateInterface,然后是Initializer::Create,但访问另一个类方法实际上会引发未解析的外部错误。我是否也需要uu declspec(dllexport)另一个类/另一个类?这是最接近正确的答案,我实际上也有一些头问题,导致无法解决外部问题,我的DLL实际上没有导出一些函数,因为这一点。标记为已解决。