原文:DLL入门小结
昨天花了半天时间研究了DLL技术,感到小有收获,今天整理出来,加强记忆。
DLL(Dynamic Link Library),动态链接库。
1.关于__declspec(dllimport)和__declspec(dllexport)
在一个DLL的编写过程中,如果要使一个变量、一个函数或一个类能够被外部程序调用,在函数声明上加上__declspec(dllimport)关键字。
例:
引出一个变量:
__declspec(dllexport) int iEx;
引出一个函数:
__declspec(dllexport) int fnEx( int i );
引出一个类:
class __declspec(dllexport) CClassEx
{……};
在外部程序引用DLL时,如果采用隐式调用的方法(关于隐式调用稍后讨论),需要
包含DLL文件相关的头文件,这个头文件用__declspec(dllimport)关键字指出了DLL导出的内容(实际上就是把原来的
__declspec(dllexport)全部替换为__declspec(dllimport))。
例:
引入一个变量:
__declspec(dllimport) int iEx;
引入一个函数:
__declspec(dllimport) int fnEx( int i );
引入一个类:
class __declspec(dllimport) CClassEx
{……};
为了提高程序可读性,可以定义如下宏:
#define DllImport __declspec(dllimport)
#define DllExport __declspec(dllexport)
以便使用。
实际上一般定义如下宏:
#ifdef
MYDLL_EXPORTS
#define
MYDLL_API
__declspec
(
dllexport
)
#else
#define
MYDLL_API
__declspec
(
dllimport
)
#endif
这样,在源程序的实现文件中先定义
MYDLL_EXPORTS
,再包含这个头文件;在外程序内,可以直接包含这个头文件。这种方法可以实现一个文件多种用途。
2
.隐式调用和显式调用
隐式调用是最常用的一种调用方法。它需要原
DLL
文件、原头文件和库文件组成。在程序内要包含这个头文件,并加入库文件一同编译。在程序启动时会把所有隐式调用的
DLL
文件加载到内存。
如果想在使用的时候才把
DLL
文件加入到内存的话,可以使用显式调用。显式调用只需要原
DLL
文件即可,但是使用时必须对知道这个
DLL
有哪些导出的符号。可以在
VS
的命令行方式下输入“
depends
”命令来查看
DLL
信息。
示例:
隐式调用:
#include
"..\DllTest\DllTest.h"
……
void
CallDll(
void
)
{
wchar_t
wszBuf[ 32 ];
wsprintf( wszBuf, TEXT(
"%d"
), fnDllTest( 9 ) );
//fnDllTest
是DLL
文件导出的方法
wprintf( wszBuf );
}
显式调用:
void
CallDll(
void
)
{
typedef
int
(*ADDPROC)(
int
i );
ADDPROC Fn;
HINSTANCE hInst = LoadLibrary( L
"DllTest.dll"
);
if
( NULL == hInst )
{
wprintf( L
"Failed on load DLL."
);
return
;
}
Fn = ( ADDPROC )GetProcAddress( hInst,
"fnDllTest"
);
//
如果导出时使用的是_stdcall,
那么这里我们也应该使用(_stdcall ADDPROC)
if
( !Fn )
wprintf( L
"Failed on get Process Address."
);
else
{
int
i;
i = Fn( 9 );
wchar_t
wszBuf[ 32 ];
wsprintf( wszBuf, L
"%d"
, i );
wprintf( wszBuf );
}
FreeLibrary(hInst);
//
释放DLL
/*
* ADDRPROC Add = (ADDPROC)GetProcAddress(hInst, "add");
*
第而个参数也可以使用序号:
* MAKEINTRESOURCE(1)
代替函数名.
*/
}
3
.注意事项
如果使用
C++
编程,那么在程序编译的时候会为变量名等符号重命为诸如“
?fnDllTest@QAEAAV
0
”
之类的形式,为显式调用带来了不便。针对这个问题,我们可以为要导出的符号加上“
extern “C”
”修饰符,就可以保持原有名称。但是导出的类名仍然是重命名后的名称,要再研究研究。
最新发现(05-Nov-2007):用extern "C" struct __declspec(dllexport) classname即可按C格式导出类名。
如果你使用MFC生成MFC DLL那么只要做如下定义就可以了class AFX_EXT_CLASS yourClass。
分享到:
相关推荐
根据给定文件信息,以下是对"C++多线程编程入门小结.pdf"文件内容的知识点说明: ### 知识点一:C++多线程编程基础 C++多线程编程是指在C++程序中同时执行多个线程,以利用现代处理器的多核能力,提高程序的执行...
第一部分 了解COM 第1章 COM概述 何谓CoM COM术语 COM利与弊 COM的好处 ...小结 ...小结 ...小结 ...小结 ...小结 ...小结 ...小结 ...小结 ...小结 ...小结 ...小结 ...小结 ...COM+组件作为COMDLL ...小结 ...小结 ...小结 ...小结 ...小结 ...小结 ...小结
1.7 小结 第2章 数据、变量和计算 2.1 C++程序结构 2.1.1 程序注释 2.1.2 #include指令——头文件 2.1.3 命名空间和using声明 2.1.4 main()函数 2.1.5 程序语句 2.1.6 空白 2.1.7 语句块 2.1.8 自动生成的控制台程序...
1.7 小结 第2章 数据、变量和计算 2.1 C++程序结构 2.1.1 程序注释 2.1.2 #include指令——头文件 2.1.3 命名空间和using声明 2.1.4 main()函数 2.1.5 程序语句 2.1.6 空白 2.1.7 语句块 2.1.8 自动生成的控制台程序...
1.7 小结 第2章 数据、变量和计算 2.1 C++程序结构 2.1.1 程序注释 2.1.2 #include指令——头文件 2.1.3 命名空间和using声明 2.1.4 main()函数 2.1.5 程序语句 2.1.6 空白 2.1.7 语句块 2.1.8 自动生成的控制台程序...
1.7 小结 第2章 数据、变量和计算 2.1 C++程序结构 2.1.1 程序注释 2.1.2 #include指令——头文件 2.1.3 命名空间和using声明 2.1.4 main()函数 2.1.5 程序语句 2.1.6 空白 2.1.7 语句块 2.1.8 自动生成的控制台程序...
1.7 小结 27 1.8 本章主要内容 28 第2章 数据、变量和计算 29 2.1 C++程序结构 29 2.1.1 main()函数 36 2.1.2 程序语句 36 2.1.3 空白 38 2.1.4 语句块 38 2.1.5 自动生成的控制台程序 39 2.2 定义变量 40 ...
1.7 小结 第2章 数据、变量和计算 2.1 C++程序结构 2.1.1 程序注释 2.1.2 #include指令——头文件 2.1.3 命名空间和using声明 2.1.4 main()函数 2.1.5 程序语句 2.1.6 空白 2.1.7 语句块 2.1.8 自动生成的控制台程序...
1.7 小结 第2章 数据、变量和计算 2.1 C++程序结构 2.1.1 程序注释 2.1.2 #include指令——头文件 2.1.3 命名空间和using声明 2.1.4 main()函数 2.1.5 程序语句 2.1.6 空白 2.1.7 语句块 2.1.8 自动生成的控制台程序...
1.7 小结 27 1.8 本章主要内容 28 第2章 数据、变量和计算 29 2.1 c++程序结构 29 2.1.1 main()函数 36 2.1.2 程序语句 36 2.1.3 空白 38 2.1.4 语句块 38 2.1.5 自动生成的控制台程序 39 2.2 定义变量 ...
1.7 小结 29 第2章 数据、变量和计算 31 2.1 C++程序结构 31 2.1.1 程序注释 36 2.1.2 #include指令——头文件 37 2.1.3 命名空间和using声明 37 2.1.4 main()函数 38 2.1.5 程序语句 38 2.1.6 ...
#### 五、小结 通过本文的介绍,我们可以看到,在VC++中使用ADO进行数据库编程是一项既强大又简便的技术。掌握了Connection、Command和Recordset这三个核心对象的操作,便能够有效地实现数据的检索、更新等操作。...
6.小结:基础总结、开发技巧 7.实战设计:Openai文本转语音工具 8.实战:界面-设计与美化 9·实战:界面-配置保存读取与交互完善 10.实战:功能开发准备-HTTP协议基础 11.实战:功能-合成、播放、导出音频 12....
1.7 小结 27 1.8 本章主要内容 28 第2章 数据、变量和计算 29 2.1 c++程序结构 29 2.1.1 main()函数 36 2.1.2 程序语句 36 2.1.3 空白 38 2.1.4 语句块 38 2.1.5 自动生成的控制台程序 39 2.2 定义变量 40 2.2.1 ...
如题,此实例非常适合学习,重载并自绘了Wnd类,效果是上下文字、图片、文字由大到小和星星闪烁等滚动效果。实例使用了加载类似xml文件读取信息,然后显示。 COM_ATL_Tutorial 简单的atl控件演示 COM接口挂钩及其...
内容简介 · · · · · · 本书作为有关 Visual C++ Debugger的专著,是一本非常难得的好书。书中深入地分析了开发不包含逻辑和语法错误的代码技巧以及调试程序的基本原理,介绍了开发和调试命令行...17.3 小结
小结 12 自测练习 14 自测练习答案 15 练习 15 第2章 集成开发环境 17 2.1 简介 17 2.2 集成开发环境综述 17 2.3 Project窗口 19 2.4 工具箱 20 2.5 Form Layout窗口 21 2.6 Properties窗口 21 2.7 菜单栏和工具栏 ...