【发布时间】:2020-01-08 08:02:10
【问题描述】:
我有一个 DLL 文件,其中有一个名为 trial 的类,它包含一个名为 test 的函数,我有另一个项目,我在其中使用 windows 模块中的 loadlibrary 函数加载了 DLL,现在我想知道如何创建一个新项目中的类型试验对象。
我尝试将类定义为“class __declspec(dllexport) trial”,但我现在不知道如何在主文件中创建对象。
Trail.h如下:
class __declspec(dllexport) TRIALSHARED_EXPORT Trial
{
public:
Trial();
void test();
};
Trail.cpp如下:
extern "C"{
Trial::Trial(){
cout<<"object is created"<<endl;
}
void Trial:: test(){
cout<<"dynamic thingy"<<endl;
}
}
主要功能如下:
int main()
{
HINSTANCE here=LoadLibrary(L"C:\\Users\\vinay\\Documents\\qt c++\\build-trial-Desktop_Qt_5_12_0_MinGW_64_bit-Debug\\debug\\trial.dll");
if(!here){
cout<<"could not load the lib"<<std::endl;
}
else{
cout<<"library loaded"<<endl;
typedef void(*FNPTR)();
FNPTR fn=FNPTR(GetProcAddress(here,"Trial"));
fn();
}
}
【问题讨论】:
-
你基本上需要对应的头文件。
-
你考虑过加载时间绑定吗?这意味着不使用
LoadLibrary,而是使用可以在链接DLL 时创建的导出库。与您的main函数一起显示的程序将与导出库中定义的存根链接。使用加载时绑定,您仍然可以对实现/某些类的 DLL 使用相同的方法。 docs.microsoft.com/en-us/windows/win32/dlls/… -
@MaxLanghof 我需要在我的主目录中包含 Trial.h 吗?让我创建一个 Trial 类型的对象?
-
@harper 我应该只通过运行时链接来实现目标。有没有办法在运行时绑定中实现这一点?
-
请不要在 cmets 中扩展您的问题。如果您需要澄清一些要求,例如“仅运行时链接”,这应该是问题的一部分。