FindResource 1813错误RC_DATA

时间:2014-12-24 10:34:30

标签: c++ c winapi resources

我想从资源文件中获取.png图像。

res.rc
    TEST_BKG RC_DATA "img\\mainwnd_bkg.png"

-

main.c
    HRSRC hRsrc = FindResource(NULL,(LPCSTR)"TEST_BKG", RT_RCDATA);

但我有1813错误:ERROR_RESOURCE_TYPE_NOT_FOUND


我创建了新文件并再次尝试使用BITMAP:

1 BITMAP "img/mainwnd_bkg.bmp"
2 RC_DATA "img/mainwnd_bkg.png"

的Src:

int main()
{
    HRSRC   hRsrc = FindResource(NULL,MAKEINTRESOURCE(1), BITMAP);
    if (!hRsrc)
        printf ("err");
    hRsrc = FindResource(NULL,MAKEINTRESOURCE(2), RT_RCDATA);
    if (!hRsrc)
        printf ("err2");
    getchar();
    return 0;
}

我只得到" err2"。

1 个答案:

答案 0 :(得分:4)

此错误条件表示在您指定的模块中没有具有ID和类型组合的资源。

最可能的解释是您正在使用UNICODE进行编译。因此,FindResource宏扩展为FindResourceW。这可以解释为什么你选择投射8位字符串。大概是编译器反对,你决定使用演员。

如果是这样,演员是错的。您使用的强制转换不会更改字符串的内容,它只是告诉编译器禁止类型检查。实际上,当你提供一种不同类型的数据时,你会告诉它你正在传递一种类型的数据。作为一个宽泛的规则,你应该避免施法。

通过传递宽字符串修复代码:

HRSRC hRsrc = FindResource(NULL, L"TEST_BKG", RT_RCDATA);

你可能更喜欢明确你所调用的函数并将其写成:

HRSRC hRsrc = FindResourceW(NULL, L"TEST_BKG", RT_RCDATA);

其他合理的解释是您没有链接已编译的资源,或者编译的资源以某种方式遗漏了您的RCDATA资源,或者提供给FindResource的模块句柄不正确。您可以使用资源查看器查看最终可执行文件的内容。