Имя пользователя:
Пароль:
 | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Win32 API - UpdateResource делает .exe некорректным

Ответить
Настройки темы
Win32 API - UpdateResource делает .exe некорректным

Пользователь


Сообщения: 57
Благодарности: 0

Профиль | Отправить PM | Цитировать


Здравствуйте. Понадобилось записать ресурсы, необходимые для работы приложения, в исполняемый файл этого приложения.
Возникла проблема - 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);
    }

Отправлено: 18:28, 05-10-2012

 

Старожил


Сообщения: 435
Благодарности: 63

Профиль | Отправить PM | Цитировать


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

-------
black-eric.livejournal.com

Это сообщение посчитали полезным следующие участники:

Отправлено: 20:15, 14-10-2012 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Пользователь


Сообщения: 57
Благодарности: 0

Профиль | Отправить PM | Цитировать


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.
Не понимаю, в чем ошибка.

Отправлено: 20:09, 22-10-2012 | #3



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Win32 API - UpdateResource делает .exe некорректным

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
как посмотреть что делает скрипт? vlasoft Хочу все знать 1 01-10-2011 23:12
HDD - Что делает Vista SP1 Ultimate с HDD?!? Riw Накопители (SSD, HDD, USB Flash) 8 30-03-2009 18:17
IE - делает переадресацию на Msn.com RuLe Microsoft Windows 2000/XP 2 01-04-2007 09:05
Что делает команда? Guest Программное обеспечение Linux и FreeBSD 19 03-06-2004 01:12




 
Переход