[英]How can I import dll of a C++ class inside a namespace
我读了一些文档,给出了与C兼容的功能的简单示例。
__declspec(dllexport) MyFunction();
我很开心。 我写了一个小应用程序使用这个dll的功能。 我使用显式链接
LoadLibrary()
功能。 C风格的功能没有问题。 但是当我把我的班级写成
namespace DllTest
{
class Test
{
public:
__declspec(dllexport) Test();
__declspec(dllexport) void Function( int );
__declspec(dllexport) int getBar(void);
private:
int bar;
};
}
#endif
它编译得很好,并且创建了Dll。 使用C风格函数时,我只是从LoadLibrary()和GetProcAddress(...)函数中获取函数指针。
我之前的用法是
typedef void (*Function)(int);
int main()
{
Function _Function;
HINSTANCE hInstLibrary = LoadLibrary(TEXT("test.dll"));
if (hInstLibrary)
{
_Function = (Function)GetProcAddress(hInstLibrary,"Function");
if (_Function)
{
// use the function
但现在我不知道如何实例化我的课程? 我如何使用显式链接或隐式链接?
任何有关代码示例的帮助将不胜感激。
如果您正在尝试实例化一个类,那么您需要在编译时知道它的结构。 您可以通过创建一个抽象类来实现此目的,该类定义导入的类必须重新定义的实例方法。 例如:
//interface.h
class TestInterface
{
public:
virtual void Function( int ) = 0;
virtual int getBar(void) = 0;
};
然后,在您的DLL中,您可以包含interface.h,继承TestInterface并重新定义纯虚方法:
//test.h
namespace DllTest {
class Test : public TestInterface
{
public:
Test();
void Function( int );
int getBar(void);
private:
int bar;
};
};
然后,您可以在DLL中定义一个分配Test对象的函数:
extern "C" __declspec(dllexport) TestInterface *allocate_test() {
return new DllTest::Test();
}
最后,当您导入DLL时,查找符号“allocate_test”并使用它:
TestInterface *(*test_fun)() = (TestInterface *(*test_fun)())GetProcAddress(hInstLibrary,"allocate_test");
TestInterface *test_ptr = test_fun();
test_ptr->Function(12); //use you object
首先,请注意这是微软的特殊性。 其他系统将适用不同的规则。
像你一样写东西不起作用,或者至少是痛苦的。 您需要在定义函数的DLL中使用__declspec(dllexport)
,而在编译调用其他DLL函数的代码时使用__declspec(dllimport)
。 处理此问题的常用方法是使用一些指定DLL的特定宏名称,并执行以下操作:
#ifdef __WIN32
#ifdef MYMODULE_DLL
#define MYMODULE_EXPORT __declspec(dllexport)
#else
#define MYMODULE_EXPORT __declspec(dllimport)
#endif
#else
#define MYMODULE_EXPORT
#endif
将它放在DLL中包含在所有标头中的标头中,并在项目的命令行中定义MYMODULE_DLL
。
此外,还可以导出整个班级:
class MYMODULE_EXPORT DllTest
{
// ...
};
这具有导出或导入类的所有函数和静态成员的效果。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.