Текущий архив: 2007.07.01;
Скачать: CL | DM;
Вниз
Работа с ресурсами Найти похожие ветки
← →
Vect1on (2007-01-21 23:26) [0]Привет всем!
Никак не могу разобраться с работой с ресурсами на винапи, помогите плиз...
Допустим есть файл xxx.dat, как его можно прикрепить к моему проекту в виде ресурса,
потом из ехе извлечь его например в C:\\Windows\\xxx.dat?
← →
Eraser © (2007-01-21 23:34) [1]> [0] Vect1on (21.01.07 23:26)
http://www.google.ru/search?hl=ru&newwindow=1&q=delphi+%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0+%D1%81+%D1%80%D0%B5%D1%81%D1%83%D1%80%D1%81%D0%B0%D0%BC%D0%B8&btnG=%D0%9F%D0%BE%D0%B8%D1%81%D0%BA&lr=
← →
xeron (2007-01-21 23:45) [2]
> Eraser
Да, я знаю о существовании гугла)))
Почти все примеры на вцл про курсоры, строки и.т.д
Нужно на винапи и для бинарных файлов...
Как прикрепить _бинарный_ файл незнаю...
Вот накопал функцию для извлечения ресурса:function ResourceToFile(lpName, lpType, FileName: PChar): BOOL;
var
HResInfo: HWND;
HGlobal: HWND;
FMemory: Pointer;
FSize, FHandle, nl: Integer;
begin
HResInfo := FindResource(HInstance, lpName, lpType);
HGlobal := LoadResource(HInstance, HResInfo);
FMemory := LockResource(HGlobal);
FSize := SizeOfResource(HInstance, HResInfo);
FHandle := Integer(CreateFile(FileName, GENERIC_READ or GENERIC_WRITE,
0, nil, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0));
Result := WriteFile(HWND(FHandle), FMemory^, FSize, Integer(nl), nil);
CloseHandle(HWND(FHandle));
end;
← →
Джо © (2007-01-22 00:42) [3]> [2] xeron (21.01.07 23:45)
> Как прикрепить _бинарный_ файл незнаю...
Абсолютно так же, как и любой другой.
← →
xeron (2007-01-22 00:42) [4]Все! Разобрался)
← →
Джо © (2007-01-22 00:43) [5]Только тип ресурса будет "RCDATA".
← →
xeron (2007-01-22 00:45) [6]Теперь другая проблемма...
Функция которую я написал, не работает, точнее не компелируется...
Проблемма вроде бы в указателе на количество записанных байт, только не знаю как исправить :(
Помогите плиз... Вот описание функции WriteFile:
function WriteFile(
hFile: THandle; // Указатель на открытый файл
const Buffer; // Указатель на данные для записи
nNumberOfBytesToWrite: DWORD; // Количество записанных байт
var lpNumberOfBytesWritten: DWORD; // Указатель на количество записанных байт
lpOverlapped: POverlapped // Указатель на структуру OVERLAPPED
): BOOL; stdcall;
← →
Джо © (2007-01-22 01:54) [7]> Проблемма вроде бы
Нет такой проблемы — «вроде бы». Она или есть, или ее нет. А если есть — то вполне конкретная и в конкретном месте.
← →
xeron (2007-01-22 02:03) [8]Да, есть проблемма, вот в этом месте -> Integer(nl)
← →
Джо © (2007-01-22 02:38) [9]> [8] xeron (22.01.07 02:03)
> Да, есть проблемма, вот в этом месте -> Integer(nl)var
BytesWritten: DWORD;
..
WriteFile(HWND(FHandle), FMemory^, FSize, BytesWritten, nil);
← →
xeron (2007-01-22 02:59) [10]Попробовал, нормально компелируется, только не работает :(
Создается файл размером 0 байт и все...
Протестил тот же самый файл ресурсов только используется вцл, работает...
Вот код которым тестил:{$R test.res}
procedure ExtractRes(ResType, ResName, ResNewName : String);
var
Res : TResourceStream;
begin
Res := TResourceStream.Create(Hinstance, Resname, Pchar(ResType));
Res.SavetoFile(ResNewName);
Res.Free;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
ExtractRes("EXEFILE", "ARJ", "ARJ.EXE");
end;
end.
Помогите плиз, сделать на винапи...
← →
Eraser © (2007-01-22 20:54) [11]> [10] xeron (22.01.07 02:59)
где ты увидел такой тип EXEFILE ? )
см. RT_RCDATA.
← →
Anatoly Podgoretsky © (2007-01-22 21:31) [12]> Eraser (22.01.2007 20:54:11) [11]
Почему удивление, обычный пользовательский тип.
← →
Eraser © (2007-01-22 21:39) [13]> [12] Anatoly Podgoretsky © (22.01.07 21:31)
вот там и грабли скорее всего.
← →
xeron (2007-01-22 23:15) [14]
> вот там и грабли скорее всего.
Нет, там все нормально...
Все разобрался... Вот:function ResourceToFile(ResName,ResType,FileName:PChar):LongBool;
var RMemory:Pointer;
HGlobal:Cardinal;
HResInfo:Cardinal;
FSize,FHandle,Buf:Cardinal;
begin // function from http://lenininc.com
HResInfo:=FindResource(HInstance,ResName,ResType);
HGlobal:=LoadResource(HInstance,HResInfo);
RMemory:=LockResource(HGlobal);
FSize:=SizeOfResource(HInstance,HResInfo);
FHandle:=CreateFile(FileName,GENERIC_READ or GENERIC_WRITE,
0, nil,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0);
Result:=WriteFile(FHandle,RMemory^,FSize,Buf,nil);
CloseHandle(FHandle);
end;
Спасибо всем большое!
Страницы: 1 вся ветка
Текущий архив: 2007.07.01;
Скачать: CL | DM;
Память: 0.5 MB
Время: 0.017 c