`
happmaoo
  • 浏览: 4471919 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

DLL的Export和Import

阅读更多
<iframe align="top" marginwidth="0" marginheight="0" src="http://www.zealware.com/csdnblog01.html" frameborder="0" width="728" scrolling="no" height="90"></iframe>
DLLexport是指将DLL中的函数和数据输出到其它程式中,以供其使用。DLLimport是指使用DLL的程式引入DLL中的函数和数据。
DLLexport
DLL中包含有一个表,称为export table(以下简称ET),其中包含了DLL中可以被外部程式使用的所有函数和数据的名字。只有记录在ET中的函数和数据才可以被外部程式所使用(如果没有.DEF文件的话),其它所有没有记录在ET中的函数和数据都被视为是DLL私有的。因此,要将DLL中的函数和数据export只有两个方法:
l DLL创建一个.DEF文件(模块定义文件),并在buildDLL时使用这个.DEF文件。使用这种方法使你可以将函数按序号export
l DLL中想要export的函数和数据定义前添加_declspecdllexport)关键字(对于函数和变量定义,加在最前面;对于class定义,加在class关键字后),这样该函数和数据就会被添加到ET中。使用这种方法函数将按名字export
WINDOWS下,无论使用上述的哪一种方法,都必须要将export函数声明为_stdcall
关于CC++的兼容问题
如果要写CC++兼容的DLL,因为在CC++下使用了不同的名字修饰规则以及不同的调用约定,所以,如果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函数的列表,首先是函数名,然后是@符号,后紧跟一十进制数,为该函数的标号,范围从1DLLexport函数的总数。注意,这里的名字是经过名字修饰后的函数名字,如果是DLL是用C++写的话,那么就很郁闷了。
如果是扩展DLLextension 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
DLLimport
外部程式的一个源文件要使用DLL中的函数和数据,就像要使用外部模块中的函数和数据一样,必须首先给出函数和数据的声明;对于class则要给出类的定义。这就称为import。对于VC编译器,Import DLL的函数和数据的语法与一般的声明类似,但要在前面加上_declspecdllimport)关键字(对于函数和变量声明,加在最前面;对于class定义,加在class关键字后)。如果是函数,则该关键字是可选的,但使用该关键字有可能会导致编译器产生较高效的代码。但对于变量和class,则必须使用该关键字。
通过使用以下的技术,可以编写在.LIB文件和外部程序源文件通用的头文件:
 #ifdef _EXPORTING
 #define CLASS_DECLSPEC __declspec(dllexport)
 #else
  #define CLASS_DECLSPEC __declspec(dllimport)
 #endif
编译器提供的_EXPORTING宏可以用于标式该源文件来自DLL文件还是外部程式。


Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1477797


分享到:
评论

相关推荐

    VC++使用关键字_declspec (dllexport)导出函数

    `_declspec(dllimport)`和`_declspec(dllexport)`是两个相关的修饰符,分别用于在使用DLL的代码和创建DLL的代码中使用。下面我们将深入探讨这两个修饰符以及如何在VC++中使用它们来导出函数。 首先,让我们了解什么...

    ImportExport.rar

    本教程将围绕"ImportExport.rar"这个压缩包,详细介绍如何利用Fiddler插件和JMeter的特性,实现高效的性能测试脚本编制。 首先,Fiddler是一款强大的HTTP协议调试代理服务器,它能够记录并分析所有HTTP(S)通信,对...

    Python中调用C++dll例子

    这里,`extern "C"`确保C++编译器使用C语言的调用约定,`__declspec(dllexport)`用于指示该函数是在DLL中导出的。 2. 编译C++代码为DLL 使用C++编译器(如Visual Studio或g++)将源代码编译为DLL。例如,使用...

    ImportExport.zip

    2、把这个dll 放到fiddler的安装目录下的ImportExport文件夹下 3、打开fiddler,抓包前最好先设置过滤条件,只抓包己想要的站点 4、抓包以后,点击左上角files下export,选择相应的插件即可,然后保存桌面,用jmeter...

    QT动态链接库(DLL)的创建和调用

    在C++中,通常使用`Q_DECL_EXPORT`和`Q_DECL_IMPORT`宏来控制符号的导出和导入。在头文件中,对于要导出的类或函数,使用`Q_DECL_EXPORT`;在实现文件中,如果是在DLL中使用,使用`Q_DECL_IMPORT`。 3. **构建过程*...

    生成dll范例——轻松掌握dll使用方法

    在C++中,我们可以使用`__declspec(dllexport)`关键字来导出函数。例如: ```cpp // 导出头文件 #pragma once extern "C" __declspec(dllexport) int add(int a, int b); ``` 然后在对应的实现文件中编写函数的...

    dll查看工具,用户可以通过此工具查看dll导出函数

    1.可以帮助用户查看Dll到处函数 2.图像化操作界面; 3.从Dll上可以看到导出函数的序号

    VC dll编程和使用例子

    - **定义导出函数**:在DLL的头文件中,使用`__declspec(dllexport)`关键字来声明要导出的函数。例如: ```cpp extern "C" __declspec(dllexport) void MyFunction(); ``` - **实现导出函数**:在对应的源文件...

    QT调用dll和MFC调用QT的dll

    在`Q_DECL_EXPORT`和`Q_DECL_IMPORT`宏的帮助下,可以正确处理导入和导出符号。 - 导入DLL:在主QT项目中,通过`LoadLibrary`和`GetProcAddress`函数加载DLL,并获取导出函数的指针。记得在程序结束时使用`...

    一个让.Net组件不需要作为COM注册即可被其他语言调用的C#模板

    5. "DllExport" - 这可能是项目的命名空间或者一个类的名称,与导出非托管函数的功能有关。 6. "Properties" - 这是一个目录,通常包含项目的属性设置,如AssemblyInfo.cs文件,定义了程序集元数据,如版本信息、...

    C#调用C++封装成DLL的结构体及类

    在C++中,我们定义导出函数和类,通过`__declspec(dllexport)`或`extern "C"`关键字来确保C#能够正确识别和调用。对于结构体和类,C++的结构体可以被直接导出,但类需要特别处理,因为C#不支持C++的多态性。 1. **...

    CPP通用dll的导出模板

    在C++中,我们通常通过`__declspec(dllexport)`和`__declspec(dllimport)`关键字来控制函数或类的导出和导入。当在DLL项目中定义函数时,我们需要使用`__declspec(dllexport)`,而在使用DLL的客户端项目中,我们使用...

    python环境调用Fortran语言生成的动态链接库(一个简单的示例)

    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 = ...

    dll 使用,一点总结

    - MFC提供了一系列宏,如`AFX_CLASS_IMPORT`、`AFX_API_IMPORT`等,这些宏在不同的上下文中可以替代`__declspec(dllexport)`,使得代码更加简洁。 #### 输出整个类 - 要输出整个类,可以对类使用`__declspec(dll...

    生成DLL和lib文件测试案例

    使用`__declspec(dllexport)`关键字来标记需要导出的函数或类。 生成LIB文件,有两种情况: - 静态链接库:在DLL项目中,选择“生成解决方案”,VS会自动创建一个静态链接库(.lib)文件,供其他程序静态链接使用。...

    C#通过DllImport导入C++的动态链接库

    这些函数或类需要使用`__declspec(dllexport)`修饰符标记为可导出。 3. **配置项目**:确保项目的配置设置正确,使其能够生成一个DLL文件而非可执行文件。 4. **编译项目**:编译项目生成DLL文件。 #### 在C#项目中...

    MFC DLL 创建

    - **使用预处理器宏(__declspec(dllexport/dllimport)**:在编译DLL和使用DLL的代码时,分别使用__declspec(dllexport)和__declspec(dllimport)来控制函数和类的导出与导入。 创建MFC DLL时,通常需要在MFC库中定义...

    Python调用DLL实例

    例如,你可以使用`__declspec(dllexport)`或`__declspec(dllimport)`来控制函数的导入和导出。 接下来,MFC规则DLL则是MFC库的直接扩展,它使用MFC类并且直接包含MFC核心。这意味着DLL可以直接访问MFC的全局变量和...

    qt生成DLL实现源码工程

    - 在C++中,创建DLL需要使用特定的关键字如`__declspec(dllexport)`或`__declspec(dllimport)`来控制函数和类的导入和导出。 - 当在DLL中定义函数时,通常需要使用`__declspec(dllexport)`,而在使用DLL的客户端...

Global site tag (gtag.js) - Google Analytics