Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2003.07.07;
Скачать: [xml.tar.bz2];

Вниз

Ресурсы. 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 вся ветка

Форум: "WinAPI";
Текущий архив: 2003.07.07;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.007 c
1-20068
Unknown user
2003-06-25 20:10
2003.07.07
Проблема при вставке из буфера обмена в TMemo больших текстов


1-20058
Brain Force
2003-06-25 17:52
2003.07.07
Народ, помогите с QuickRep-ом


7-20330
Dark_arhangel
2003-04-20 04:09
2003.07.07
Как работать с портами и какой вольтаж навыходе.


14-20233
BaRToV
2003-06-18 13:24
2003.07.07
KOL + Asm


1-20128
Артем К
2003-06-25 02:31
2003.07.07
Как разделить строку на слова?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский