使用GetProcAddress从动态库中调用函数
使用GetProcAddress从动态库中调用函数
qq:9611153 微信lgs9611153
时间:2011-8-25 9:46:56
背景原因:
有时候,我们不希望获取到dll之后,显式调用里面的函数,下面就以“从User32.dll调用MessageBoxEx”的例子说明其方法。
所需资源:
Vc winapi
调用流程:
分段介绍:
获取DLL函数定义
声明函数指针定义
#include <windows.h> typedef int ( WINAPI *MESSAGEBOX )( HWND , LPCSTR, LPCSTR, DWORD ); typedef int ( WINAPI *MESSAGEBOXEX )( HWND , LPCSTR, LPCSTR, DWORD , WORD ); |
调入dll
查询函数接口
调用函数并卸载dll
结果:
注意点
假如在应用程序中用 LoadLibrary 函数装入某一个 DLL 前, 其他应用程序已把该 DLL 装入内存中了,则系统将不再装入该 DLL 的另一个实例,而是使该 DLL 的“引用计数”加 1 。
调用 FreeLibrary 首先使 DLL 的引用计数减 1,如果计数减为 0 则卸载该 DLL。
附:MessageBoxA语言问题
操作系统(英文系统)没装相关的语言包,不管怎么设置都是没用,即便是找到该函数也不行。
如果是中文系统,指定LANG_ENGLISH也会显示中文,估计字符集中已经包含了中文。
#include <windows.h> int main(int argc, char* argv[]) { ::MessageBoxEx(NULL,"LPCTSTR lpText 中D文?","LPCTSTR lpCaption",MB_OK,LANG_CHINESE);// MessageBoxEx( NULL, "string 中D文?", "title", MB_YESNO,MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US));
SetThreadLocale(MAKELANGID(LANG_ENGLISH,SUBLANG_DEFAULT)); MessageBoxEx( NULL, "string中D文?", "title", MB_RETRYCANCEL,MAKELANGID(LANG_ENGLISH, SUBLANG_DEFAULT));
system( "PAUSE" ); return 0; }
|