如何读取.rc文件中DLGINIT结构体定义的字符串?

4

简而言之,如何在运行时通过编程访问已编译资源以从DLGINIT结构中提取字符串?

稍微详细一点...

在MFC应用程序中,可以将组合框定义为在对话框描述中使用COMBOBOX作为一行,并具有相应的DLGINIT结构,如下所示:

IDD_COMBOBOXTEST_DIALOG DIALOGEX 0, 0, 320, 200
STYLE DS_SETFONT | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU |     WS_THICKFRAME
EXSTYLE WS_EX_APPWINDOW
CAPTION "ComboBoxTest"
FONT 8, "MS Shell Dlg", 0, 0, 0x1
BEGIN
    DEFPUSHBUTTON   "OK",IDOK,209,179,50,14
    PUSHBUTTON      "Cancel",IDCANCEL,263,179,50,14
    COMBOBOX        IDC_COMBO1,22,20,132,30,CBS_DROPDOWN | CBS_SORT | WS_VSCROLL | WS_TABSTOP
    EDITTEXT        IDC_EDIT1,22,42,132,134,ES_MULTILINE | ES_AUTOHSCROLL | ES_READONLY
    PUSHBUTTON      "Load",IDC_BUTTON1,159,42,50,14
END

//...

IDD_COMBOBOXTEST_DIALOG DLGINIT
BEGIN
    IDC_COMBO1, 0x403, 4,  0    0x6e4f, 0x0065, 
    IDC_COMBO1, 0x403, 4,  0    0x7754, 0x006f, 
    0
END

我了解到Visual C++资源文件使用给定的代码页以单字节文本编码进行编码,该代码页位于资源文件顶部。我还学习了DLGINIT结构中的行按以下方式分解:

<CONTROL ID>, 0x403, <STRING LENGTH>, 0    <STRING BYTES ENCODED FOR CODE PAGE>

我想要做的是获取编译后的资源并提取出其中的字符串。有些API可以使用AfxFindResourceHandle来完成这种操作,但我不确定这是否是我需要采用的方法。

1个回答

1
据我所知,资源部分中对话框的布局方式是通过使用DLGTEMPLATEDLGITEMTEMPLATE手动创建对话框时所呈现的方式进行镜像。因此,请参考MSDN文档的该部分以解析它们。到目前为止,我只做了相反的事情(即从头开始在内存中创建这样的对话框模板)。
没有函数可以完成它,您必须手动完成。
此外,据我所知,DLGINIT甚至没有存储在PE文件中。我认为它仅仅存在于资源编辑器本身,但我不确定是否百分之百正确。

1
哎呀,那太糟糕了。这确实显示了MFC及其根源的年龄。 - Mike Caron
1
@Mike Caron:确实如此,是的,Win32是MFC的根源。我只是回答问题。请向微软提出投诉 :) - 0xC0000022L
请参考http://mihai-nita.net/2007/05/03/how-to-localize-an-rc-file/获取有用的信息。 - Dan Nissenbaum

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接