EXE 및 DLL에서 FindResource의 차이점
다음 코드는 EXE에서 올바르게 실행됩니다.그러나 DLL에서 Find Resource가 되돌아오는 값은 0입니다. 저는: Get Last Error () 를 사용합니다. 얻은 값은 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
", GetLastError());
return FALSE;
}
dwResSize = SizeofResource(NULL, hRsrc);
hGlobal = LoadResource(NULL, hRsrc);
if(hGlobal == NULL)
{
MyDbgPrint("[ExtractFile] Load Resource Error: %d
", 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
", szZlibFile , GetLastError());
return FALSE;
}
if( WriteFile( hFile, pRsrc, dwResSize, &dwBytesWrite, NULL) == FALSE)
{
MyDbgPrint("[ExtractFile] Write %s File Error: %d
", szZlibFile , GetLastError());
return FALSE;
}
CloseHandle(hFile);
MyDbgPrint("[ExtractFile] Write %s File Success
",szZlibFile);
return TRUE;
}
문제는 Find Resource의 첫 번째 매개 변수에서 얻은 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;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
java에서 InputStream, String, File 간의 상호 전환 비교InputStream, String, File 상호 전환 1. String --> InputStream 2. InputStream --> String 오늘 인터넷에서 또 다른 방법을 보았는데, 특별히 가지고 와서 공...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.