Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   UpdateResource делает .exe некорректным (http://forum.oszone.net/showthread.php?t=244019)

.Rock. 05-10-2012 18:28 2000111

UpdateResource делает .exe некорректным
 
Здравствуйте. Понадобилось записать ресурсы, необходимые для работы приложения, в исполняемый файл этого приложения.
Возникла проблема - exeшник, в который пытаюсь записать ресурс, после отработки программы записи уменьшается с 1.04 Мб до 585 Кб и не запускается ("Не является приложением win32").
Сама программа записи ресурсов работает без явных ошибок ( код ниже ).
Файлы "new.bmp", "winapi_test.exe" лежат в папке с программой.
Код:

    #include <windows.h>
    #include <stdio.h>
    #include <iostream>
   
    int ReplaceBitmap(int Number)
    {
   
    // Переменные для чтения и добавления ресурса
    DWORD dwResSize, dwRead;
    HANDLE File,hUpdateRes;
   
    // Открываем файл для дальнейшего чтения (файл new.bmp)
    File = CreateFile("new.bmp", GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    // Если открыть не удалось, то выходим
    if(File == INVALID_HANDLE_VALUE) return FALSE;
   
    // Сохраняем его размер исключив BITMAPFILEHEADER (для остальных ресурсов, исключать размер заголовка не нужно)
    dwResSize = GetFileSize(File, NULL)-sizeof(BITMAPFILEHEADER);
    // Если не удалось получить размер, то выходим
    if(dwResSize <= NULL)
    {
    // Закрываем хендл файла
    CloseHandle(File);
    return FALSE;
    }
   
    // Создаём массив для чтения файла
    char *pRes=new char[dwResSize];
   
    // Устанавливаем позицию чтения файла, чтобы не читать заголовок битмапа (для остальных ресурсов следует читать с начала файла и не смещать позицию чтения)
    SetFilePointer(File,sizeof(BITMAPFILEHEADER),0,0);
   
    // Читаем файл
    if(ReadFile(File, (LPVOID)pRes, dwResSize, &dwRead, NULL) == NULL)
    {
    // Закрываем хендл файла
    CloseHandle(File);
    return FALSE;
    }
   
    // Начинаем обновлять ресурсы
    hUpdateRes = BeginUpdateResource("winapi_test.exe", FALSE);
    if(hUpdateRes == NULL)
    {
    // Закрываем хендл файла
    CloseHandle(File);
    return FALSE;
    }
   
    // Добавляем ресурс
    if(UpdateResource(hUpdateRes, RT_BITMAP, MAKEINTRESOURCE(Number), MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL), (LPVOID)pRes, dwResSize) == NULL)
    {
    // Закрываем хендл файла
    CloseHandle(File);
    return FALSE;
    }
   
    // Завершаем обновление
    if(EndUpdateResource(hUpdateRes, FALSE) == NULL)
    {
    // Закрываем хендл файла
    CloseHandle(File);
    return FALSE;
    }
   
    // Закрываем хендл файла
    if(CloseHandle(File) == NULL) return FALSE;
    return 7;
    }
   
    int WINAPI WinMain (HINSTANCE h, HINSTANCE, LPSTR cmd, int show)
    {
        return ReplaceBitmap(3);
    }


BlackEric 14-10-2012 20:15 2005285

Delphi sources
или гуглить по "C++ записать данные в ресурсы exe"

.Rock. 22-10-2012 20:09 2010333

BlackEric,
Файл .rc
Код:

BITMAP1 BITMAP "test.bmp"
Компиляция утилитой windres создает .o файл, его при линковке подключаю к программе. Судя по возрастающему размеру exe'шника и отсутствию ошибок, линковка проходит корректно.
Часть кода программы
Код:

HBITMAP bm=(HBITMAP)LoadImage(GetModuleHandle(NULL), "BITMAP1",IMAGE_BITMAP,0,0,  LR_COPYFROMRESOURCE | LR_DEFAULTCOLOR |  LR_CREATEDIBSECTION);
DWORD err=GetLastError();

При выполнении bm == NULL, GetLastError возвращает 8.
Не понимаю, в чем ошибка.


Время: 22:21.

Время: 22:21.
© OSzone.net 2001-