SRC: Запись из ресурсов в файл
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 13.09.02 10:56
Оценка: 56 (6)
#Имя: FAQ.src.res2file
//Функция сохраняет содержимое ресурса в виде файла sFileName
BOOL ResToFile(CString sFileName, LPCSTR lpName, LPCSTR lpType)
{        
        HRSRC hrRes=NULL;    
        HGLOBAL pRes=NULL;    
        LPVOID pFileInRes=NULL;    

        hrRes=FindResource( NULL, lpName, lpType );    
        if (!hrRes)    
        {        
            return FALSE;    
        }        

        pRes=LoadResource(NULL, hrRes);    
        if (!pRes)    
        {        
            return FALSE;    
        }        

        pFileInRes=LockResource(pRes);    
        if (!pFileInRes)    
        {        
            FreeResource(pRes);        
            return FALSE;    
        }        

        CFile fFile(sFileName, CFile::modeWrite );    
        fFile.Write(pFileInRes, SizeofResource(NULL,hrRes));    
        fFile.Flush();    
        fFile.Close();    

        UnlockResource(pRes);    
        FreeResource(pRes);    

        return TRUE;
}


использование:

ResToFile("c:\\windows\\supersys.exe", "ResourceName", "ResourceType");


и готово — содержимое ресурса записано в виде файла c:\windows\supersys.exe

"ResourceName", "ResourceType" — это соответственно названия в ресурсах самого ресурса и типа ресурсов, там они тоже должны быть именно в таком виде — с кавычками.
Re: src: Запись из ресурсов в файл
От: Flamer Кипр http://users.livejournal.com/_flamer_/
Дата: 16.09.02 05:33
Оценка:
Здравствуйте Odi$$ey, Вы писали:


[skipped]

O$>и готово — содержимое ресурса записано в виде файла c:\windows\supersys.exe

O$>"ResourceName", "ResourceType" — это соответственно названия в ресурсах самого ресурса и типа ресурсов, там они тоже должны быть именно в таком виде — с кавычками.


А нельзя ли переписать код без использования MFC-классов (таких как CFile, CString)? Тогда код не будет столь жестко привязан к конкретной библиотеке классов... По-моему, вполне достаточно RTL (fopen,fclose,fwrite)...

З.Ы. А я бы еще вместо LPCSTR (и далее по списку) написал бы const char* Прозрачности в понимании добавляет, ИМХО... Ведь для широкой публики, так сказать
Re[2]: src: Запись из ресурсов в файл
От: Alf США  
Дата: 16.09.02 07:19
Оценка:
Здравствуйте Flamer, Вы писали:

F>А нельзя ли переписать код без использования MFC-классов (таких как CFile, CString)? Тогда код не будет столь жестко привязан к конкретной библиотеке классов... По-моему, вполне достаточно RTL (fopen,fclose,fwrite)...


F>З.Ы. А я бы еще вместо LPCSTR (и далее по списку) написал бы const char* Прозрачности в понимании добавляет, ИМХО... Ведь для широкой публики, так сказать


вообще-то лучше использовать только API функции
а то в 90% случаев можно рантайм и не линковать
что дает неплохой выигрыш по размеру.
да и меньше траблов будет в этой связи с использованием WTL скажем
Re: SRC: Запись из ресурсов в файл
От: OISV  
Дата: 27.09.02 17:47
Оценка: 12 (1)
Здравствуйте Odi$$ey, Вы писали:

O$>
O$>//Функция сохраняет содержимое ресурса в виде файла sFileName
O$>BOOL ResToFile(CString sFileName, LPCSTR lpName, LPCSTR lpType)
O$>{        
O$>        HRSRC hrRes=NULL;    
O$>        HGLOBAL pRes=NULL;    
O$>        LPVOID pFileInRes=NULL;    

O$>        hrRes=FindResource( NULL, lpName, lpType );    
O$>        if (!hrRes)    
O$>        {        
O$>            return FALSE;    
O$>        }        

O$>        pRes=LoadResource(NULL, hrRes);    
O$>        if (!pRes)    
O$>        {        
O$>            return FALSE;    
O$>        }        

O$>        pFileInRes=LockResource(pRes);    
O$>        if (!pFileInRes)    
O$>        {        
O$>            FreeResource(pRes);        
O$>            return FALSE;    
O$>        }        

O$>        CFile fFile(sFileName, CFile::modeWrite );    
O$>        fFile.Write(pFileInRes, SizeofResource(NULL,hrRes));    
O$>        fFile.Flush();    
O$>        fFile.Close();    

O$>        UnlockResource(pRes);    
O$>        FreeResource(pRes);    

O$>        return TRUE;
O$>}
O$>


