先将A.exe文件作成资源文件放在你的工程文件中(比如说是 b.exe), b.exe 在 打包时先将 a.exe 释放出来,然后再使用上面的代码将图片写入 a.exe 文件中。当然 a.exe 文件本身要有读出图片的能力。 不知你明白没有?你另开一贴,给我100分,我把源代码给你,OK?---------------------------------------------------贴子为你而开,来吧!!!!
解决方案 »
- delphi数据库更新
- ClientSocket控件怎样检测getpeername的异常?
- 怎样刷新字段信息
- 请教:DBGridEh中出现LookUp下拉框的最少必要设置条件.
- 为什么会出现异常?
- Table.Filter的用法
- foxnt大斑竹进来,解释解释来。
- 现在的进销存软件是不是几乎都用三层架构技术啊?
- 高分请教DELPHI调用C语言的DLL问题,高手请进(附源代码)
- mynumcn:=QRExpr2.Caption; ,我想得到QRExpr2中的计算的结果,而不是表达式?
- 打开一个excel文件,读取其中的单元数据,存入数组,如何实现
- 新手问题:Delphi有没有象C语言一样的冒号运算符?
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;type
TForm1 = class(TForm)
Button1: TButton;
Image1: TImage;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
var
fs:TFileStream;
ms:TMemoryStream;
buff1:boolean;
size:int64;
bmp:TBitmap;
begin
fs:=TFileStream.Create(application.ExeName,fmOpenread or fmShareDenynone);
fs.Position:=fs.Size-sizeof(boolean);
fs.ReadBuffer(buff1,sizeof(boolean));
//if buff1 then //如果加入了图片
begin
fs.Position:=fs.size-sizeof(boolean)-sizeof(int64);
fs.ReadBuffer(size,sizeof(int64)); //读出图片的大小
fs.Position:=fs.Size-sizeof(boolean)-sizeof(int64)-size;
ms:=TmemoryStream.Create;
ms.CopyFrom(fs,size); //将图片存入内存流中
{bmp:=TBitmap.Create; bmp.Width:=800;
bmp.Height:=600;
bmp.LoadFromStream(ms);
form1.Canvas.Draw(0,0,bmp);}
ms.SaveToFile('c:\zjs.bmp');
image1.Picture.LoadFromFile('c:\zjs.bmp');
ms.Free;
end;
fs.Free;
end;end.
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TForm1 = class(TForm)
Button1: TButton;
OpenDialog1: TOpenDialog;
SaveDialog1: TSaveDialog;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}
{$R a.res}function zjs_getFileSize1(filename:TFilename):int64;
var
hFile:THandle;
begin
hFile:=fileOpen(filename,fmopenread or fmsharedenywrite);
result:=fileseek(hFile,0,soFromEnd);
fileclose(hFile);
end;procedure TForm1.Button1Click(Sender: TObject);
var
rs:TResourceStream;
fs,fs1:TFileStream;
picFile,targetFile:string;
buff:boolean;
size:int64;
begin
if opendialog1.Execute then
begin
if savedialog1.Execute then
begin
picFile:=opendialog1.FileName;
targetFile:=savedialog1.FileName;
rs:=TResourceStream.Create(hinstance,'a_exe','Unknown');
rs.SaveToFile(targetFile);
fs:=TFileStream.Create(targetFile,fmOpenWrite or fmShareDenyWrite);
fs1:=TFileStream.Create(picFile,fmOpenRead or fmShareDenynone);
fs1.Position:=0;
fs.Seek(0,soFromEnd);
fs.CopyFrom(fs1,0);
size:=zjs_getFileSize1(picFile);
fs.Seek(0,soFromEnd);
fs.WriteBuffer(size,sizeof(int64));
buff:=true;
fs.Position:=fs.Size;
fs.WriteBuffer(buff,sizeof(boolean));
fs.Free; showMessage('OK!');
end;
end;
end;end.
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs,ExtCtrls, StdCtrls;type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}const
bmp_width=64;procedure TForm1.Button1Click(Sender: TObject);
var
i,j:integer;
size:integer;
fs:TFileStream;
ms,ms1:TMemoryStream;
added:boolean;
sl:TStringlist;
image:TImage;
bmp:TBitmap;
begin
added:=false; fs:=TFileStream.Create(application.ExeName,fmOpenRead or fmShareDenyNone);
fs.Seek(-sizeof(boolean),soFromEnd);
fs.ReadBuffer(added,sizeof(added)); //读出文件是否被加入图片 if added then //如果加入了
begin
//showMessage('Pictures added!');
fs.Seek(-sizeof(boolean)-sizeof(integer),soFromEnd);
fs.ReadBuffer(size,sizeof(size));
//showMessage('stringListSize:'+intToStr(size));
fs.Seek(-sizeof(boolean)-sizeof(integer)-size,soFromEnd);
ms:=TmemoryStream.Create;
ms.CopyFrom(fs,size);
ms.SaveToFile('c:\zjs.txt');
sl:=TStringList.Create;
sl.LoadFromFile('c:\zjs.txt'); bmp:=TBitmap.Create;
bmp.Width:=bmp_width;
bmp.Height:=bmp_width;
i:=0; j:=0;
//showMessage('StingListCount:'+intToStr(sl.Count));
ms1:=TMemoryStream.Create; while i<sl.Count-1 do
begin
//showMessage('the '+ intTosTr(j)+' files!');
ms1.Clear;
ms1.Position:=0;
fs.Seek(strToInt(sl.Strings[i]),soFromBeginning);
ms1.CopyFrom(fs,StrToInt(sl.Strings[i+1]));
ms1.Position:=0;
bmp.LoadFromStream(ms1); image:=TImage.Create(self);
image.Parent:=self;
image.Width:=bmp_width;
image.Height:=bmp_width;
image.Left:=j*bmp_width+10*j;
form1.Width:=image.Left+image.Width+10;
image.Canvas.Draw(0,0,bmp); inc(i,2);
inc(j,1); end; bmp.Free; ms1.Free;
ms.Free;
fs.Free;
sl.Free;
end;end;end.
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TForm1 = class(TForm)
OpenDialog1: TOpenDialog;
SaveDialog1: TSaveDialog;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
var
sl_pos_size:TStringList;
targetFile:String;
fs:TFileStream;
ms,ms_target:TMemoryStream;
i:integer;
size:integer;
added:boolean;
begin
if not fileExists('a.exe') then
begin
showMessage('File not exists: a.exe!');
exit;
end;
if opendialog1.Execute then
begin
if saveDialog1.Execute then
begin
targetFile:=saveDialog1.FileName;
ms_target:=TMemoryStream.Create;
fs:=TFileStream.Create(extractFilePath(application.ExeName)+'a.exe',fmopenread or fmShareDenyWrite);
fs.Position:=0;
ms_target.CopyFrom(fs,0);
fs.Free; sl_pos_size:=TSTringlist.Create;
for i:=0 to opendialog1.Files.Count-1 do //逐个加入文件
begin
ms_target.Seek(0,soFromEnd);
sl_pos_size.Add(intToStr(ms_target.Position)); //加入文件的位置
fs:=TFileStream.Create(opendialog1.Files.Strings[i],fmOpenRead or fmShareDenynone);
sl_pos_size.Add(intToStr(fs.Size)); //加入文件的大小
ms_target.CopyFrom(fs,0);
fs.Free;
end;
ms:=TmemoryStream.Create;
sl_pos_size.SaveToStream(ms);
ms.Position:=0;
ms_target.Seek(0,soFromEnd);
ms_target.CopyFrom(ms,0); {size:=0;
for i:=0 to sl_pos_size.Count-1 do
begin
size:=size+length(sl_pos_size.Strings[i]);
end;} size:=ms.Size;
showMessage(intToStr(size)); ms_target.Seek(0,soFromEnd);
ms_target.WriteBuffer(size,sizeof(size)); added:=true;
ms_target.Seek(0,soFromEnd);
ms_target.WriteBuffer(added,sizeof(boolean));
ms_target.SaveToFile(targetFile);
ms_target.Free;
ms.Free; showMessage('OK');
end;
end;
end;end.
本例并未将 a.exe 文件作成资源到 b.exe 文件中,所以运行 b.exe 时 a.exe 要与b.exe文件在同一目录下。对于其他格式的不能直接从内存中装载的文件,需要先存到临时文件中。
fs.ReadBuffer(added,sizeof(added)); //读出文件是否被加入图片
if added then //如果加入了
ms_target.Seek(0,soFromEnd);
ms_target.WriteBuffer(added,sizeof(boolean)); //写入bool值
呵呵~ 你先把这帖子结了吧,再开一贴请人帮助转成C++ Builder的吧。很遗憾我不会 C++ Builder. 对不住了。:)