纯资源DLL的创建以及调用
在用千千静听听歌的时候,注意到其所有的资源(包括对话框、菜单、图标……)都放在一个ttpres.dll的动态库中,对这种用法一直很好奇,花了一天的时间终于弄明白了。
纯资源 DLL 是仅包含资源(如图标、位图、字符串和对话框)的 DLL。使用纯资源 DLL 是在多个程序之间共享同一组资源的好方法。提供其资源被针对多种语言进行本地化的应用程序也是一种好方法
创建纯资源 DLL
若要创建纯资源 DLL,请创建一个新的 Win32 DLL(非 MFC)项目,并将资源添加到此项目。
- 在“新建项目”对话框中选择“Win32 项目”,并在“Win32 项目向导”中指定 DLL 项目类型。
- 为 DLL 创建一个包含资源(如字符串或菜单)的新资源脚本,并保存该 .rc 文件。
- 在“项目”菜单上单击“添加现有项”,然后在项目中插入这个新的 .rc 文件。
- 指定 /NOENTRY 链接器选项。/NOENTRY 防止链接器将 _main 引用链接到 DLL 中;此选项是创建纯资源 DLL 所必需的。
- 生成 DLL。
使用纯资源 DLL 的应用程序应调用 LoadLibrary 来显式链接到 DLL。若要访问资源,请调用一般函数 FindResource 和 LoadResource,这两个函数对任何类型的资源都有效,或调用下列资源特定的函数之一:
- FormatMessage
- LoadAccelerators
- LoadBitmap
- LoadCursor
- LoadIcon
- LoadMenu
- LoadString
使用完资源后,应用程序应调用 FreeLibrary。
资源DLL的调用
对于部分资源动态库的调用,无非是通过获取获取DLL句柄,再通过DLL句柄以及资源ID获取资源句柄,以BMP为例,代码如下:
1 hmodule = LoadLibrary("ExtendDLL.dll"); //加载DLL并获取其句柄 2 HDC m_hdcMem; 3 m_hdcMem = CreateCompatibleDC(hdc); 4 BITMAP bm; 5 RECT rect; 6 7 HBITMAP hBitmap = LoadBitmap(hmodule,"DIB_BKGD_HF"); //获取BMP句柄 8 GetObject( hBitmap, sizeof BITMAP, &bm); 9 SelectObject( m_hdcMem, hBitmap); 10 GetClientRect( hWnd, &rect); 11 BitBlt(hdc,0,0,bm.bmWidth,bm.bmHeight,m_hdcMem,0,0,SRCCOPY); 12 ReleaseDC( hWnd, m_hdcMem ); 13 FreeLibrary(hmodule);
像千千静听那样使用的话就不需要这样了,它的全部资源都在DLL中,只要在程序窗口初始化前用AfxSetResourceHandle指定资源模块,并包含相应的DLL资源文件resource.h即可(修改为相同ID的资源也行),和正常创建一样使用,但是注意退出时释放DLL。具体不多说了,大家看代码!
纯资源对话框示例:ResDlgDemo.zip
浙公网安备 33010602011771号