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

动态链接库是包含许多函数的独立文件,这些函数可以被应用程序和其他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) ;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

raindayinrain

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值