DLL的编写:
#include "stdio.h"
#include "stdafx.h"
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch(ul_reason_for_call)
{
case DLL_PROCESS_ATTACH: // 被进程加载时,响应一次
{
MessageBox(NULL, "DLL被成功加载", ":)", MB_ICONINFORMATION);
break;
}
case DLL_PROCESS_DETACH: // 进程关闭时,就会响应一次.
{
MessageBox(NULL, "DLL被成功卸载", ":)", MB_ICONINFORMATION);
break;
}
case DLL_THREAD_ATTACH: // 创建纯程时,响应一次
{
MessageBox(NULL, "创建了一次线程", ":)", MB_ICONINFORMATION);
break;
}
case DLL_THREAD_DETACH: // 线程返回时/结束时 响应一次
{
MessageBox(NULL, "线程返回或结束", ":)", MB_ICONINFORMATION);
break;
}
}
return TRUE;
}
// C编译 可以显示友好函数名 extern "C"
// C++编译 显示函数名为乱码 为了支持函数重载 等
// _declspec(dllexport) 导出一个函数
extern "C" _declspec(dllexport) VOID HelloKItty()
{
::MessageBox(NULL, "标准DLL测试", "测试", MB_ICONINFORMATION);
}
_declspec(dllexport) int add(int a ,int b)
{
return a+b;
}
//导出函数也可在工程内新建一个def文件,在其内关键字后声明导出函数
//def文件内导出的函数函数名为友好无乱码
DLL的调用:
1.隐式调用:
#include "stdafx.h"
#include "stdio.h"
#pragma comment(lib,"test.lib")
extern "C"_declspec(dllimport) int HelloKItty();
_declspec(dllimport)int add(int a ,int b);
int main(int argc, char* argv[])
{
printf("%d\n",add(1,9));
HelloKItty();
return 0;
}
//1.把dll的lib文件放入工程目录,dll程序放到debug目录下
//2.用关键字#pragma comment链接lib文件
//3.用关键字_declspec(dllimport)声明导入函数
//4.注:即dll的导出函数与exe的导入函数风格要一致,否则出错。导出时用c风格,导入时也用c风格
2.显示调用:
#include "stdafx.h"
#include "stdio.h"
#include "windows.h"
//用工具查看dll的函数名
//?add@@YAHHH@Z
//HelloKItty
typedef int (*add)(int a,int b);
typedef void (*hellokitty)();
int main(int argc, char* argv[])
{
HMODULE hmod=LoadLibrary("test.dll");
add ok=(add)GetProcAddress(hmod,"?add@@YAHHH@Z");//此处名字为你找到的名字
int i=ok(6,6);
printf("%d\n",i);
hellokitty ok1=(hellokitty)GetProcAddress(hmod,"HelloKItty");
ok1();
FreeLibrary(hmod);//释放dll
return 0;
}
本文详细介绍了如何在Windows环境下编写和调用动态链接库(DLL)。内容包括DLL的创建过程和两种调用方式:隐式调用与显示调用。对于开发者来说,掌握DLL技术能有效实现代码复用和模块化开发。
685

被折叠的 条评论
为什么被折叠?