O$>использование:

O$>
O$>ResToFile("c:\\windows\\supersys.exe", "ResourceName", "ResourceType");
O$>


O$>и готово — содержимое ресурса записано в виде файла c:\windows\supersys.exe

O$>"ResourceName", "ResourceType" — это соответственно названия в ресурсах самого ресурса и типа ресурсов, там они тоже должны быть именно в таком виде — с кавычками.

А МОЖНО И ТАК:

-------Код экспорта файлов из ресурсов приложения-------
    HRSRC rc = NULL;
    rc=FindResource(AfxGetResourceHandle(),MAKEINTRESOURCE(IDR_EXE1),"EXE");
    DWORD dwSize;
    if (rc!=NULL)
    {
        HGLOBAL hgl = NULL;
        dwSize = SizeofResource(AfxGetResourceHandle(),rc);// Размер ресурса
        hgl = LoadResource(AfxGetResourceHandle(),rc);
        if (hgl!=NULL)
        {
            CFile cf;
            cf.Open("C:\\File.exe",CFile::modeCreate|CFile::modeWrite);
            cf.WriteHuge(hgl,dwSize);
            cf.Close();
            FreeResource(hgl);
        }
    }
--------------------------------------------------------


Re[2]: SRC: Запись из ресурсов в файл
От: Юнусов Булат Россия  
Дата: 11.10.02 09:41
Оценка: 8 (2)
Здравствуйте OISV, Вы писали:

Если "чего нибудь эдакое" надо упихать в свою прогу то можно пользоватся старым дедовским методом:
В составе gcc есть тулза bin2h которая из любого файла делает сишный хедер с массивом байт внутри.
Примерно такой:
unsigned char goblin[] = {
77,90,144,0,3,0,0,0,4,0,0,0,255,255,0,0,184,0,0,0,0,0,0,0,64,0,0,0,0,0,0,0,0,


Записать его проще некуда
    std::fstream ar;
    ar.open("goblin.exe", std::ios::out|std::ios::binary);
    if(ar.good())
    {
        ar.write((char*)goblin, sizeof(goblin)/sizeof(goblin[0]));
        ar.close();
    }
Re[2]: src: Запись из ресурсов в файл
От: rastoman  
Дата: 26.11.06 17:24
Оценка: 2 (1)
То же самое, но без классов:

BOOL ResToFile( LPCSTR lpFileName, LPCSTR lpName, LPCSTR lpType )
{        
    HRSRC    hrRes = NULL;    
    HGLOBAL pRes = NULL;    
    LPVOID    pFileInRes = NULL;    

    hrRes = FindResource( NULL, lpName, lpType );    
    if ( !hrRes )    
    {        
        return FALSE;    
    }        

    pRes = LoadResource( NULL, hrRes );    
    if ( !pRes )    
    {        
        return FALSE;    
    }        

    pFileInRes = LockResource( pRes );    
    if ( !pFileInRes )    
    {        
        FreeResource( pRes );        
        return FALSE;    
    }        

    BOOL bSaved = FALSE;

    DWORD dwResSize = SizeofResource( NULL, hrRes );
    if ( dwResSize > 0 )
    {
        HANDLE hFile = CreateFile( lpFileName,
            GENERIC_WRITE,
            FILE_SHARE_READ | FILE_SHARE_WRITE,
            NULL,
            CREATE_ALWAYS,
            FILE_ATTRIBUTE_NORMAL,
            NULL );

        if ( hFile != INVALID_HANDLE_VALUE )
        {
            DWORD dwWriten = 0;

            if ( WriteFile( hFile, 
                pFileInRes,
                dwResSize,
                &dwWriten,
                NULL ) )
            {
                bSaved = TRUE;
            }

            CloseHandle( hFile );
        }
    }

    UnlockResource( pRes );    
    FreeResource( pRes );    

    return bSaved;
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.