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