c++ - 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 文件中
我做错了吗,我实际上需要为每个不同的类实例单独的工厂函数?甚至可以这样做吗?
解决方案
您需要添加__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
{
};
推荐阅读
- c - C中基于int值和char值的数组排序
- xsd - XSD 1.1 断言:将元素值与列表元素属性的总和进行比较
- outlook - 使用 Graph API (Microsoft Outlook) 在多个文件夹中插入消息
- python - 使用 Python Selenium 更改 css 元素样式
- c# - 尽管有足够的参数,SQLite 仍显示“提供给命令的参数不足”
- javascript - 如何从 React JS 中的其他兄弟组件传递 props 值
- python - 纯python或itertools按每个日期之间的天数对日期列表进行分组
- css - 材质ui MaxwidthLG
- reactjs - 如何在 Razorpay 中找到付款详情(如付款方式、支付金额等)?
- android - 房间数据库:插入数据后如何获得响应?