设为首页 加入收藏

TOP

22.2.8 替换应用程序中对话框资源
2013-10-07 13:10:51 来源: 作者: 【 】 浏览:64
Tags:22.2.8 替换 应用程序 对话 资源

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中的关于对话框替换。代码如下所示:

  1. void CDLLAppSampleDlg::OnButtonReplacedialog()  
    // 替换对话框资源  
  2. {  
  3.     HRSRC hRes, hResLoad;                       
    // 资源句柄  
  4.     HANDLE hExe, hUpdateExe;                    
    // 句柄  
  5.     char *lpResLock;                          
    // 资源锁  
  6.     BOOL bResult;                              
    // 定义返回值  
  7.     hExe = LoadLibrary("RedDLL.exe");           
    // 装载RedDLL  
  8.     if (hExe == NULL)  WriteLog("装载可执行
    文件失败!");  // 输出错误信息  
  9.     hRes = FindResource((HINSTANCE)hExe,  
  10.             MAKEINTRESOURCE(IDD_ABOUTBOX),
    RT_DIALOG); // 查找资源  
  11.     if (hRes == NULL) WriteLog("无法查找要替
    换的资源!");  // 输出错误信息  
  12.     hResLoad = (HRSRC)LoadResource((HINSTANCE
    )hExe, hRes);  // 装载资源  
  13.     if (hResLoad == NULL)   WriteLog("无法装
    载对话框!"); // 输出错误信息  
  14.     lpResLock = (char*)LockResource(hResLoad);    
    // 锁定资源  
  15.     if (lpResLock == NULL)  WriteLog("无法锁定
    对话框!");   // 输出错误信息  
  16.     hUpdateExe = (HRSRC)BeginUpdateResource
    ("GreenDLL.exe", false);  
  17.                                                
    // 装载GreenDLL  
  18.     if (hUpdateExe == NULL)  WriteLog("无法打
    开要写入资源的文件!");  
  19.                                                
    // 输出错误信息  
  20.     bResult = UpdateResource((HINSTANCE)
    hUpdateExe, RT_DIALOG,  
  21.          MAKEINTRESOURCE(IDD_ABOUTBOX),  
  22.         MAKELANGID(LANG_NEUTRAL, 
    SUBLANG_NEUTRAL), lpResLock,  
  23.     SizeofResource((HINSTANCE)hExe, hRes));   
    // 替换资源  
  24.     if (bResult == false)  WriteLog("替换资
    源失败!");     // 输出错误信息  
  25.     if (!EndUpdateResource(hUpdateExe, false))
    WriteLog("不能写入对文件  
  26.     的修改!");  
  27.     if (!FreeLibrary((HINSTANCE)hExe)) 
    WriteLog("释放文件失败!");  

除了前面提及的几个函数的使用,还要注意MAKEINTRESOURCE宏和MAKELANGID宏的使用,这些宏,实现从已知的宏转换成实际需要的值。程序运行的效果如图22-8所示。其中,第一幅图是没有替换对话框资源之前单击GreenDLL.exe程序的"关于"菜单项时,显示的对话框,其中显示的是"这里是绿色区域";而第二幅是替换对话框资源之后单击GreenDLL.exe程序的"关于"菜单项时,显示的对话框,其中显示的是"这里是红色区域"。

 
(点击查看大图)图22-8  替换应用程序对话框运行效果图
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇22.2.11 禁止使用Alt+F4键关闭窗.. 下一篇22.2.7 使用模块对话框资源

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: