来自资源数据的 C/C++ 消息框

Posted

技术标签:

【中文标题】来自资源数据的 C/C++ 消息框【英文标题】:C/C++ Messagebox from resource data 【发布时间】:2014-03-03 14:31:39 【问题描述】:

我正在尝试从资源中读取字符指针/字符串,然后从消息框中显示它。但是它似乎是空白的,我不知道我是否正确阅读。

这是我的资源:

这是我用来阅读它的代码:

void main()

    HGLOBAL G1, G2;

    HMODULE hMod = GetModuleHandle(NULL);

    G1 = LoadResource(hMod, FindResource(NULL, MAKEINTRESOURCE(RT_RCDATA), "RESOURCE1"));
    G2 = LoadResource(hMod, FindResource(NULL, MAKEINTRESOURCE(RT_RCDATA), "RESOURCE2"));

    //G1 = LoadResource(NULL, FindResource(NULL, "RCData", "RESOURCE1"));
    //G2 = LoadResource(NULL, FindResource(NULL, "RCData", "RESOURCE2"));

    MessageBoxA(NULL, (char*)LockResource(G1), (char*)LockResource(G1), MB_OK);
    MessageBoxA(NULL, (char*)LockResource(G2), (char*)LockResource(G2), MB_OK);


    /*char *strURL;
    HMODULE hModule = GetModuleHandle(NULL); 
    HRSRC hResource = FindResource(hModule, "RESOURCE1", "RCData"); //HRSRC hResource = FindResource(hModule, "RCData", "RESOURCE1"); 
    HGLOBAL hMemory = LoadResource(hModule, hResource);
    DWORD dwSize = SizeofResource(hModule, hResource);
    LPVOID lpAddress = LockResource(hMemory);

    memcpy(strURL, lpAddress, dwSize);

    MessageBoxA(0, strURL, strURL, MB_OK);*/

    ExitProcess(0);
    

注释部分是我尝试正确阅读的替代方法。出了什么问题?我知道RT_RCDATA 不正确,因为在资源中它显然是"RCDATA",但后来我也尝试在引号中仅使用LPCSTR,但这也无济于事。

另外,我没有释放资源(FreeResource),因为这是 MSDN 所说的:

此函数已过时,仅支持向后兼容 16 位 Windows。对于 32 位 Windows 应用程序,无需释放使用 LoadResource 加载的资源。

出了什么问题或我做错了什么?

编辑:错误的标签,因为显然我需要某种声誉来为此添加正确的标签,这对我来说绝对没有意义。

【问题讨论】:

MessageBox() 显示一个字符串。所以明智的做法是使用字符串表资源中的字符串。很难猜出你在那个 RCDATA 资源中塞进了什么。可能不是正确编码的以零结尾的 C 字符串。跳过错误检查也不正确。 你从哪里获得MessageBox API?我猜这不在 C 库中,也不在 C++ 中。不要将您编写的语言与您正在使用的工具混为一谈。 谢谢汉斯。我知道错误检查没有正确完成,但这不是重点。我还检查了G1G2 是否为空,它们是。但是我如何将这些字符串(或 char *)转换为 char 指针,这样我就可以将它们用于例如。显示消息框?您可以从存储字符串的图像中看到,但我的代码与它匹配吗?我相信没有,但还没有找到正确的方法。帮助或示例代码将不胜感激。 编辑: Jens:MessageBoxA 来自 Windows.h(winuser.h)。 您将需要添加错误检查。完成此操作后,您可以向我们报告哪个 API 调用失败。也不清楚文本是否以空值结尾。你确定是吗? 我使用 .NET 语言将其添加到那里,并且我正在使用 UpdateResourceW API 将其添加到那里,我不知道它是否为空终止。您能否向我展示一个示例代码,您如何将数据从 RCData 读取到 char* - 不知道它是否为空终止...? 【参考方案1】:

您可以像这样使用LoadString WinAPI:

HMODULE hMod = GetModuleHandle(NULL);
char myString[512];
LoadString(hMod, IDS_STRING101, myString, 512);
MessageBox(NULL, myString, "", MB_OK);

IDS_STRING101 已在您的 .rc 文件中定义

【讨论】:

谢谢,但这并不能回答我的问题。我正在尝试从我链接的图像中可以看到的资源中加载字符串;这是RCData目录。

以上是关于来自资源数据的 C/C++ 消息框的主要内容,如果未能解决你的问题,请参考以下文章

如何在 linux 中显示来自 bash 脚本的 GUI 消息框?

如何将 CEdit 类型的数据转换为 CString 类型的数据以及如何在消息框中显示? [复制]

selenium 消息框元素定位处理

如何在消息框中显示来自 C# 的带有 WCHAR* 的 C 函数

怎么将java web项目出错中弹出的来自网页信息框关掉!

抑制消息框 R6025 纯虚函数调用