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) ;
- windows程序设计学习笔记--动态链接库
- Windows程序设计-动态链接库
- Windows程序设计学习——动态链接库
- windows程序设计之动态链接库
- [NOTE] Windows&Linux动态链接库学习笔记
- 动态链接库学习笔记
- 动态链接库学习笔记
- Windows 32位汇编语言程序设计教程 之动态链接库
- Windows程序设计__孙鑫C++Lesson19《动态链接库》
- 《Windows程序设计》读书笔二十一 动态链接库
- Windows动态链接库编程笔记
- Windows程序设计学习笔记
- 学习笔记-动态链接
- 深入学习Windows动态链接库
- 深入学习Windows动态链接库
- Dll(动态链接库)学习笔记
- Dll(动态链接库)学习笔记
- Dll(动态链接库)学习笔记
- URL
- hdu 5750 Dertouzos(数论,打表,暴力)
- 多线程 —— 使用代码显式加锁
- python 增加csdn访问量升级
- 红黑树分析
- windows程序设计学习笔记--动态链接库
- Mybatis框架运行机制(增删改查,一对一,一对多,日志系统,单元测试,版本控制,缓存,动态Sql)
- python: ()&[ ]
- Linux系统调用:进程的终止
- POJ 2785 4 Values whose Sum is 0二分入门
- 解决Eclipse建立Maven项目后无法建立src/main/java资源文件夹的办法
- eclipse反编译插件jad环境配置
- Sudoku Solver
- 史上最具核心内容的五子棋核心代码------verision1.0