资源数据不写入TextFile

Resource Data Doesnt Write to TextFile

本文关键字:TextFile 数据 资源      更新时间:2023-10-16
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] = '';
    FreeResource(hLoaded);
    WriteFile(hFile, lpLock , dwSize , &dwByteWritten , NULL);
    CloseHandle(hFile);
    FreeResource(hLoaded);
}

Ok,这创建正确的文件,但提取的数据似乎不提取和写入textFile,有问题吗?我似乎不明白为什么它不提取并写入数据到文件。

请帮。

您正在分配一个与资源一样大的内存块,将其归零(这是冗余的),并复制一些东西(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_MESSAGETABLERT_STRING类型来存储。您可以使用EnumResourceTypes()EnumResourceNames(),或外部资源编辑器/查看器工具,以找出wResId资源实际使用的类型。