转载: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)
-
-
-
-
-
-
-
-
-
-
-
-