示例代码:
// 提取资源文件
BOOL ExtraceResourceFile(uint16_t resource_id, const TCHAR* output_file, TCHAR* type)
{
HANDLE hFile = NULL;
HANDLE hFilemap = NULL;
BOOL bRet = FALSE;
do
{
HINSTANCE hInstance = ::GetModuleHandleW(nullptr);
HRSRC hResource = FindResource(hInstance, MAKEINTRESOURCE(resource_id), type);
if (hResource == nullptr)
{
break;
}
HGLOBAL hFileResource = LoadResource(nullptr, hResource);
if (hFileResource == nullptr)
{
break;
}
LPVOID lpFile = LockResource(hFileResource);
if (lpFile == nullptr)
{
break;
}
uint32_t dwSize = SizeofResource(nullptr, hResource);
if (dwSize <= 0)
{
break;
}
hFile = CreateFile((LPCSTR)output_file, GENERIC_READ GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile == INVALID_HANDLE_VALUE)
{
break;
}
HANDLE hFilemap = CreateFileMapping(hFile, nullptr, PAGE_READWRITE, 0, dwSize, nullptr);
if (hFilemap == NULL)
{
break;
}
LPVOID lpBaseAddress = MapViewOfFile(hFilemap, FILE_MAP_WRITE, 0, 0, 0);
if (lpBaseAddress == NULL)
{
break;
}
CopyMemory(lpBaseAddress, lpFile, dwSize);
UnmapViewOfFile(lpBaseAddress);
bRet = TRUE;
} while (0);
if (hFilemap != NULL)
{
CloseHandle(hFilemap);
}
if (hFile != INVALID_HANDLE_VALUE && hFile != NULL)
{
CloseHandle(hFile);
}
return bRet;
}
使用方式:
// 写出资源文件
ExtraceResourceFile(IDR_AIR21, strAir2DllPath.GetString(), "AIR2");
资源如图所示存放:

Comments