最近我在做一个升级工具,需要在我的升级工具可执行文件里追加一个文件(以下简称dll文件),在升级过程中要把这个dll文件分离出来,放在待升级程序的安装目录里,在这里我介绍了两种追加文件和分离文件的方法。
1、通过数据流的方法
void __fastcall TForm4::btn1Click(TObject *Sender)
{
if (FileOpenDialog1->Execute())
{
TMemoryStream* stream = new TMemoryStream();
TMemoryStream* data = new TMemoryStream();
stream->LoadFromFile("F:\\test.exe");
stream->Position = stream->Size;
data->LoadFromFile(FileOpenDialog1->FileName);
stream->CopyFrom(data,0);
stream->Position = stream->Size;
int size = data->Size;
stream->Write(&size,4);
stream->SaveToFile("d:\\dest.exe");
delete stream;
delete data;
}
}
以上程序可以把文件"F:\\test.exe"和对话框中选中的文件,合并成一个新的文件"d:\\dest.exe"
void __fastcall TForm4::btn2Click(TObject *Sender)
{
if (FileOpenDialog1->Execute())
{
TMemoryStream* stream = new TMemoryStream();
TMemoryStream* data = new TMemoryStream();
data->LoadFromFile(FileOpenDialog1->FileName);
data->Position = data->Size - 4;
int size = 0;
data->Read(&size,4);
data->Position = data->Size - size - 4;
stream->CopyFrom(data,size);
stream->SaveToFile("d:\\temp.txt");
}
}
以上程序可以把追加到Exe的程序,即对话框中选中的程序提取出来,存放为"d:\\temp.txt"
但是这种方法写出了的程序容易被杀毒软件干掉,于是便有了第二种方法。
2、通过资源文件追加和分离
(1)新建TXT文件,加入要追加的文件为c:\\test.dll,在TXT文件里这样写
MYDLL DLL c:\\test.dll
第一列为文件标识符可以自己取名,第二列为资源文件类型,第三列为文件访问路径
然后保存txt,并重命名为.rc
(2)将(1)中.rc和test.dll添加到工程中,到这一步就将文件test.dll加入到工程文件的EXE文件中了,通过实验我们可以发现文件追加成功后,EXE文件的大小变大了,增加的大小正好是test.dll文件的大小。
(3)分离文件
String str1 = "DLL";
String str2 = "MYDLL";
TResourceStream &rs = *new TResourceStream((int)HInstance, str2, str1.c_str());
rs.SaveToFile(‘'c:\\dest.dll");
delete &rs;
此时,exe文件里的test.dll就被分离出来,并保存为c:\\dest.dll"