Замена ресурсов из файлов
Данный код применим не только для иконок и замены ресурсов, которые читаются из исполняемого файла. Следующий код показывает, как можно заменить ресурс – битмап, прочитав его из памяти:
bool ReplaceBitmap(WORD 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("ResourceKeeper.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 TRUE; } |