实例编程:用VC写个文件捆绑工具(2)
好了,现在test2.exe文件已经读出来了,接下来就是要读test1.exe的内容,过程大同小异
fSource.Seek(iSourceLength-30,CFile::begin);//将文件指针移动到len1的开头
ZeroMemory(buffer,40);
fSource.Read(buffer,30);//读取len1的内容,len1的内容是test1.exe文件的长度
int filelen = atoi(buffer);
fSource.Seek(iSourceLength-60-filelen-iTargetLength,CFile::begin);//将文件指针移动到test1.exe文件头
fTarget.Open("c: est2.exe",CFile::modeCreate | CFile::modeWrite | CFile::modeNoTruncate);
pBuffer = new char[filelen];
ZeroMemory(pBuffer,filelen);
fSource.Read(pBuffer,filelen);//将test1.exe文件读到缓冲区
fTarget.Write(pBuffer,filelen);//将test1.exe文件写入c: est1.exe
delete []pBuffer;
fSource.Close();
fTarget.Close();
现在我们就用CreateProcess来运行创建两个新进程就可以运行c: est1.exe和c: est2.exe了。创建新进程的代码很简单我就不写了。
这部分是写完了,但是我们捆绑文件的部分还没写完,重新新建一个基于对话框的程序。
CFile fSource("c:aaa.exe",CFile::modeReadWrite | CFile::modeNoTruncate); //就是上面我们写的aaa.exe
fSource.SeekToEnd();//移动文件指针到文件尾
CFile fFirstFile(m_FirstFile,CFile::modeRead | CFile::modeNoTruncate); //这段代码是把test1.exe添加到aaa.exe尾部
int ilen = fFirstFile.GetLength();
int len = ilen;
char *pBuffer = new char[ilen];
ZeroMemory(pBuffer,ilen);
fFirstFile.Read(pBuffer,ilen);
fSource.Write(pBuffer,ilen);
fFirstFile.Close();
delete pBuffer;
CFile fSecondFile(m_SecondFile,CFile::modeRead | CFile::modeNoTruncate); //这段代码是捆绑test2.exe的
ilen = fSecondFile.GetLength();
pBuffer = new char[ilen];
ZeroMemory(pBuffer,ilen);
fSecondFile.Read(pBuffer,ilen);
fSource.Write(pBuffer,ilen);
fSecondFile.Close();
delete pBuffer;
char tempbuffer[30];//将test2.exe的长度转换成字符串,如果长度不够30就添加空格至30,再添加到文件尾部
ZeroMemory(tempbuffer,30);
itoa(ilen,tempbuffer,10);
while (strlen(tempbuffer) < 30)
{
strcat(tempbuffer," ");
}
fSource.Write(tempbuffer,30);
ZeroMemory(tempbuffer,30);//将test2.exe的长度转换成字符串,如果长度不够30就添加空格至30,再添加到文件尾部
itoa(len,tempbuffer,10);
while (strlen(tempbuffer) < 30)
{
strcat(tempbuffer," ");
}
fSource.Write(tempbuffer,30);
fSource.Close();
::MessageBox(NULL,"捆绑完成","提示",MB_ICONINFORMATION);
OK,这样我们就生成了一个新文件target.exe,这个target.exe的结构上面已经说了。执行target.exe后,aaa.exe首先得到执行,然后test1.exe和test2.exe都会执行。为了增强隐蔽性,我们在aaa.exe的OnInitDialog()函数里写下如下代码:
ModifyStyleEx(WS_EX_APPWINDOW, WS_EX_TOOLWINDOW);
::MoveWindow(m_hWnd,0,0,0,0,TRUE);
这样aaa.exe执行的时候没窗口,也不会在任务栏上显示任务条。