标签:tom win 导出 头文件 callback winapi ble ascii ott
?
动态链接库英文为DLL,是Dynamic Link Library的缩写。DLL是一个包含可由多个程序,同时使用的代码和数据的库 --------------百度百科
?
下面我们使用vs2010创建一个可供win32程序使用的dll
?
?
?
?
?
?
每一个dll都有一个入口函数,这个入口函数叫做 DLLMain
这个东西咱暂时用不到,就先不写了,如果你生成的是标准的dll文件,这个入口函数就会出现在你的源代码中。
?
然后就可以开始写函数了,在写函数之前,先介绍一下dll中的规则
?
?
函数:
__declspec(dllexport) void GiaoWarningA() { ????MessageBoxA(NULL,"giao","warning",MB_OK); ????return; } ? __declspec(dllexport) void GiaoWarningW() { ????MessageBoxW(NULL,L"giao",L"warning",MB_OK); ????return; } |
一般winapi中的函数都有两个版本,一个是ascii码版本,一个是unicode版本,windows使用宏来自动选择,例如
//编码判断 #ifdef UNICODE #define GiaoWarning GiaoWarningA ? #else #define GiaoWarning GiaoWarningW ? #endif |
我们也可以借鉴这种思想,来自动选择是否加上extern "C"
?
例如
//语言判断 #ifdef __cplusplus #define EXPORT extern "C" __declspec (dllexport) #else #define EXPORT __declspec (dllexport) #endif |
?
了解了这些我们就可以开始写我们的头文件了
头文件giao.h
//语言判断 #ifdef __cplusplus #define EXPORT extern "C" __declspec (dllexport) #else #define EXPORT __declspec (dllexport) #endif ? //函数声明 EXPORT void CALLBACK GiaoWarningA(); EXPORT void CALLBACK GiaoWarningW(); ? //编码判断 #ifdef UNICODE #define GiaoWarning GiaoWarningA ? #else #define GiaoWarning GiaoWarningW ? #endif |
注意这三块代码我摆放的顺序
?
另外还有一点,在函数声明中EXPORT void CALLBACK的顺序可别弄乱了
EXPORT void CALLBACK GiaoWarningA(); |
?
源文件giao.c
#include "giao.h" #include <Windows.h> ? EXPORT void CALLBACK GiaoWarningA() { ????MessageBoxA(NULL,"giao","warning",MB_OK); ????return; } ? EXPORT void CALLBACK GiaoWarningW() { ????MessageBoxW(NULL,L"giao",L"warning",MB_OK); ????return; } |
?
源文件中的函数原型与头文件中的一毛一样
还有就是头文件中要包含giao.h和函数用到的头文件
?
?
?
?
?
?
我们先来将如何在 启动时加载链接库
?
?
?
?
?
我是把函数放在WM_PAINT里了,你也可以放在其他地方,
?
?
功能是加载动态链接库,获取函数地址
还有一个实例句柄用来操作动态链接库
????typedef void (*FUC)(); ????FUC fuc; ????HINSTANCE hlibrary; |
然后
hlibrary = LoadLibraryA("wdnmd.dll"); fuc = (FUC)GetProcAddress(hlibrary,"GiaoWarningA"); fuc(); |
?
这里我遇到了一些问题,GetProcAddress的返回值一直都是NULL,好像是函数名有问题。
找到了一些解决的方法,但也不是太好
?
关于__stdcall????????导出的函数名为: _函数名@0????????(0为参数所占的总字节数)
__fastcall????????导出的函数名为: @函数名@0????????(同上)
__cdel????????导出的函数名为: 函数名
啥都不加????????导出的函数名为: 函数名
windows要求的CALLBACK其实就是这个__stdcall,所以可以按照他的导出格式,去调用函数。如 fuc = (FUC)GetProcAddress(hlibrary,"_GiaoWarningA@0");
标签:tom win 导出 头文件 callback winapi ble ascii ott
原文地址:https://www.cnblogs.com/jawide/p/11877156.html