void Extract(WORD wResId , LPSTR lpszOutputPath)
{
HRSRC hrsrc = FindResource(NULL, MAKEINTRESOURCE(wResId) , RT_RCDATA);
HGLOBAL hLoaded = LoadResource( NULL,hrsrc);
LPVOID lpLock = LockResource( hLoaded);
DWORD dwSize = SizeofResource(NULL, hrsrc);
HANDLE hFile = CreateFile("C://Windows//Darek//mylo.txt",GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
DWORD dwByteWritten;
char* cRes = (char*)malloc (dwSize);
memset(cRes,0,dwSize);
memcpy (cRes, cData, dwSize);
cRes[dwSize] = '\0';
FreeResource(hLoaded);
WriteFile(hFile, lpLock , dwSize , &dwByteWritten , NULL);
CloseHandle(hFile);
FreeResource(hLoaded);
}
确定这会正确创建文件,但提取的数据似乎不会提取并写入textFile,有什么问题吗?我似乎不明白为什么它不提取并将数据写入文件。
请帮助。
答案 0 :(得分:1)
您正在分配一个与资源一样大的内存块,将其归零(这是多余的),并复制某些东西(E
指向什么?也许您的意思是cData
?进入那个内存,但是你忽略分配的内存并泄漏它。您正试图按原样将lpLock
的内容写入文件,这是您应该做的,但您根本没有进行任何错误处理。有可能,您的资源缺失,或者无法阅读。这会导致您的文件为空。
请改为尝试:
lpLock
如果我不得不猜测(请不要让人猜),void Extract(WORD wResId, LPSTR lpszOutputPath)
{
HRSRC hrsrc = FindResource(NULL, MAKEINTRESOURCE(wResId), RT_RCDATA);
if (!hrsrc)
{
// GetLastError() tells you why it failed...
return;
}
HGLOBAL hLoaded = LoadResource(NULL, hrsrc);
if (!hLoaded)
{
// GetLastError() tells you why it failed...
return;
}
DWORD dwSize = SizeofResource(NULL, hrsrc);
if ((dwSize == 0) && (GetLastError() != 0))
{
// GetLastError() tells you why it failed...
return;
}
LPVOID lpLock = LockResource(hLoaded);
if (!lpLock)
{
// GetLastError() tells you why it failed...
return;
}
HANDLE hFile = CreateFileA(lpszOutputPath, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile == INVALID_HANDLE_VALUE)
{
// GetLastError() tells you why it failed...
return;
}
DWORD dwByteWritten;
if (!WriteFile(hFile, lpLock, dwSize, &dwByteWritten, NULL))
{
// GetLastError() tells you why it failed...
CloseHandle(hFile);
DeleteFileA(lpszOutputPath);
return;
}
CloseHandle(hFile);
}
最有可能返回FindResource()
。确保第二个参数实际匹配NULL
的正确资源类型。您无法使用wResId
加载任何任意资源,您必须使用正确的资源类型。只能使用RT_RCDATA
参数值访问使用RCDATA
类型的资源。例如,可以使用RT_RCDATA
或RT_MESSAGETABLE
类型来存储字符串资源。您可以使用RT_STRING
和EnumResourceTypes()
或外部资源编辑器/查看器工具来查找EnumResourceNames()
资源实际使用的类型。