-
Помогите перевести с языка си на Delphi:
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; }
Взято с https://forum.zloy.org/showthread.php?t=10037
Я никак не могу понять как сделать на Delphi. В коде мне не понятно только: char *pRes=new char[dwResSize]; if(ReadFile(File, (LPVOID)pRes, dwResSize, &dwRead, NULL) == NULL) Помогите как правильно это записать. Заранее спасибо.
-
> char *pRes=new char[dwResSize];
var pRes: PChar; .. pRes := SysGetMem(dwResSize);
> if(ReadFile(File, (LPVOID)pRes, dwResSize, &dwRead, NULL) > == NULL)
if not ReadFile(File, pRes^, dwResSize, dwRead, nil)
-
Вот попробовал так переписать, но работает не правильно, т.е. запись происходит, но получается не правильный рисунок( смотрел в программе Restorator). Где же тут ошибка? procedure TForm1.Button1Click(Sender: TObject);
var dwResSize, dwRead:DWORD;
hUpdateRes:Cardinal;
pRes: PChar;
f:thandle;
begin
F:=CreateFile('new.bmp', GENERIC_READ, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
dwResSize:=GetFileSize(F, nil)-sizeof(BITMAPFILEHEADER);
pRes:=SysGetMem(dwResSize);
SetFilePointer(F,sizeof(BITMAPFILEHEADER),0,0);
ReadFile(F, pRes, dwResSize, dwRead, nil);
hUpdateRes:=BeginUpdateResource('ResourceKeeper.exe', FALSE);
UpdateResource(hUpdateRes, RT_BITMAP, 'bmp', LANG_NEUTRAL, pRes, dwResSize);
EndUpdateResource(hUpdateRes, FALSE);
CloseHandle(F);
end;
-
> Вот попробовал так переписать
Ты даже передрать один-в-один мой код не смог, что уж тут о какой-то работоспособности говорить ?)
-
> if not ReadFile(File, pRes^, dwResSize, dwRead, nil)
Все понял вот об этом забыл что надо pRes^. Еще надо будет добавить проверку на ошибки для правильной работы.
Спасибо. Все работает.
|