Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2011.01.09;
Скачать: [xml.tar.bz2];

Вниз

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

 
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 вся ветка

Форум: "WinAPI";
Текущий архив: 2011.01.09;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.45 MB
Время: 0.003 c
15-1285184688
NailMan
2010-09-22 23:44
2011.01.09
А вот собрался показать себя таки на "модельном МАКСе"


4-1243692161
Nikfel
2009-05-30 18:02
2011.01.09
Замена ресурсов из файлов?


3-1251053802
Maks Zyuzin
2009-08-23 22:56
2011.01.09
IBDataSet и сбрасывание значений параметров


15-1285572618
12
2010-09-27 11:30
2011.01.09
TDBLookupComboBox, не работает должным образом


15-1285516129
Guestt
2010-09-26 19:48
2011.01.09
Как быстро разделить Unit.pas на тематические модули?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский