c++ visual studio 资源
c++ visual studio resources
我正在尝试在资源文件 .rc 中实现字符串 Table,然后使用函数 CString::LoadStringW() 加载特定字符串。
这是代码 main.cpp:
#ifndef _AFXDLL
#define _AFXDLL
#endif
#include <afx.h>
#include <stdio.h>
#include "resource.h"
int main()
{
printf("Code Example: Load resource file data\n");
CString sentence;
sentence.LoadStringW(IDS_STRING101);
printf("Sentence: %s", sentence);
getchar();
return 0;
}
已经有很好的link有说明,如何使用资源文件如:
http://www.cplusplus.com/forum/windows/119338/
http://www.winprog.org/tutorial/resources.html
问题是当我编译代码然后尝试 运行 时,它没有读取字符串。
调试时,带有 LoadStringW() 函数的行抛出断言错误:
Debug Assertion Failed!
Program: C:\WINDOWS\SYSTEM32\mfc140ud.dll
File: f:\dd\vctools\vc7libs\ship\atlmfc\include\afxwin1.inl
Line: 24
For information on how your program can cause an assertion
failure, see the Visual C++ documentation on asserts.
最后URL我提供的是(作为最后一步)link编译的资源文件.rc和我的源文件main.cpp。
我不确定该怎么做,也许这就是我的程序无法按预期运行的原因。
请问您有什么建议吗?
我正在试用 MSVS 2015 / 2017。
谢谢。
一段时间后,我仍然无法解释为什么有问题的代码不起作用。然而,为了从 String Table 读取字符串资源,我使用了不同的函数 LoadString()
并最终使其工作,这实际上不是 CString
class.
的一部分
通过获取包含这些资源的 运行.exe 文件的句柄解决了 NULL 资源处理程序的问题(验证包含哪些资源的好工具是 Resource Hacker)- 完成 GetModuleHandle(NULL)
下面是工作代码片段。
main.cpp:
#include <afx.h>
#include <stdio.h>
#include "resource.h"
#define BUF_SIZE 50
int main(void)
{
printf("Code Example: Load resource file data\n");
wchar_t buffer[BUF_SIZE];
if (!LoadString(GetModuleHandle(NULL), IDS_STRING104, buffer, BUF_SIZE))
{
printf("Error Loading String: IDS_STRING104\n");
}
else
{
printf("resource string: %ls\n", buffer);
}
getchar();
return 0;
}
resource.h:
#define IDS_STRING103 103
#define IDS_STRING104 104
Resource.rc:
#include "resource.h"
STRINGTABLE
BEGIN
IDS_STRING103 "Resource 103 sentence"
IDS_STRING104 "Resource 104 sentence"
END
这里有一些对我有用的参考:
How to get my own code's module handle?
https://msdn.microsoft.com/en-gb/library/windows/desktop/ms647486.aspx
我正在尝试在资源文件 .rc 中实现字符串 Table,然后使用函数 CString::LoadStringW() 加载特定字符串。 这是代码 main.cpp:
#ifndef _AFXDLL
#define _AFXDLL
#endif
#include <afx.h>
#include <stdio.h>
#include "resource.h"
int main()
{
printf("Code Example: Load resource file data\n");
CString sentence;
sentence.LoadStringW(IDS_STRING101);
printf("Sentence: %s", sentence);
getchar();
return 0;
}
已经有很好的link有说明,如何使用资源文件如:
http://www.cplusplus.com/forum/windows/119338/
http://www.winprog.org/tutorial/resources.html
问题是当我编译代码然后尝试 运行 时,它没有读取字符串。 调试时,带有 LoadStringW() 函数的行抛出断言错误:
Debug Assertion Failed!
Program: C:\WINDOWS\SYSTEM32\mfc140ud.dll
File: f:\dd\vctools\vc7libs\ship\atlmfc\include\afxwin1.inl
Line: 24
For information on how your program can cause an assertion
failure, see the Visual C++ documentation on asserts.
最后URL我提供的是(作为最后一步)link编译的资源文件.rc和我的源文件main.cpp。 我不确定该怎么做,也许这就是我的程序无法按预期运行的原因。
请问您有什么建议吗?
我正在试用 MSVS 2015 / 2017。
谢谢。
一段时间后,我仍然无法解释为什么有问题的代码不起作用。然而,为了从 String Table 读取字符串资源,我使用了不同的函数 LoadString()
并最终使其工作,这实际上不是 CString
class.
通过获取包含这些资源的 运行.exe 文件的句柄解决了 NULL 资源处理程序的问题(验证包含哪些资源的好工具是 Resource Hacker)- 完成 GetModuleHandle(NULL)
下面是工作代码片段。
main.cpp:
#include <afx.h>
#include <stdio.h>
#include "resource.h"
#define BUF_SIZE 50
int main(void)
{
printf("Code Example: Load resource file data\n");
wchar_t buffer[BUF_SIZE];
if (!LoadString(GetModuleHandle(NULL), IDS_STRING104, buffer, BUF_SIZE))
{
printf("Error Loading String: IDS_STRING104\n");
}
else
{
printf("resource string: %ls\n", buffer);
}
getchar();
return 0;
}
resource.h:
#define IDS_STRING103 103
#define IDS_STRING104 104
Resource.rc:
#include "resource.h"
STRINGTABLE
BEGIN
IDS_STRING103 "Resource 103 sentence"
IDS_STRING104 "Resource 104 sentence"
END
这里有一些对我有用的参考:
How to get my own code's module handle?
https://msdn.microsoft.com/en-gb/library/windows/desktop/ms647486.aspx