尽管资源存在,但FindResource()函数失败

时间:2016-01-28 13:28:17

标签: c++ runtime-error embedded-resource

我正在尝试使用Win32 FindResource()函数将嵌入式资源加载到缓冲区中。 我在Visual Studio 2015 IDE中添加了资源编译时间:

enter image description here

正如您所看到的,使用像CFFexplorer或ResHacker这样的PE编辑器,可以正确添加资源: enter image description here

当我尝试在DLL项目开始时使用FindResource()函数在运行时加载它时出现问题:

  INT WINAPI DllMain( HINSTANCE hInstDLL, DWORD dwReason, LPVOID lpReserved )
{
    HRSRC ResLocation = 0;

    switch( dwReason ) 
    { 
        case DLL_PROCESS_ATTACH:

            // Show debug console
            AllocConsole();
            freopen("CONOUT$", "w", stdout);  

            //Locate our resource
            ResLocation = FindResource(hInstDLL, "RESFILE", "RESFILE");

            // FindResource returns NULL with error 1813: ERROR_RESOURCE_TYPE_NOT_FOUND
            printf("TEST RESULT: reslocation: %i error %i\n", ResLocation, GetLastError());

            StartProc();
            break;
        case DLL_PROCESS_DETACH:
            break;
        case DLL_THREAD_ATTACH:
            break;
        case DLL_THREAD_DETACH:
            break;
    }
    return 1;
}

FindResource返回NULL,错误为1813:ERROR_RESOURCE_TYPE_NOT_FOUND。 有什么想法没有设法加载资源? 谢谢

3 个答案:

答案 0 :(得分:0)

看起来你的第三个参数是错误的。

来自MSDN:

HRSRC WINAPI FindResource(
  _In_opt_ HMODULE hModule,
  _In_     LPCTSTR lpName,
  _In_     LPCTSTR lpType
);
  

lpType [in]

     

资源类型。或者,而不是   一个指针,这个参数可以是MAKEINTRESOURCE(ID),其中ID是   给定资源类型的整数标识符。对于标准资源   类型,请参阅Resource Types。有关更多信息,请参阅备注   以下部分。

使用上面的链接查找您的资源类型并使用它而不是“RESFILE”。

E.g。

ResLocation = FindResource(hInstDLL, "RESFILE", MAKEINTRESOURCE(RT_VERSION));

答案 1 :(得分:0)

FindResource()/ LoadResource()是AFAIK无法查找/加载整个资源“文件”(事实上没有这样的文件,资源嵌入在dll中),但是一个特定的资源(字符串,资源src文件指定的位图,图标等。

“RESFILE”不是允许的资源类型,列表请参见ResourceTypes

答案 2 :(得分:0)

我发现了问题所在。

还有另一个可执行文件在运行时在同一个dll上编写了另一个资源。 它是使用BeginUpdateResource()完成的。

问题是BeginUpdateResource()第二个参数,它被设置为true:添加新资源时,它会删除我在设计时添加的旧资源。将此参数设置为false,解决了我的问题。

相关问题