Текущий архив: 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.47 MB
Время: 0.006 c