如何从 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 导入公共成员的主要内容,如果未能解决你的问题,请参考以下文章

从 C++ dll 导出一个类?

C ++ QT如何从QMainWindow布局访问QWidget的公共类成员

如何从 C# 中的子文件夹导入 .dll 库

除了使用纯虚拟外,如何通过基类从派生类中获取成员

Delphi中如何从导入的DLL中初始化一个对象?

如何从他们自己的类的成员函数中访问公共变量? (C ++)