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