资源数据不写入TextFile

时间:2015-07-20 17:46:23

标签: c++ resources

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,有什么问题吗?我似乎不明白为什么它不提取并将数据写入文件。

请帮助。

1 个答案:

答案 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_RCDATART_MESSAGETABLE类型来存储字符串资源。您可以使用RT_STRINGEnumResourceTypes()或外部资源编辑器/查看器工具来查找EnumResourceNames()资源实际使用的类型。