DLL的export是指将DLL中的函数和数据输出到其它程式中,以供其使用。DLL的import是指使用DLL的程式引入DLL中的函数和数据。
DLL的export
DLL中包含有一个表,称为export table(以下简称ET),其中包含了DLL中可以被外部程式使用的所有函数和数据的名字。只有记录在ET中的函数和数据才可以被外部程式所使用(如果没有.DEF文件的话),其它所有没有记录在ET中的函数和数据都被视为是DLL私有的。因此,要将DLL中的函数和数据export只有两个方法:
l 为DLL创建一个.DEF文件(模块定义文件),并在build该DLL时使用这个.DEF文件。使用这种方法使你可以将函数按序号export。
l 在DLL中想要export的函数和数据定义前添加_declspec(dllexport)关键字(对于函数和变量定义,加在最前面;对于class定义,加在class关键字后),这样该函数和数据就会被添加到ET中。使用这种方法函数将按名字export。
在WINDOWS下,无论使用上述的哪一种方法,都必须要将export函数声明为_stdcall。
关于C和C++的兼容问题
如果要写C和C++兼容的DLL,因为在C和C++下使用了不同的名字修饰规则以及不同的调用约定,所以,如果DLL是用C编写和编译的,则在用于C++模块时,函数的声明前应加上extern “C”关键字,以告诉LINKER使用C外部连接(即按照C名字修饰规则在外部模块中寻找函数);反之,如果DLL是用C++编写和编译的,则在用于C模块时,函数的声明前要加上extern “C++”关键字。VC++通过_cplusplus宏来标识C++程式。如果是C++程式,VC编译器就会为你定义_cplusplus宏。所以在DLL中可以使用如下的技术来解决兼容问题:
#ifdef _cplusplus
extern “C” {
#endif
// 将所有的函数声明放在这里
#ifdef _cplusplus
}
#endif
.DEF文件
.DEF文件是包含了DLL模块信息的文本文件。其语法结构如下:
LIBRARY DLL file name
DESCRIPTION “descriptions”
EXPORTS
Function names @nums
LIBRARY为关键字,后面紧跟关联的DLL文件名;DESCRIPTION后为可选的描述字符串,除了增加可读性外没什么用处;EXPORTS后是export函数的列表,首先是函数名,然后是@符号,后紧跟一十进制数,为该函数的标号,范围从1到DLL可export函数的总数。注意,这里的名字是经过名字修饰后的函数名字,如果是DLL是用C++写的话,那么就很郁闷了。
如果是扩展DLL(extension DLL),并且通过.DEF文件export,那么必须在头文件中添加如下的语句:
#undef AFX_DATA
#define AFX_DATA AFX_EXT_DATA
// 头文件中的其它内容
#undef AFX_DATA
#define AFX_DATA
这些语句确保一些MFC中内部使用的变量被export到外部程式中。例如:在class中通过DECLARE_DYNAMIC获得的CRuntimeClass变量。否则DLL将会无法正确地编译和连接,或外部程式无法正确连接到该DLL。
DLL的import
外部程式的一个源文件要使用DLL中的函数和数据,就像要使用外部模块中的函数和数据一样,必须首先给出函数和数据的声明;对于class则要给出类的定义。这就称为import。对于VC编译器,Import DLL的函数和数据的语法与一般的声明类似,但要在前面加上_declspec(dllimport)关键字(对于函数和变量声明,加在最前面;对于class定义,加在class关键字后)。如果是函数,则该关键字是可选的,但使用该关键字有可能会导致编译器产生较高效的代码。但对于变量和class,则必须使用该关键字。
通过使用以下的技术,可以编写在.LIB文件和外部程序源文件通用的头文件:
#ifdef _EXPORTING
#define CLASS_DECLSPEC __declspec(dllexport)
#else
#define CLASS_DECLSPEC __declspec(dllimport)
#endif
编译器提供的_EXPORTING宏可以用于标式该源文件来自DLL文件还是外部程式。
分享到:
相关推荐
`_declspec(dllimport)`和`_declspec(dllexport)`是两个相关的修饰符,分别用于在使用DLL的代码和创建DLL的代码中使用。下面我们将深入探讨这两个修饰符以及如何在VC++中使用它们来导出函数。 首先,让我们了解什么...
本教程将围绕"ImportExport.rar"这个压缩包,详细介绍如何利用Fiddler插件和JMeter的特性,实现高效的性能测试脚本编制。 首先,Fiddler是一款强大的HTTP协议调试代理服务器,它能够记录并分析所有HTTP(S)通信,对...
这里,`extern "C"`确保C++编译器使用C语言的调用约定,`__declspec(dllexport)`用于指示该函数是在DLL中导出的。 2. 编译C++代码为DLL 使用C++编译器(如Visual Studio或g++)将源代码编译为DLL。例如,使用...
2、把这个dll 放到fiddler的安装目录下的ImportExport文件夹下 3、打开fiddler,抓包前最好先设置过滤条件,只抓包己想要的站点 4、抓包以后,点击左上角files下export,选择相应的插件即可,然后保存桌面,用jmeter...
在C++中,通常使用`Q_DECL_EXPORT`和`Q_DECL_IMPORT`宏来控制符号的导出和导入。在头文件中,对于要导出的类或函数,使用`Q_DECL_EXPORT`;在实现文件中,如果是在DLL中使用,使用`Q_DECL_IMPORT`。 3. **构建过程*...
在C++中,我们可以使用`__declspec(dllexport)`关键字来导出函数。例如: ```cpp // 导出头文件 #pragma once extern "C" __declspec(dllexport) int add(int a, int b); ``` 然后在对应的实现文件中编写函数的...
1.可以帮助用户查看Dll到处函数 2.图像化操作界面; 3.从Dll上可以看到导出函数的序号
- **定义导出函数**:在DLL的头文件中,使用`__declspec(dllexport)`关键字来声明要导出的函数。例如: ```cpp extern "C" __declspec(dllexport) void MyFunction(); ``` - **实现导出函数**:在对应的源文件...
在`Q_DECL_EXPORT`和`Q_DECL_IMPORT`宏的帮助下,可以正确处理导入和导出符号。 - 导入DLL:在主QT项目中,通过`LoadLibrary`和`GetProcAddress`函数加载DLL,并获取导出函数的指针。记得在程序结束时使用`...
5. "DllExport" - 这可能是项目的命名空间或者一个类的名称,与导出非托管函数的功能有关。 6. "Properties" - 这是一个目录,通常包含项目的属性设置,如AssemblyInfo.cs文件,定义了程序集元数据,如版本信息、...
在C++中,我们定义导出函数和类,通过`__declspec(dllexport)`或`extern "C"`关键字来确保C#能够正确识别和调用。对于结构体和类,C++的结构体可以被直接导出,但类需要特别处理,因为C#不支持C++的多态性。 1. **...
在C++中,我们通常通过`__declspec(dllexport)`和`__declspec(dllimport)`关键字来控制函数或类的导出和导入。当在DLL项目中定义函数时,我们需要使用`__declspec(dllexport)`,而在使用DLL的客户端项目中,我们使用...
GCC$ATTRIBUTES DLLEXPORT,CDECL :: mysum integer, value :: a,b mysum = a + b return end function mysum 2.RunDLL.py import sys from ctypes import cdll,c_int from _ctypes import POINTER my_dll = ...
- MFC提供了一系列宏,如`AFX_CLASS_IMPORT`、`AFX_API_IMPORT`等,这些宏在不同的上下文中可以替代`__declspec(dllexport)`,使得代码更加简洁。 #### 输出整个类 - 要输出整个类,可以对类使用`__declspec(dll...
使用`__declspec(dllexport)`关键字来标记需要导出的函数或类。 生成LIB文件,有两种情况: - 静态链接库:在DLL项目中,选择“生成解决方案”,VS会自动创建一个静态链接库(.lib)文件,供其他程序静态链接使用。...
这些函数或类需要使用`__declspec(dllexport)`修饰符标记为可导出。 3. **配置项目**:确保项目的配置设置正确,使其能够生成一个DLL文件而非可执行文件。 4. **编译项目**:编译项目生成DLL文件。 #### 在C#项目中...
- **使用预处理器宏(__declspec(dllexport/dllimport)**:在编译DLL和使用DLL的代码时,分别使用__declspec(dllexport)和__declspec(dllimport)来控制函数和类的导出与导入。 创建MFC DLL时,通常需要在MFC库中定义...
例如,你可以使用`__declspec(dllexport)`或`__declspec(dllimport)`来控制函数的导入和导出。 接下来,MFC规则DLL则是MFC库的直接扩展,它使用MFC类并且直接包含MFC核心。这意味着DLL可以直接访问MFC的全局变量和...
- 在C++中,创建DLL需要使用特定的关键字如`__declspec(dllexport)`或`__declspec(dllimport)`来控制函数和类的导入和导出。 - 当在DLL中定义函数时,通常需要使用`__declspec(dllexport)`,而在使用DLL的客户端...