读取mfc资源dll内容

Reading mfc resource dll content

作为自动化的一部分 activity,我想比较两个不同 languages.i.e 的资源 dll 内容。以下英文资源内容:

 IDD_DIALOG_M DIALOGEX 0, 0, 474, 278 STYLE DS_SETFONT | DS_FIXEDSYS |
 WS_CHILD | WS_CAPTION | WS_SYSMENU CAPTION "I AM DIALOG" FONT 8, "MS
 Shell Dlg", 400, 0, 0x1 BEGIN  END

中文资源内容变为:

 IDD_DIALOG_M DIALOGEX 0, 0, 474, 278 STYLE DS_SETFONT | DS_FIXEDSYS |
 WS_CHILD | WS_CAPTION | WS_SYSMENU CAPTION "我是DIALOG" FONT 8, "MS
 Shell Dlg", 400, 0, 0x1 BEGIN  END

我将用 C# 或任何特定语言编写一个工具,并将提供两个本地化 dll 作为输入。一个工具将比较两个资源,如果找到匹配项,则传递两个 dll。

我想您想检查对话框的所有资源组件(控件)是否存在。以及他们是否有正确的样式。

用 C# 编写可能比用 C++ 编写更复杂 ;)

  1. 对于 DLL1 调用 EnumResourceTypes、EnumResourceNames、EnumResourceLanguages 来枚举所有资源。
  2. 调用DLL2的FindResource查找相同ID的资源
  3. 列表项。获取指向两个 DLL 的资源的指针
  4. 根据对话框的类型,您有指向 DLGTEMPLATEEX or DLGTEMPLATE 的指针(请参阅第一个 WORD 中的签名)
  5. 现在遍历所有控件并比较类型和 ID,您现在有 DLGITEMTEMPLATEEX or DLGITEMTEMPLATE 个元素。

比较这个有点棘手,因为所有项目的大小都是可变的。

我在我的应用程序中直接在 class 中有相同的内容,它只在调试版本中执行。因此,在 alpha 和 beta 测试中,当资源未按预期运行时,我们会立即得到断言。

检查时忽略控件的位置是有意义的。但重要的是 class 名称和样式(style/exStyle 成员),因为它们对控件的行为有深远的影响。

提示:我们使用一个名为 RC-WinTrans 的特殊翻译程序。使用此工具,我们将所有 RC 文件从一种语言翻译成第二种语言。而且我们总是得到正确格式的 RC 文件,并且可以轻松地创建相应的卫星 DLL。