来自资源数据的 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++ 中。不要将您编写的语言与您正在使用的工具混为一谈。
谢谢汉斯。我知道错误检查没有正确完成,但这不是重点。我还检查了G1
或G2
是否为空,它们是。但是我如何将这些字符串(或 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 类型的数据以及如何在消息框中显示? [复制]