Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.01.09;
Скачать: CL | DM;

Вниз

Замена ресурсов из файлов?   Найти похожие ветки 

 
Nikfel   (2009-05-30 18:02) [0]

Помогите перевести с языка си на 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)
Помогите как правильно это записать. Заранее спасибо.


 
Сергей М. ©   (2009-05-30 19:27) [1]


> 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)


 
Nikfel   (2009-05-30 19:53) [2]

Вот попробовал так переписать, но работает не правильно, т.е. запись происходит, но получается не правильный рисунок( смотрел в программе 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;


 
Сергей М. ©   (2009-05-30 19:59) [3]


> Вот попробовал так переписать


Ты даже передрать один-в-один мой код не смог, что уж тут о какой-то работоспособности говорить ?)


 
Nikfel   (2009-05-30 20:01) [4]


> if not ReadFile(File, pRes^, dwResSize, dwRead, nil)


Все понял вот об этом забыл что надо pRes^. Еще надо будет добавить проверку на ошибки для правильной работы.

Спасибо. Все работает.



Страницы: 1 вся ветка

Текущий архив: 2011.01.09;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.01 c
2-1286908287
ZerGo
2010-10-12 22:31
2011.01.09
Аунтетификация и доступ к ресурсам Windows XP на Delphi.


15-1285391446
ForumReader
2010-09-25 09:10
2011.01.09
Хочу предложить сервис платных ответов на срочные/сложные вопросы


15-1285218847
12
2010-09-23 09:14
2011.01.09
А сегодня довольно хорошая дата - 40444


2-1287398190
AnGel
2010-10-18 14:36
2011.01.09
Пеоедача данных через локальную сеть


2-1287365172
DimonS
2010-10-18 05:26
2011.01.09
Обновляемый запрос в старой программе.