一.需求:
Setup.exe执行后文件堆A中的所有文件安装到由用户指定的路径中,文件堆B中的所有文件静默安装到C:\Program Files中,并带有进度条。
二.实现思路:
三.实现:
1.文件夹A中文件通过软件Innosetup打包为install.exe;文件夹B中放入文件夹copyfiles中。执行install.exe便可以将文件夹A中的文件发布到用户指定的路径下。Innosetup下载官网地址。
2.创建MFC,工程名为MessageBox
(1).初始设置
去掉所有按钮,加入一个静态文本和一个进度条。
右键静态文本->属性->caption,修改初始文本内容。
右键静态文本->属性->ID,必须修改,否则无法给静态文本添加成员变量,添加静态文本成员变量:右键静态文本->属性->Add member:Mytext1。
(2).更改语法
更改静态文本内容:使用Mytext1.SetWindowTextW(TEXT("安装状态:正在安装..."));
更改进度条:CProgressCtrl *myProCtrl2;myProCtrl2 = (CProgressCtrl *)GetDlgItem(IDC_PROGRESS1);myProCtrl2->SetRange(0, 100);myProCtrl2->SetPos(0);然后myProCtrl2->SetPos(20);括号内为20进度条就为20。
使用cmd命令可以方便地进行文件操作,如复制,打开等。
(3).文件夹操作
在vc中使用system调用cmd命令
system("if exist C:\\environment rmdir /s/q C:\\environment");//如果存在文件,则删除文件
system("if not exist C:\\environment md C:\\environment");//如果不存在文件,则建立文件
使用system命令会出现dos黑框,使用WinExec参数设置为SW_HIDE就不会出现黑框。同样也是执行cmd命令
WinExec("XCOPY copyfiles C:、\Program Files\\environment/S", SW_HIDE);//复制copyfiles到指定路径下。
此处若在bat中使用dos命令,则路径要写为C:\\Progra~1\\environment。
(4).调用install.exe
调用并等待另一个exe的dos程序:
system("start/wait install.exe"); //缺点仍然是有黑框
调用另一个exe的vc++程序:
void call()
{
PROCESS_INFORMATION pi;
STARTUPINFO si;
si.cb = sizeof(STARTUPINFO);
si.lpReserved = NULL;
si.lpDesktop = NULL;
si.lpTitle = NULL;
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = SW_HIDE;
si.cbReserved2 = NULL;
si.lpReserved2 = NULL;
DWORD dwExitCode;
//创建需要运行的程序进程
myProCtrl2->SetPos(50);
BOOL ret = CreateProcess(_T("install.exe"), NULL, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
if (ret)
{
CloseHandle(pi.hThread);
WaitForSingleObject(pi.hProcess, INFINITE);
GetExitCodeProcess(pi.hProcess, &dwExitCode);
CloseHandle(pi.hProcess);
}
}
此处令进度条为100%。
myProCtrl2->SetPos(100);
Mytext1.SetWindowTextW(TEXT("安装状态:安装完成,请关闭此窗口"));
(5).MFC的对话框只有在其初始化函数OnInitDialog();完全执行完return之后才能显示出来。所在如果在return之前加入的操作中不会显示出对话框,但执行完此初始化函数之后MFC变静止,为了让其自动运行功能,在OnInitDialog();的return之前加入SetTimer(1,100,NULL);设置定时器1的定时时间为100ms并开始计时。当然要在对话框界面中“类向导”->“message”->WM_TIMER->双击OnTimer进入定时器中断函数,在此中断函数中KillTimer(1);关闭定时器1,其后再进行上述操作。
(6).项目->属性->通用->Platform Toolset设置为xp便可使得生成的exe支持xp系统。选择release模式,ctrl+F5便可以生成并执行MessageBox.exe
3.把MessageBox.exe、install.exe和copyfiles放在一个文件夹下,执行MessageBox.exe便可以将copyfiles中所有文件复制到C:\Program Files中并执行install.exe。此处用winrar软件可以将这三个文件打包成Setup.exe并自动执行MessageBox.exe。但缺点是可以通过解压软件看到Setup.exe中的内容,不够保密。所以此处通过另一个小软件,打包这三个文件并设置自动执行MessageBox.exe。打包软件下载地址。
四.效果如图:
五.后记
(1).在操作文件的时候,dos命令会很大程度上简化操作。
(2).MFC快速使用笔记
建立工程:New project->MFC->MFC Apllication->Dialog based
在对话框中拖入各种控件,右击改变其属性,双击跳入操作函数。
程序执行时进入初始化函数OnInitDialog();在此函数return之前都不会出现对话框。