轉載:https://blog.csdn.net/ithzhang/article/details/7995102html
在EXE和DLL中,FindResource的區別
post
如下的代碼在EXE中,執行無誤。但是在DLL中FindResource返回的值就爲0了,我用::GetLastError(),得出的值是1813,也就是取不到資源,這是爲何?spa
-
BOOL ExtractFile(char *szZlibFile,DWORD dwRID)
-
-
-
-
-
-
DWORD dwResSize =
0, dwBytesWrite =
0, dwBytesRead =
0;
-
PVOID pRsrc =
NULL, pConfigEncrypt =
NULL;
-
hRsrc = FindResource(
NULL, MAKEINTRESOURCE(dwRID),
"ZLIB");
-
-
-
MyDbgPrint(
"[ExtractFile] Locate Resource Error: %d\n", GetLastError());
-
-
-
-
dwResSize = SizeofResource(
NULL, hRsrc);
-
-
hGlobal = LoadResource(
NULL, hRsrc);
-
-
-
MyDbgPrint(
"[ExtractFile] Load Resource Error: %d\n", GetLastError());
-
-
-
-
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());
-
-
-
-
if( WriteFile( hFile, pRsrc, dwResSize, &dwBytesWrite,
NULL) == FALSE)
-
-
MyDbgPrint(
"[ExtractFile] Write %s File Error: %d\n", szZlibFile , GetLastError());
-
-
-
-
MyDbgPrint(
"[ExtractFile] Write %s File Success\n",szZlibFile);
-
-
-
問題出在FindResource的第一個參數取得的HINSTANCE句柄是EXE的HINSTANCE句柄,天然在其中也找不到在DLL中引入的ZLIB這個位圖ID了.同時SizeofResource,LoadResource中的第一個參數也應該是DLL的句柄..net
解決方法以下:code
-
BOOL ExtractFile(char *szZlibFile,DWORD dwRID)
-
-
-
-
-
-
-
-
-
-
DWORD dwResSize =
0, dwBytesWrite =
0, dwBytesRead =
0;
-
-
PVOID pRsrc =
NULL, pConfigEncrypt =
NULL;
-
-
HINSTANCE hInst = GetModuleHandle( dll的路徑 );
-
-
hRsrc = FindResource( hInst , MAKEINTRESOURCE(dwRID), (LPCTSTR)
"ZLIB");
-
-
-
-
-
-
-
-
-
-
dwResSize = SizeofResource( hInst , hRsrc);
-
-
hGlobal = LoadResource( hInst , hRsrc);
-
-
-
-
-
-
-
-
-
-
pRsrc = LockResource(hGlobal);
-
-
hFile = CreateFile( szZlibFile , GENERIC_ALL,
0,
NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL,
NULL);
-
-
if(hFile == INVALID_HANDLE_VALUE)
-
-
-
-
-
-
-
-
if( WriteFile( hFile, pRsrc, dwResSize, &dwBytesWrite,
NULL) == FALSE)
-
-
-
-
-
-
-
-
-
-
-
-