Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.07.07;
Скачать: CL | DM;

Вниз

Ресурсы. UpdateResource.   Найти похожие ветки 

 
Nick Denry ©   (2003-05-02 01:59) [0]

Здравствуйте все, кто не спит сейчас.
Знаю, что ненужные вопросы ни кому на сайте не нравятся. мучался долго и все - таки решил задать.
Мне надо запихнуть ресурс в откомпиленый exeшник (скажем, соседа). Я делаю это так:
unit Main;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls,

Forms,
Dialogs, StdCtrls, AppEvnts, ComCtrls, ExtCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);

private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
UpdateFile:Hfile;



tmp : array [1..463872] of Char;

resfile,myfile:hfile;
str:ofstruct;
wd,wdd:dword;
result: cardinal;
i:integer;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);

begin
wd:=463872;
wdd:=0;
Resfile:=OpenFile("Project2.exe",str,of_read);
ReadFile(resfile,tmp,wd,wdd,nil);
MyFile:=CreateFile("1.txt",GENERIC_WRITE ,FILE_SHARE_WRITE,nil,
CREATE_Always,FILE_ATTRIBUTE_NORMAL,0);
WriteFile(MyFile,tmp,463872,wdd,nil);


UpdateFile:=BeginUpdateResource("Project1.exe",false);
ShowMessage("UpdateFile");

UpdateResource(UpdateFile,RT_RCDATA,"2000",$419,@tmp,SizeOF(tmp));

EndUpdateResource(UpdateFile,false);
ShowMessage("UpdateResource");
end;

end.




и все работает(медленно, засирая память + нединамический размер для файла!(всмысле массива)), а когда пытаюсь через память:


unit Main;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls,

Forms,
Dialogs, StdCtrls, AppEvnts, ComCtrls, ExtCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);

private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
UpdateFile:Hfile;
tmp : pointer;
mem:cardinal;
resfile,myfile:hfile;
str:ofstruct;
wd,wdd:dword;
result: cardinal;
i:integer;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);

begin


mem:=GlobalAlloc(GMEM_FIXED,463872);

tmp:=GlobalLock(mem);
button1.Caption:=inttostr(GlobalSize(mem));
if mem=0 then ShowMessage("GlobalAlloc error") else

showmessage("GlobalAlloc done");




wd:=463872;
wdd:=0;
Resfile:=OpenFile("Project2.exe",str,of_read);//здесь все проходит
ReadFile(resfile,tmp^,wd,wdd,nil);
MyFile:=CreateFile("1.txt",GENERIC_WRITE ,FILE_SHARE_WRITE,nil,
CREATE_Always,FILE_ATTRIBUTE_NORMAL,0);
WriteFile(MyFile,tmp^,463872,wdd,nil);//


UpdateFile:=BeginUpdateResource("Project1.exe",false);
ShowMessage("UpdateFile");

UpdateResource(UpdateFile,RT_RCDATA,"2000",$419,tmp^,SizeOF(tmp));//а здесь выдает ошибку (несовместимость типов: нетипизированный пойнтер и пойнтер)

EndUpdateResource(UpdateFile,false);
ShowMessage("UpdateResource");
GlobalUnlock(mem);
result:=GlobalFree(mem);
if result=0 then showmessage("all ok") else

messagebeep(mb_iconhand);


end;

end.
или если делаю через динамический массив (он - zero-bazed) то он не заполняется ReadFile - ом!
Как быть?



 
Morfein ©   (2003-05-02 10:18) [1]

Поменяй строки

mem:=GlobalAlloc(GMEM_FIXED,463872);
tmp:=GlobalLock(mem);
// и
GlobalUnlock(mem);
result:=GlobalFree(mem);

соответственно на строки

mem:=VirtualAlloc(nil, 463872, MEM_COMMIT, PAGE_READWRITE);
//и
VirtualFree(mem, 0, MEM_RELEASE);


А динамические массивы в делфи - это не просто последовательность байтов... несмотря даже на то, что он "zero-bazed" :))


 
Nick Denry ©   (2003-05-02 14:14) [2]

2>Morfein Все равно не работает!

Тогда немного уточню вопрос:

BOOL UpdateResource(

HANDLE hUpdate, // update-file handle
LPCTSTR lpType, // address of resource type to update
LPCTSTR lpName, // address of resource name to update
WORD wLanguage, // language identifier of resource
LPVOID lpData, // address of resource data
DWORD cbData // length of resource data, in bytes
);

что здесь lpData (SDK читал, но наверно плохо!)
почему, этот параметрм может быть указателем на массив
tmp : array [1..463872] of Char; (см. код), а указателем от GlobalAlloc+GlobalLock быть неможет (точнее просто указатель может, но не может tmp^ необходимый для использования (который, кстати работает в ReadFile & WriteFile)?
Мне нужно знать как зделать это динамически, не через массив
tmp : array [1..463872] of Char;
а через память или че-ниудь в этом роде! Помогите, пожалуйста!


 
Morfein ©   (2003-05-02 19:28) [3]

Полазь отладчиком... быт не может, что б не работало


 
Nick Denry ©   (2003-05-03 13:12) [4]

2>Morfien
VirtualAlloc(nil, 463872, MEM_COMMIT, PAGE_READWRITE); - возвращает указатель и если его использовать в чистом виде, то в конечный файл записывает 4 - пустые байта (нули), я все-таки думаю дело в UpdateResource!



 
Ricks ©   (2003-05-03 18:35) [5]

А почему тебе не сделать чтение файла по нормальному:
var f : file of byte;
m : array of byte;
begin
AssignFile(F, "file");
Reset(F);
SetLength(m, FileSize(F));
BlockRead(F, m[0], FileSize(F));
CloseFile(F);
end;


 
Nick Denrry   (2003-05-03 23:47) [6]

2>
> Ricks ©

Работает, всмысле файл читает в буфер, а UpdateResource все равно первый четыре байта пишет............
UpdateResource(UpdateFile,RT_RCDATA,"2000",$419,@m,SizeOF(m));

Игорь Шевченко, где ты, спаситель?


 
circul ©   (2003-05-03 23:50) [7]

SizeOF(m)

Внимательно разбери эту конструкцию.
здесь тебе нужна реальный размер данных, а не размер указателя на массив...


 
Nick Denry!   (2003-05-04 00:14) [8]

2>
> circul
Спасибо большое! Поставил

> реальный размер данных
и все заработало! Делал через GlobalAlloc и ReadFile!

Всем остальным тоже спасибо!



Страницы: 1 вся ветка

Текущий архив: 2003.07.07;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.02 c
14-20313
Вутшы
2003-06-21 11:16
2003.07.07
Как бы мне структуру связей посмотреть?


1-20120
kalishenko
2003-06-24 19:50
2003.07.07
Как определить выходные дни?


14-20208
Soft
2003-06-21 15:54
2003.07.07
Голосование за введение новых форумов Linux, Kylix


1-20063
Шустрый
2003-06-25 19:23
2003.07.07
Как поместить свою прогу в автозапуск?


1-20138
picaroon
2003-06-25 08:23
2003.07.07
Передача переменных из формы в форму.