windows程序设计学习笔记--动态链接库

来源:互联网 发布:java 集合框架详解 编辑:程序博客网 时间:2024/05/21 22:23

动态链接库是包含许多函数的独立文件,这些函数可以被应用程序和其他DLL调用以完成某些特定的工作。
一个动态链接库只有在另一个模块调用其包含的函数时,才被启动。

动态链接:程序运行时,把模块中函数调用链接到库模块实际函数。
静态链接:开发中。把一些文件链接在一起创建可执行文件。

一些动态链接库只含资源。

动态链接库模块可有任何扩展名,但标准扩展名是DLL。只有扩展名为.DLL的动态链接库才能被windows操作系统自动加载。

如文件有另外的扩展名,则程序须明确的用LoadLibrary,LoadLibraryEx来加载。

对象库:
一个扩展名为.LIB的文件。文件代码在运行链接器进行静态链接时被添加到.EXE文件中。

导入库:
特殊的对象库。扩展名.LIB。
导入库不包含代码,只给链接器提供信息,来建立用于动态链接的表格。

对象库和导入库都是静态链接的。当一个用动态库的程序运行时,该库须在磁盘上。库文件须放在 .EXE所在目录,当前目录,windows系统目录 三者之一中。

动态链接库里涉及字符串处理函数要考虑应对UNICODE和非UNICODE情形。
1.在库的头文件定义

#ifdef __cplusplus#define EXPORT extern "C" __declspec (dllexport)#else#define EXPORT __declspec (dllexport)#endif

在库中函数前加上 EXPORT 表示此函数可以提供给其他模块使用。

// 库开始和终止时,DllMain都被调用int WINAPI DllMain (HINSTANCE hInstance, DWORD fdwReason, PVOID pvReserved){    ..}

hInstance:库的实例句柄
pvReserved:系统保留参数。
fdwReason:说明Windows调用DllMain函数的原因。
DLL_PROCESS_ATTACH:动态链接库已被映射到一个进程的地址空间。
成功,返回非0
失败,返回0
DLL_PROCESS_DETACH:进程不再需要该DLL了。

DLL_THREAD_ATTACH:关联的进程创建了一个新的线程
DLL_THREAD_DETACH:线程终止。

多个进程可以共享动态链接库中相同的代码。DLL维护的数据对每个进程都是不样的。

// 定义一个新的窗口消息,保证此消息在系统中是独一的// 消息值可用来发送和邮寄信息UINT WINAPI RegisterWindowMessage(  _In_ LPCTSTR lpString);

参数解释:
lpString:被注册的消息

返回值:
如果消息被成功注册, 返回值是消息标识符。
取值范围:[0xC000, 0xFFFF]。
如果消息注册失败,返回0

额外
仅仅用此函数,当多个应用必须处理相同消息时
在一个窗口类里发生私有消息,应用可以使用任何范围在[WM_USER,0x7FFF]内的整数
[WM_USER,0x7FFF]范围内的消息是窗口类私有的,非应用私有
一些预定义控件的消息应该就是此范围内的

// 设置对话框子控件允许输入最大字符数
SendDlgItemMessage (hDlg, IDC_STRING, EM_LIMITTEXT, MAX_LENGTH, 0);
// 获取对话框子控件内文本
GetDlgItemText (hDlg, IDC_STRING, szString, MAX_LENGTH) ;

// 放消息在消息队列,队列关联与线程,创建指定窗口的线程。不需要等到线程处理消息,立刻返回BOOL WINAPI PostMessage(  _In_opt_ HWND   hWnd,  _In_     UINT   Msg,  _In_     WPARAM wParam,  _In_     LPARAM lParam);

参数解释:
hWnd:窗口句柄。他的窗口过程将取得此消息。
若为 HWND_BOARDCAST,消息被投递给所有系统里的顶级窗口。
若为NULL, 消息投给线程窗口过程。

Win32进程的地址空间 内的数据,其他进程看不见。
在多个进程间共享数据:
把要共享的数据放入同一分区:

#pragma data_seg ("shared")// 分区内数据需要初始化int   iTotal = 0 ;WCHAR szStrings [MAX_STRINGS][MAX_LENGTH + 1] = { '\0' } ;#pragma data_seg ()// 通知链接器此分区的属性:可读,可写,可共享#pragma comment(linker,"/SECTION:shared,RWS")

对使用前不知道名字的库模块,无法在项目属性设置对此库的依赖时,或希望使用库的资源时,用此库:

typedef BOOL (WINAPI * PFNRECT) (HDC, int, int, int, int);HANDLE hLibrary;PFNRECT pfnRectangle;// 实例句柄hLibrary = LoadLibrary(TEXT("GDI32.DLL"));  pfnRectangle = (PFNRECT)GetProcAddress(hLibrary, TEXT("Rectangle"));pfnRectangle(hdc, xLeft, xTop, xRight, yBottom);FreeLibrary(hLibrary);

还可以通过库的实例句柄,获取库里的资源。如位图等。


字符转换
1.从CHAR到WCHAR

iLength = MultiByteToWideChar (CP_ACP, 0, pStringIn, -1, NULL, 0) ;pWideStr = malloc (iLength*2) ;MultiByteToWideChar (CP_ACP, 0, pStringIn, -1, pWideStr, iLength) ;

2.从WCHAR到CHAR

  iLength = WideCharToMultiByte (CP_ACP, 0, szStrings[i], -1, NULL, 0, NULL, NULL) ; pAnsiStr = malloc (iLength) ; WideCharToMultiByte (CP_ACP, 0, szStrings[i], -1, pAnsiStr, iLength, NULL, NULL) ;
0 0
原创粉丝点击