如何从 dll 导入公共成员
Posted
技术标签:
【中文标题】如何从 dll 导入公共成员【英文标题】:How can you import a public member from dll 【发布时间】:2018-03-13 10:24:30 【问题描述】:我在 dll 库中有这个示例 c++ 类
class Rectangle
public:
int width, height;
void set_values (int,int);
int area (void);
rect;
我已经用 .def 文件导出了所有内容 导入 dll 时,我可以访问这两个功能 (set_values(int,int) 和 area(void)) 但不是公共变量(宽度和高度)
我如何访问这些变量
【问题讨论】:
类 __declspec(dllimport) 矩形 ... ;矩形 r; r.width r.height ? 您可以将 _ZN2[blabla]width @5 DATA _ZN2[blabla]height @6 DATA 添加到 .def 文件中。但是你最好__declspec(dllexport) 到类 为什么看不到 DEF 文件? 【参考方案1】:使用 dllexport 将函数导出到 dll 中:
extern "C" __declspec(dllexport) bool void set_values (int,int);
也可以使用dumpbin生成定义文件
dumpbin /EXPORTS tryDLL.dll > tryDLL.def
然后使用 lib.exe 构建将与您的 dll 文件一起使用的 .lib 文件:
lib /def:try.def /out:trydll.lib
正确导出后,您可以将 DLL 文件复制到应用程序文件夹中,并将目录和 lib 文件(或使用#pragma)包含到您的项目中。您导出的类和函数定义应在头文件中声明,该文件仍需要包含在您的项目中。可以放心,您的成员函数可以像在任何其他普通程序中一样被调用。您可以访问在 dll 声明中声明的静态成员变量和常量。
【讨论】:
我不想只导出函数,还要导出变量宽度和高度 在您的类中将它们声明为常量或静态,并使用属性来获取返回值。您也可以获得静态成员(因此是单个实例)的返回值。【参考方案2】:定义文件应被视为已弃用。为了导出类,您应该在“class”关键字之后附加 dllimport 或 dllexport 属性。在链接到您的库时,您应该针对 MSVC 生成的静态 (.lib) 库执行此操作,该库可以在与您的动态库相同的目录中找到
见: https://msdn.microsoft.com/en-us/library/81h27t8c.aspx https://msdn.microsoft.com/en-us/library/3y1sfaz2.aspx
【讨论】:
这没有回答问题(如何使用定义文件解决问题,或者是否有可能)。另外,它在哪里说不推荐使用定义文件? 这个问题从来没有提到应该使用模块定义文件;问题是询问如何从 dll 访问某些 cpp 类成员和符号。其次,没有人说它们已被弃用,因为它们只是因为遗留使用而受到谴责。使用 dllexport 和 dllimport,您没有理由使用定义文件,前提是您确实拥有相关库的源代码。 “这不能回答问题”,不,我只是没有给他提供代码供他复制和粘贴以备后续问题 我确实可以访问库的源代码,我已经成功导出了函数,我的问题是如何导出变量宽度和高度以上是关于如何从 dll 导入公共成员的主要内容,如果未能解决你的问题,请参考以下文章