原文: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 ...
【IBatisNet 开发使用小结】 IBatisNet 是一个基于 C# 和 .NET 的对象关系映射(ORM)框架,源自 Java 版本的 iBATIS。它旨在简化数据库操作,提高项目的可维护性和可扩展性。iBATIS 的核心理念是将 SQL 语句与对象...
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.4 小结** C# 作为一种现代化的编程语言,其设计充分考虑了 .NET 框架的需求,同时吸收了其他语言的优点,旨在提供高效、安全和易于使用的编程体验。通过学习 C#,开发者不仅可以快速构建高质量的应用程序,还能...
小结 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 菜单栏和工具栏 ...
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 ...
6.小结:基础总结、开发技巧 7.实战设计:Openai文本转语音工具 8.实战:界面-设计与美化 9·实战:界面-配置保存读取与交互完善 10.实战:功能开发准备-HTTP协议基础 11.实战:功能-合成、播放、导出音频 12....
#### 小结 GISDK不仅为TransCAD用户提供了强大的二次开发平台,还开启了通往独立应用程序开发的大门。无论是自动化常规任务、定制特殊功能,还是深入探索算法创新,GISDK都是通向更高层次技术掌握的关键。对于初学...
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 ...
内容简介 · · · · · · 本书作为有关 Visual C++ Debugger的专著,是一本非常难得的好书。书中深入地分析了开发不包含逻辑和语法错误的代码技巧以及调试程序的基本原理,介绍了开发和调试命令行...17.3 小结
小结 首先注意,以下所有的一切皆在 win 下进行,使用的工具的 VC++6.0。 扩展你的PHP PHP以方便快速的风格迅速在web系统开发中占有了重要地位. PHP本身提供了丰富的大量的函数及功能. 长话短说. 我们看看我们...