动态链接库的创建
fangyukuan
2010.6.20
编写DLL时的函数与一般的函数方法基本一样。但要对库中的函数进行必要的声明,以说明哪些函数是可以导出的,哪些函数是不可以导出的。
把DLL中的函数声明为导出函数的方法有两种:
一是使用关键字_declspec(dllexport)来声明。
二是在.def文件中声明。
一、使用关键字_declspec(dllexport)来声明导出函数
声明函数SayHello为导出函数语句为:int _declspec(dllexport) SayHello ();
为了使一个用C++语言编写的DLL函数可以在C语言编写的应用程序中使用,在关键字_declspec(dllexport) 之前要附加另一个关键字:extern
“C”,以通知编译器采用C链接方式。
例子:(用vs2008写的例子)
新建一个工程。
选择Win32 Project,工程名字为1_DLLDemo。确定。
选择DLL其它默认。
在文件1_DLLDemo.cpp编写代码如下:
extern "C" __declspec(dllexport) void SayHello()
{
::MessageBoxW(NULL,
L"Hello",
L"fangyukuan",
MB_OK);
}
按F7编译即可。
再新建一个测试工程。这里简单一点,新建一个控制台工程就可以了。
选择Win32 console Application,其它全部默认。
编写如下代码:
#include "stdafx.h"
#include "stdlib.h" // for
system("pause");
#include "windows.h"
#include <iostream>
using namespace std;
typedef void (SAYHELLO)(); // 定义一个这种类型的函数指针
int _tmain(int argc, _TCHAR* argv[])
{
HINSTANCE hDllInst;
// 这里为dll的路径,因为现在exe和dll在同一个目录下,所以只写名字即可
hDllInst=LoadLibrary(L"1_DLLDemo.dll");
if(NULL == hDllInst)
{
cout << "加载dll失败" << endl;
}
else
{
SAYHELLO * lpproc
=(SAYHELLO *)GetProcAddress(hDllInst,"SayHello");
if(NULL != lpproc)
(*lpproc)();
FreeLibrary(hDllInst);
}
system("pause");
return 0;
}
按F7编译。再按F5运行。结果如下。
二、使用def文件声明导出函数
def文件又叫做模块定义文件,这是一个用于描述DLL属性的文本文件,每个def文件一般要包括以下模块定义语句:
A) LIBRARY语句,指出DLL的名字,链接器将把这个名字放到DLL库中。
B) EXPORTS语句,列出库中导出函数的名称及导出函数的序号(可选)。
C) DISCRIPION语句,该语句用来描述DLL的用途等说明。
可以在def文件分号“;”后面书写注释语句。
在创建DLL时,编译链接器将要使用def文件创建两个文件:一个导出文件(.EXP)和一个导入库文件(.LIB),然后使用导出文件再创建DLL文件。
外部应用程序使用的文件是导入库文件和DLL文件。由于在导入库文件中存放了外部应用程序可导入的DLL导出函数名称列表,因此外部应用程序需要把它连接在应用程序中,才能以它为索引到DLL中去找到要调用的导出函数。也就是说,导入库文件相当于是DLL可提供的服务项目表。
例子:(用vs2008写的例子)
方法同上面一样新建一个DLL工程。
在文件2_DLLDemo.cpp编写代码如下:
void SayHello()
{
::MessageBoxW(NULL,
L"2_DLLDemo::Hello",
L"fangyukuan",
MB_OK);
}
然后再新建一个def文件。
在工程右键->add->New Item…
在def文件编写如下代码:
LIBRARY "2_DLLDemo"
EXPORTS
SayHello
按F7编译完成。
测试方法同上面例子一样。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)