您的位置:首页 > 其它

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

2016-07-24 10:29 274 查看
动态链接库是包含许多函数的独立文件,这些函数可以被应用程序和其他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) ;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: