从Windows模块中的资源中提取文件

时间:2012-07-09 01:25:16

标签: c++ windows winapi extract embedded-resource

以下代码执行,但它只提取一个空位图文件。关于它有什么问题的任何想法?

void Extract(WORD wResId , LPSTR lpszOutputPath)
{ //example: Extract(IDB_BITMAP1, "Redrose.bmp");
    HRSRC hrsrc = FindResource(NULL, MAKEINTRESOURCE(wResId) , RT_BITMAP);
    HGLOBAL hLoaded = LoadResource( NULL,hrsrc);
    LPVOID lpLock =  LockResource( hLoaded);
    DWORD dwSize = SizeofResource(NULL, hrsrc);
    HANDLE hFile = CreateFile  (lpszOutputPath,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
    DWORD dwByteWritten;
    WriteFile(hFile, lpLock , dwSize , &dwByteWritten , NULL);
    CloseHandle(hFile);
    FreeResource(hLoaded);
}

3 个答案:

答案 0 :(得分:4)

您要求RT_RCDATA,但我打赌您没有通过RCDATA语句添加位图。您可能通过BITMAP语句添加了它,使其成为RT_BITMAP

将来,请说明哪一步失败而不是让人猜测。

答案 1 :(得分:0)

问题在于将NULL作为HINSTANCE参数传递给FindResourceLoadResourceSizeOfResource

如果你在启动期间(从WinMain或DllMain)尚未保存你的HINSTANCE,你可以使用它来获取它:

MFC:

HINSTANCE hInstance = AfxGetInstanceHandle();

否则:

HINSTANCE hInstance = (HINSTANCE)GetModuleHandle(NULL);

答案 2 :(得分:0)

将原始文件作为自定义数据插入。 为此自定义数据提供文本名称,例如“MyType”,然后:

HRSRC hrsrc = FindResource(NULL, MAKEINTRESOURCE(wResId) , _T("MyType"));