EXE 및 DLL에서 FindResource의 차이점

2821 단어 Filenulldllexe
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;

}

좋은 웹페이지 즐겨찾기