`
huozheleisi
  • 浏览: 1226675 次
文章分类
社区版块
存档分类
最新评论

用DEF文件从DLL中导出C++类

 
阅读更多

DEF文件从DLL中导出C++

DEFDLL导出一个函数,或用__declspec(dllexport)指令从DLL中导出一类,想必大家已经很熟悉了,也经常使用着。这里向大家介绍一种

DEF文件从DLL导出一个类的方法。具体原理或为什么就不废话了,学会导出后,再慢慢回味吧。这里主要叙述操作步骤。

1打开VC6.0,新建一个"Win32 Dynamic-Link Library"工程,假设叫DefClass
,在“Dll kind”选择界面中选择A simple dll project

2新建一个文件,命名为DefClass.def,先暂时输入下面的内容,并加入工程。

   LIBRARY DefClass

   EXPORTS

3向工程中加入一个类CMath,并添加一个Add方法,使之看起来如下:
  class CMath
  {
  public:
int Add(int a,in b);
CMath();
virtual ~CMath();

  };
  它的实现,你想如何由你决定,我做例子时,Add返回return a+b;

4打开工程的设置(settings)界面,选择Link,勾选Generate mapfile

5Rebuild all工程。

6VC中打开DebugRelease*.map文件(如果你工程名这DefClass,那就是DelClass.map)

7找到Math.obj,比如:

 0001:00000080 ??0CMath@@QAE@XZ 10001080 f Math.obj
 0001:000000c0 ??_ECMath@@UAEPAXI@Z 100010c0 f i Math.obj
 0001:000000c0 ??_GCMath@@UAEPAXI@Z 100010c0 f i Math.obj
 0001:00000130 ??1CMath@@UAE@XZ 10001130 f Math.obj
 0001:00000170 ?Add@CMath@@QAEHHH@Z 10001170 f Math.obj
81,45行的第2列拷贝到DefClass.Def文件中,使之成为下面的样子(序号自己指定)
 LIBRARY DefClass

 EXPORTS
??0CMath@@QAE@XZ @1
??1CMath@@UAE@XZ      @2
?Add@CMath@@QAEHHH@Z    @3

9保存所有文件,再执行Rebuild All.

如果一切正常,那你的DLL中的类已经以序号导出的了。这时再往CMath中加函数,如上从map文件中找到函数的标识符,并在def文件中加一项

,分配一个序号给它。只要保持以前的导出序号不变,用新编译生成的DLL替换先前的DLL,以前的客户程序仍然可以正常运行。


如何使用生成的DLL

你可以把"Math.h""DefClass.lib"拷贝到客户程序的工程目录下,把"DefClass.dll"拷贝到客户程序的输出(debug/release)目录下。 在客户程序中#include "Math.h",在客户程序的settings中加入对DefClass.lib引用。

CMath Math;
int nRet=Math.Add(2,3);
可以了吗?

分享到:
评论

相关推荐

    VC++使用DEF文件导出函数

    摘要:VC/C++源码,系统相关,DEF,导出函数  VC++使用DEF文件导出函数,DEF导出函数以DLL文件的形式,最终编译后生成DLL文件,下载包内为源码文件包。

    C++ 编写DLL文件给易语言调用方法

    需要三个文件,dll_demo.h、dll_demo.cpp、dll_dome.def 直接上代码: 头文件如下: #ifndef _DLL_DEMO_H_ #define _DLL_DEMO_H_ #ifdef DLLDEMO_EXPORTS #define DLL_DEMO extern "C" __declspec(dllexport) #else...

    MingW VC 之.a .lib .dll .def 关系

    从DLL制作def文件: MinGW上的实现方法: pexports mydll.dll -o > mydll.def MSVC上的实现方法: 1. 制作一份dll的导出函数表,使用VC的dumpbin命令 dumpbin mydll.dll /exports > mylib.def 2. 打开def文件修改之 ...

    c++类的封装和导出

    PS:开发环境 vs2017 1、创建一个基类,一个...2、导出派生类中的函数; 3、通过采用模块定义(.def)文件声明,规范函数导出的名称。导出的函数,有些编译器会自动更改名字,增加很多限定符号,可以通过def文件规范化。

    反编译DLL文件为.CPP工具

    如果是 C++ 、C __stdcall、C __fastcall 的方式导出的话,生成的函数声明将会还原成原代码级别(可能需要修改才能编译,比如导出C++类的情况)。此时使用 __declspec(dllexport) 导出 ——不能指定导出序号。  3....

    c++11动态导出库DEF符号转换成声明.rar

    将动态导入库的DEF符号转换成C++11的函数或变量声明的软件包,内含软件的DLL、LIB库,提供用法说明和一个在VS2019平台上Demo工程

    C# 调用c++ 库 参数为指针类型导出函数

    c# Csharp调用 c++库 参数为导入和导出指针两种 包含C++ DLL源码 如fun(cont char* A,char*B) A为输入参数,B为输出参数-C# CSharp call C++ DLL lib dll function param use export and import eg: fun(cont char*...

    VS2010中使用C++创建和使用DL.docx

    VS2010中使用C++创建和使用DL.docx,文档加代码,全了。工程代码下载: 1.生成动态链接库(_declspec(dllexport)方式导出函数) 2.生成动态链接库(以.def文件(模块定义文件)方式导出函数) 3.以加载时动态链接方式...

    C++Builder调用vs2010演示代码

    3)Viewdll.exe为查看DLL导出文件的工具。 注意事项一: VSDll里面有一个 KpHttps.def LIBRARY "KpHttps" EXPORTS InitKpHttp Project > Properties... > Linker > Input > Module Definition File 里面加入你...

    自己写的dll的简介

    使用 DEF 文件从 DLL 导出 在DLL与静态库之间切换 前面我曾经提到对于使用DLL的用户__declspec(dllimport)关键字可有可无,当然前提是DLL中不包括变量定义。 所以要把库既能够做成DLL,也能够做成静态库,那么就...

    C++ dll编程教程

    DLL编程的教程,包含静态库,动态库,动态加载,静态加载,导出函数,def文件,导出类

    如何用VC++创建及调用DLL

    在将C++生成的DLL供标准C语言使用,输出文件需要用“extern "C"”修饰,否则不能被标准C语言调用。如果使用“__stdcall”调用方式,可能产生C不识别的修饰名,所以设置导出函数时要采用.def文件形式,而不是__...

    C++单双游戏

    这是用应用程序向导生成的 VC++ 项目的主项目文件。 它包含有关生成此文件的 Visual C++ 版本的信息,以及 有关使用应用程序向导选择的 平台、配置和项目功能的信息。 GameServer.cpp 这是包含 DllMain() ...

    公式分析器

    此文件可在 Microsoft Visual C++ 中直接编辑。 resExpressionProcess.rc2 此文件包含不由 Microsoft Visual C++ 编辑的资源。您应将不能由 资源编辑器编辑的所有资源放置在此文件中。 ...

    JNI技术手册 c/c++调用java

    3) 在C工程Cpro下建立hello.def文件(用于定义导出的函数),内容为: 40 4) 在C工程Cpro下建立makefile文件,内容为: 40 5) Make Targets 40 6) Make Targets视图下双击step1,在C工程Cpro下生成hello.o 文件。 41...

    c++11动态导入库函数变量命名规则.pdf

    动态导入库LIB文件是对相应的DLL动态链接库中的函数、...生成动态导入库LIB文件时,可以用DEF文件指定定义的格式。这些定义采用一套符号系统,通过这些符号能明确函数或变量的类型声明。本文就详细介绍符号的命名规则

    AheadLib源代码

    如果是 C++ 、C __stdcall、C __fastcall 的方式导出的话,生成的函数声明将会还原成原代码级别(可能需要修改才能编译,比如导出C++类的情况)。此时使用 __declspec(dllexport) 导出 ——不能指定导出序号。  3....

    Dll2Lib.exe

    VC++ 和 C++Builder 的链接器在链接 DLL 时需要导入库(Import Library),在有些情况下,只能...如用 Delphi 开发的 DLL),使用这个工具可以方便的生成 DLL 对应的 导入库和模块定义文件DEF(module-definition file)。

    能使用boost.python的MinGw(GCC)动态链接库

    为了方便大家使用MinGW(GCC)+_boost.python,特意只做了三个dll,可以很方便地将c++代码转为python模块. libboost_python-mgw45-1_49.dll libboost_python-mgw45-d-1_49.dll python27.dll 这三个文件我已放在资源...

Global site tag (gtag.js) - Google Analytics