22.2.8 替换应用程序中对话框资源
Windows API中提供一组有关资源操作的函数,使用这组函数可以替换应用程序中的对话框资源。过程分为以下几个步骤。
(1)使用LoadLibrary()函数装载替换内容的可执行文件。
(2)使用FindResource()函数和LoadResource()函数查找定位并装载用于替换对话框资源。
(3)调用LockResource()函数获取对话框资源的数据指针。
(4)使用BeginUpdateResource()函数打开要更新的资源。
(5)使用UpdateResource()函数将用于替换的对话框资源复制到要替换的对话框资源。
(6)使用EndUpdateResource()函数完成替换。
下面以一个实例说明如何实现应用程序对话框的替换功能。在本例中,有两个应用程序RedDLL.exe和GreenDLL.exe,RedDLL.exe的关于对话框显示"这里是红色区域",而GreenDLL.exe的关于对话框显示"这里是绿色区域"。程序要做的工作就是将GreenDLL.exe中的关于对话框使用RedDLL.exe中的关于对话框替换。代码如下所示:
- void CDLLAppSampleDlg::OnButtonReplacedialog()
// 替换对话框资源 - {
- HRSRC hRes, hResLoad;
// 资源句柄 - HANDLE hExe, hUpdateExe;
// 句柄 - char *lpResLock;
// 资源锁 - BOOL bResult;
// 定义返回值 - hExe = LoadLibrary("RedDLL.exe");
// 装载RedDLL - if (hExe == NULL) WriteLog("装载可执行
文件失败!"); // 输出错误信息 - hRes = FindResource((HINSTANCE)hExe,
- MAKEINTRESOURCE(IDD_ABOUTBOX),
RT_DIALOG); // 查找资源 - if (hRes == NULL) WriteLog("无法查找要替
换的资源!"); // 输出错误信息 - hResLoad = (HRSRC)LoadResource((HINSTANCE
)hExe, hRes); // 装载资源 - if (hResLoad == NULL) WriteLog("无法装
载对话框!"); // 输出错误信息 - lpResLock = (char*)LockResource(hResLoad);
// 锁定资源 - if (lpResLock == NULL) WriteLog("无法锁定
对话框!"); // 输出错误信息 - hUpdateExe = (HRSRC)BeginUpdateResource
("GreenDLL.exe", false); -
// 装载GreenDLL - if (hUpdateExe == NULL) WriteLog("无法打
开要写入资源的文件!"); -
// 输出错误信息 - bResult = UpdateResource((HINSTANCE)
hUpdateExe, RT_DIALOG, - MAKEINTRESOURCE(IDD_ABOUTBOX),
- MAKELANGID(LANG_NEUTRAL,
SUBLANG_NEUTRAL), lpResLock, - SizeofResource((HINSTANCE)hExe, hRes));
// 替换资源 - if (bResult == false) WriteLog("替换资
源失败!"); // 输出错误信息 - if (!EndUpdateResource(hUpdateExe, false))
WriteLog("不能写入对文件 - 的修改!");
- if (!FreeLibrary((HINSTANCE)hExe))
WriteLog("释放文件失败!"); - }
除了前面提及的几个函数的使用,还要注意MAKEINTRESOURCE宏和MAKELANGID宏的使用,这些宏,实现从已知的宏转换成实际需要的值。程序运行的效果如图22-8所示。其中,第一幅图是没有替换对话框资源之前单击GreenDLL.exe程序的"关于"菜单项时,显示的对话框,其中显示的是"这里是绿色区域";而第二幅是替换对话框资源之后单击GreenDLL.exe程序的"关于"菜单项时,显示的对话框,其中显示的是"这里是红色区域"。
|
| (点击查看大图)图22-8 替换应用程序对话框运行效果图 |