Сейчас на форуме: hgdagon (+5 невидимых)

 eXeL@B —› Программирование —› снова работа с ресами из Delphi
Посл.ответ Сообщение


Ранг: 81.2 (постоянный)
Активность: 0.040
Статус: Участник

Создано: 27 августа 2007 00:22
· Личное сообщение · #1

ситуация такая:
я делаю так
res:=FindResource// каких-то ресурсов
res:=LoadResource// каких-то ресурсов
flock:=LockResource// в переменную flock
затем
fl:=_lcreat(pchar(...),0)
_lwrite(fl,flock,sizeofresource(hinstance,res))
_lclose(fl)
FreeResource(res)// каких-то ресурсов

вся эта радость валит в цикле
(может быть необходима обработка нескольких файлов)

но создаётся только пустое файло, подскажите в чём я не прав

зы - со stream-АМИ нельзя (API прилога)




Ранг: 81.2 (постоянный)
Активность: 0.040
Статус: Участник

Создано: 27 августа 2007 00:23
· Личное сообщение · #2

+
var
res,fl:cardinal;
flock:pointer //или pchar




Ранг: 990.2 (! ! !), 380thx
Активность: 0.680
Статус: Модератор
Author of DiE

Создано: 27 августа 2007 00:25 · Поправил: Hellspawn
· Личное сообщение · #3

странный у тя код =\ заюзай эту функу, косяков не замечал...

function ResourceToFile(ResName,ResType,FileName:PChar):Integer;
var
RMemory : pointer;
HGlobal : dword;
HResInfo: dword;
FSize,FHandle,Buf,Fm:dword;
MEMPTR : pointer;
begin
Buf:=0;
result:=0;
HResInfo:=FindResource(HInstance,ResName,ResType);
If (HResInfo = 0) then exit;

HGlobal:=LoadResource(HInstance,HResInfo);
RMemory:=LockResource(HGlobal);
FSize:=SizeOfResource(HInstance,HResInfo);

FHandle:=CreateFile(FileName,GENERIC_READ or GENERIC_WRITE,0,nil,CREATE_ALWAYS,$00000006,0);
WriteFile(FHandle,RMemory^,FSize,Buf,nil);
Fm:=CreateFileMapping(FHandle,nil,4,0,FSize, nil);
MEMPTR:=MapViewOfFile(FM,2,0,0,FSize);

бла бла бла...

UnmapViewOfFile(MEMPTR);
CloseHandle(FM);
CloseHandle(FHandle);
Result:=Buf;
end;


-----
[nice coder and reverser]




Ранг: 117.1 (ветеран)
Активность: 0.050
Статус: Участник

Создано: 27 августа 2007 05:58 · Поправил: pushick
· Личное сообщение · #4

LockResource является анахронизмом и совершенно не нужен. Вот простой и эффективный способ извлечения ресурсов из приложения. Мапить файл тоже совершенно не нужно.

function ExtractResource(const ResName: PWideChar; const ResSection: PWideChar; const ExtractFileName: PWideChar): boolean;
var
hRes: HRSRC;
hResData: HGLOBAL;
p1: pointer;
size: cardinal;
f: THANDLE;
bytesIO: DWORD;
begin
result := false;
hRes := FindResourceW(hinst, ResName, ResSection);
if (hRes = 0) then exit;
size := SizeOfResource(hinst, hRes);
if (size = 0) then exit;
hResData := LoadResource(hinst, hRes);
if (hResData = 0) then exit;
p1 := pointer(hResData);
bytesIO := 0;
f := CreateFileW(ExtractFileName, GENERIC_WRITE, FILE_SHARE_WRITE, nil, CREATE_ALWAYS,
FILE_FLAG_SEQUENTIAL_SCAN, 0);
if (f <> INVALID_HANDLE_VALUE) then
begin
_WriteFile(f, p1, size, @bytesIO, nil);
CloseHandle(f);
end;
result := (bytesIO = size);
end;


-----
Security through obscurity is just an illusion





Ранг: 81.2 (постоянный)
Активность: 0.040
Статус: Участник

Создано: 27 августа 2007 06:52
· Личное сообщение · #5

спасибо, кстати я почти так и делал,
ща попробую иторой вариант.
вот блин как бывает в спешке свой код не доработал,
и начал переходить на другие варинты.

ещё раз спасибо




Ранг: 81.2 (постоянный)
Активность: 0.040
Статус: Участник

Создано: 27 августа 2007 07:28
· Личное сообщение · #6

pushick:
по поводу
_WriteFile(f, p1, size, @bytesIO, nil);
ты наверное хотел написать
WriteFile(f, p1, size, @bytesIO, nil);

И что странно в хелпе пишет что 4 параметр должен быть указателем
а дельфа просит просто cardinal, или это уже различия версий, у меня например
сейчас 6.




Ранг: 81.2 (постоянный)
Активность: 0.040
Статус: Участник

Создано: 27 августа 2007 07:30
· Личное сообщение · #7

сейчас попробую вариант от Hellspawn
просто предыдущий был очень на мой похож
я его и перепробовал.



Ранг: 117.1 (ветеран)
Активность: 0.050
Статус: Участник

Создано: 27 августа 2007 08:11
· Личное сообщение · #8

NicknamES

Просто аффтары из борланд описали этот параметр как var. У меня свой windows.pas и там все поправлено на то, как это должно быть.

-----
Security through obscurity is just an illusion





Ранг: 990.2 (! ! !), 380thx
Активность: 0.680
Статус: Модератор
Author of DiE

Создано: 27 августа 2007 12:06
· Личное сообщение · #9

pushick пишет:
LockResource является анахронизмом и совершенно не нужен


нужен не нужен хз))) я делал по мануалу функа пашет 100% по-этому оставлю так

-----
[nice coder and reverser]





Ранг: 81.2 (постоянный)
Активность: 0.040
Статус: Участник

Создано: 27 августа 2007 12:48
· Личное сообщение · #10

Эх ёпт , короче ppls
у меня всё работало,просто фишка была в том,
что файлы которые создавал мой код, были с
атрибутами faHIDDEN или faSYSTEM, а по моим
системным настройкам эти файлы не должны быть видны
,а я думал что они не создаются, а мучался несколько дней.

вот блин как обидно, спасибо что отозвались!!!


 eXeL@B —› Программирование —› снова работа с ресами из Delphi
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати