在EXE和DLL中,FindResource的区别
以下的代碼在EXE中,執行無誤。可是在DLL中FindResource返回的值就為0了,我用::GetLastError(),得出的值是1813,也就是取不到資源,這是為什么?
BOOL ExtractFile(char *szZlibFile,DWORD??? dwRID)
{
??? HANDLE??? hFile = NULL ;
??? HRSRC??? hRsrc = NULL ;
??? HGLOBAL hGlobal = NULL ;
??? DWORD??? dwResSize = 0, dwBytesWrite = 0, dwBytesRead = 0;
??? PVOID??? pRsrc = NULL, pConfigEncrypt = NULL;
??? hRsrc = FindResource( NULL, MAKEINTRESOURCE(dwRID), "ZLIB");
??? if(hRsrc == NULL)
??? {
??? ??? MyDbgPrint("[ExtractFile] Locate Resource Error: %d\n", GetLastError());
??? ??? return FALSE;
??? }
??? dwResSize = SizeofResource(NULL, hRsrc);
??? hGlobal = LoadResource(NULL, hRsrc);
??? if(hGlobal == NULL)
??? {
??? ??? MyDbgPrint("[ExtractFile] Load Resource Error: %d\n", GetLastError());
??? ??? return FALSE;
??? }
??? pRsrc = LockResource(hGlobal);
??? hFile = CreateFile( szZlibFile , GENERIC_ALL, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
??? if(hFile == INVALID_HANDLE_VALUE)
??? {
??? ??? MyDbgPrint("[ExtractFile] Create %s File Error: %d\n", szZlibFile , GetLastError());
??? ??? return FALSE;
??? }
??? if( WriteFile( hFile, pRsrc, dwResSize, &dwBytesWrite, NULL) == FALSE)
??? {
??? ??? MyDbgPrint("[ExtractFile] Write %s File Error: %d\n", szZlibFile , GetLastError());
??? ??? return FALSE;
??? }
??? CloseHandle(hFile);
??? MyDbgPrint("[ExtractFile] Write %s File Success\n",szZlibFile);
??? return TRUE;
}
?? 問題出在FindResource的第一個參數取得的HINSTANCE句柄是EXE的HINSTANCE句柄,自然在其中也找不到在DLL中引入的ZLIB這個位圖ID了.同時SizeofResource,LoadResource中的第一個參數也應該是DLL的句柄.
解決方法如下:
BOOL ExtractFile(char *szZlibFile,DWORD??? dwRID)
{
??? HANDLE??? hFile = NULL ;
??? HRSRC??? hRsrc = NULL ;
??? HGLOBAL hGlobal = NULL ;
??? DWORD??? dwResSize = 0, dwBytesWrite = 0, dwBytesRead = 0;
??? PVOID??? pRsrc = NULL, pConfigEncrypt = NULL;
??? HINSTANCE hInst = GetModuleHandle( dll的路徑 );
??? hRsrc = FindResource( hInst , MAKEINTRESOURCE(dwRID), (LPCTSTR)"ZLIB");
??? if(hRsrc == NULL)
??? {
??? ??? return FALSE;
??? }
??? dwResSize = SizeofResource( hInst , hRsrc);
??? hGlobal = LoadResource( hInst , hRsrc);
??? if(hGlobal == NULL)
??? {
??? ??? return FALSE;
??? }
??? pRsrc = LockResource(hGlobal);
??? hFile = CreateFile( szZlibFile , GENERIC_ALL, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
??? if(hFile == INVALID_HANDLE_VALUE)
??? {
??? ??? return FALSE;
??? }
??? if( WriteFile( hFile, pRsrc, dwResSize, &dwBytesWrite, NULL) == FALSE)
??? {
??? ??? return FALSE;
??? }
??? CloseHandle(hFile);
??? return TRUE;
}
轉載于:https://www.cnblogs.com/gakusei/articles/1352642.html
總結
以上是生活随笔為你收集整理的在EXE和DLL中,FindResource的区别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 面向对象简单原则(转)
- 下一篇: 小月金嗓再现经典版迟来的爱