|
用下面的源序做出来的捆绑程序在使用有中文目录的时候捆绑不成功,但是没有中文目录时能成功生成捆绑程序。请问怎么让他能支持中文目录?谢谢
源文件:
unit Unit1;
{$MODE Delphi}
//download by http://www.codefans.net
interface
uses
LCLIntf, LCLType, LMessages, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtDlgs;
type
// 定义储存捆绑文件大小的信息
TFilesInfo = record
FileName: array [0..MAX_PATH] of Char;
FileSize: Longint;
end;
TForm1 = class(TForm)
Label1: TLabel;
Edit1: TEdit;
Button1: TButton;
Label2: TLabel;
Edit2: TEdit;
Button2: TButton;
Button3: TButton;
OpenDialog1: TOpenDialog;
Label3: TLabel;
Edit3: TEdit;
Button4: TButton;
Button5: TButton;
SaveDialog1: TSaveDialog;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
procedure UnBind; // 反捆绑
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.lfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
// 选择第一个要捆绑的文件
OpenDialog1.FileName := '';
OpenDialog1.Filter := '应用程序|*.exe';
if OpenDialog1.Execute then
Edit1.Text := OpenDialog1.FileName;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
// 选择第二个要捆绑的文件
OpenDialog1.FileName := '';
OpenDialog1.Filter := '应用程序|*.exe';
if OpenDialog1.Execute then
Edit2.Text := OpenDialog1.FileName;
end;
procedure TForm1.Button3Click(Sender: TObject);
var
FileName: String;
begin
SaveDialog1.Filter := '应用程序|*.exe';
if SaveDialog1.Execute then
begin
FileName := SaveDialog1.FileName;
// 检测扩展名是否是EXE
if UpperCase(ExtractFileExt(FileName)) <> '.EXE' then
FileName := FileName + '.exe';
Edit3.Text := FileName;
end;
end;
procedure TForm1.Button5Click(Sender: TObject);
begin
// 退出
Close;
end;
procedure TForm1.Button4Click(Sender: TObject);
var
OutFile: TFileStream; // 输出文件
MySelf: TFileStream; // 读取自身文件
SourceFile: TFileStream; // 读取被捆绑文件
SelfFileInfo, FirstFileInfo, SecondFileInfo: TFilesInfo; // 记录被捆绑文件信息
begin
// 捆绑文件
// 初始化SelfFileInfo,FirstFileInfo,SecondFileInfo结构
FillChar(SelfFileInfo, sizeof(TFilesInfo), #0);
FillChar(FirstFileInfo, sizeof(TFilesInfo), #0);
FillChar(SecondFileInfo, sizeof(TFilesInfo), #0);
// 打开自身并读取
MySelf := TFileStream.Create(Application.ExeName, fmOpenRead or fmShareDenyNone);
// 获取自身文件大小
SelfFileInfo.FileSize := MySelf.Size;
SelfFileInfo.FileName := 'Bind'; // 打上标志
// 创建输出文件
OutFile := TFileStream.Create(Edit3.Text, fmCreate or fmOpenWrite);
// 将自身文件保存在输出文件的最前面
OutFile.CopyFrom(MySelf, 0); // 第二个参数为0时表示复制整个内容
// 关闭打开的自身文件
MySelf.Free;
// 打开第一个要捆绑的文件
SourceFile := TFileStream.Create(Edit1.Text, fmOpenRead or fmShareDenyNone);
// 获取第一个要捆绑文件的文件名及大小
StrPCopy(FirstFileInfo.FileName, ExtractFileName(Edit1.Text));
FirstFileInfo.FileSize := SourceFile.Size;
// 将第一个文件的内容追加在输出文件后
OutFile.CopyFrom(SourceFile, 0);
// 关闭第一个文件
SourceFile.Free;
// 打开第二个要捆绑的文件
SourceFile := TFileStream.Create(Edit2.Text, fmOpenRead or fmShareDenyNone);
// 获取第二个要捆绑文件的文件名及大小
StrPCopy(SecondFileInfo.FileName, ExtractFileName(Edit2.Text));
SecondFileInfo.FileSize := SourceFile.Size;
// 将第二个文件的内容追加在输出文件后
OutFile.CopyFrom(SourceFile, 0);
// 关闭第二个文件
SourceFile.Free;
// 将被捆绑文件信息写在输出文件未尾
OutFile.Write(SelfFileInfo, sizeof(TFilesInfo));
OutFile.Write(FirstFileInfo, sizeof(TFilesInfo));
OutFile.Write(SecondFileInfo, sizeof(TFilesInfo));
// 关闭输出文件完成捆绑
OutFile.Free;
ShowMessage('捆绑完成!');
end;
procedure TForm1.UnBind;
var
FilesInfo: TFilesInfo;
UnBindFile: array[0..1] of TFilesInfo;
SourceFile: TFileStream; // 读取捆绑文件
OutFile: TFileStream; // 输出文件
begin
// 初始化
FillChar(FilesInfo, sizeof(TFilesInfo), #0);
FillChar(UnBindFile[0], sizeof(TFilesInfo), #0);
FillChar(UnBindFile[1], sizeof(TFilesInfo), #0);
SourceFile := TFileStream.Create(Application.ExeName, fmOpenRead or fmShareDenyNone);
// 移动到存储文件信息的地方
SourceFile.Seek(SourceFile.Size - (sizeof(TFilesInfo) * 3), soFromBeginning);
// 获取自身文件信息
SourceFile.Read(FilesInfo, sizeof(TFilesInfo));
// 如果没有捆绑文件,则退出反捆绑过程
if FilesInfo.FileName <> 'Bind' then
begin
SourceFile.Free;
Exit;
end;
// 隐藏窗体
Application.ShowMainForm := False;
// 分别读取第一及第二个文件的信息
SourceFile.Read(UnBindFile[0], sizeof(TFilesInfo));
SourceFile.Read(UnBindFile[1], sizeof(TFilesInfo));
// 移动到第一个文件处进行读取文件内容
SourceFile.Seek(FilesInfo.FileSize, soFromBeginning);
// 创建第一个输出文件
OutFile := TFileStream.Create(UnBindFile[0].FileName, fmCreate or fmOpenWrite);
OutFile.CopyFrom(SourceFile, UnBindFile[0].FileSize);
OutFile.Free;
// 运行
OpenDocument(UnBindFile[0].FileName); { *Converted from ShellExecute* }
// 创建第二个输出文件
OutFile := TFileStream.Create(UnBindFile[1].FileName, fmCreate or fmOpenWrite);
OutFile.CopyFrom(SourceFile, UnBindFile[1].FileSize);
OutFile.Free;
// 运行
OpenDocument(UnBindFile[1].FileName); { *Converted from ShellExecute* }
// 关闭自身文件
SourceFile.Free;
// 退出
//PostQuitMessage(0);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
UnBind;
end;
end.
|
|