我正在尝试使用Win32 FindResource()函数将嵌入式资源加载到缓冲区中。 我在Visual Studio 2015 IDE中添加了资源编译时间:
正如您所看到的,使用像CFFexplorer或ResHacker这样的PE编辑器,可以正确添加资源:
当我尝试在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。 有什么想法没有设法加载资源? 谢谢
答案 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,解决了我的问题。