Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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
1-1177854375
tormoz
2007-04-29 17:46
2007.07.01
Сервис и реализация событий "наружу"


1-1178205438
Ламонов Олег
2007-05-03 19:17
2007.07.01
ListView


15-1180601931
novoalex
2007-05-31 12:58
2007.07.01
DataSet & ensemble.


15-1179599783
GeLLeR
2007-05-19 22:36
2007.07.01
STALKER


9-1155284389
Нуб
2006-08-11 12:19
2007.07.01
ФПС на разных видеокартах