2015-07-20 50 views
0
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); 
} 

好吧,这会创建正确的文件,但提取的数据doesnt似乎提取并写入textFile,任何问题?我似乎不明白为什么它不提取并将数据写入文件。资源数据doesnt写入文本文件

请帮忙。

+0

至少'cRes [dwSize] ='\ 0';'是无效的,你没有分配足够的内存来做到这一点。但究竟是什么不起作用?没有写入文件?应该写入文件的内容以及写入文件的内容是什么? – wimh

+0

我试图从dll中复制数据的字节并写入文件(文本文件),以便在再次使用dll重试之前查看它是如何工作的 –

+0

并且没有任何内容写入文件。 –

回答

1

您正在分配一个与资源一样大的内存块,将它归零(这是多余的),然后复制一些东西(什么是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加载任何资源,必须使用正确的资源类型。仅可使用RT_RCDATA参数值访问使用RCDATA类型的资源。例如,可以使用RT_MESSAGETABLERT_STRING类型来存储字符串资源。您可以使用EnumResourceTypes()EnumResourceNames()或外部资源编辑器/查看器工具来查找wResId资源实际使用的类型。

+0

感谢它现在修复 –