Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Работа с ресурсами [D7, WinXP]


Vect1on ©   (2007-01-21 23:26:00) 

Привет всем!

Никак не могу разобраться с работой с ресурсами на винапи, помогите плиз...
Допустим есть файл xxx.dat, как его можно прикрепить к моему проекту в виде ресурса,
потом из ехе извлечь его например в C:\\Windows\\xxx.dat?


xeron   (2007-01-22 23:15:00) [1]


> вот там и грабли скорее всего.

Нет, там все нормально...
Все разобрался... Вот:

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;

Спасибо всем большое!


Eraser   (2007-01-22 21:39:00) [2]

> [12] Anatoly Podgoretsky ©   (22.01.07 21:31)

вот там и грабли скорее всего.


Anatoly Podgoretsky   (2007-01-22 21:31:00) [3]

> Eraser  (22.01.2007 20:54:11)  [11]

Почему удивление, обычный пользовательский тип.


Eraser   (2007-01-22 20:54:00) [4]

> [10] xeron   (22.01.07 02:59)

где ты увидел такой тип EXEFILE ? )

см. RT_RCDATA.


xeron   (2007-01-22 02:59:00) [5]

Попробовал, нормально компелируется, только не работает :(
Создается файл размером 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.

Помогите плиз, сделать на винапи...


Джо   (2007-01-22 02:38:00) [6]

> [8] xeron   (22.01.07 02:03)
> Да, есть проблемма, вот в этом месте -> Integer(nl)

var
 BytesWritten: DWORD;
..
 WriteFile(HWND(FHandle), FMemory^, FSize, BytesWritten, nil);


xeron   (2007-01-22 02:03:00) [7]

Да, есть проблемма, вот в этом месте -> Integer(nl)


Джо   (2007-01-22 01:54:00) [8]

> Проблемма вроде бы

Нет такой проблемы — «вроде бы». Она или есть, или ее нет. А если есть — то вполне конкретная и в конкретном месте.


xeron   (2007-01-22 00:45:00) [9]

Теперь другая проблемма...
Функция которую я написал, не работает, точнее не компелируется...
Проблемма вроде бы в указателе на количество записанных байт, только не знаю как исправить :(
Помогите плиз... Вот описание функции WriteFile:

function WriteFile(
hFile: THandle; // Указатель на открытый файл
const Buffer; // Указатель на данные для записи
nNumberOfBytesToWrite: DWORD; // Количество записанных байт
var lpNumberOfBytesWritten: DWORD; // Указатель на количество записанных байт
lpOverlapped: POverlapped // Указатель на структуру OVERLAPPED
): BOOL; stdcall;


Джо   (2007-01-22 00:43:00) [10]

Только тип ресурса будет "RCDATA".


Джо   (2007-01-22 00:42:00) [11]

> [2] xeron   (21.01.07 23:45)
> Как прикрепить _бинарный_ файл незнаю...

Абсолютно так же, как и любой другой.


xeron   (2007-01-22 00:42:00) [12]

Все! Разобрался)


xeron   (2007-01-21 23:45:00) [13]


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


Eraser   (2007-01-21 23:34:00) [14]

> [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=


Наверх

Титульная страница Поиск, карта сайта Написать письмо