读取mfc资源dll内容

时间:2015-03-09 09:16:11

标签: c# c++ dll mfc localization

作为我的自动化活动的一部分,我想比较两种不同语言的资源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。

1 个答案:

答案 0 :(得分:1)

我想您要检查对话框的所有资源组件(控件)是否存在。如果他们有正确的风格。

在C#中编写它可能比在C ++中编写这些东西更复杂;)

  1. 对于DLL1调用EnumResourceTypes,EnumResourceNames,EnumResourceLanguages来枚举所有资源。
  2. 为DLL2调用FindResource以使用相同的ID
  3. 获取资源
  4. 列出项目。获取指向两个DLL资源的指针
  5. 根据对话框的类型,您可以指向DLGTEMPLATEEXDLGTEMPLATE(请参阅第一个WORD中的签名)
  6. 现在遍历所有控件并比较类型和ID,您现在拥有DLGITEMTEMPLATEEXDLGITEMTEMPLATE元素。
  7. 比较这有点棘手,因为所有项目都是可变大小。

    我在一个类中直接在我的应用程序中使用它,它只在调试版本中执行。因此,在alpha和beta测试中,当资源不按预期运行时,我们立即得到断言。

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

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