编写Setup.exe,同时实现部分文件静默安装,和部分文件由用户指定路径安装

一.需求:

Setup.exe执行后文件堆A中的所有文件安装到由用户指定的路径中,文件堆B中的所有文件静默安装到C:\Program Files中,并带有进度条。

 

二.实现思路:

编写Setup.exe,同时实现部分文件静默安装,和部分文件由用户指定路径安装_第1张图片

 

三.实现:

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。打包软件下载地址。

四.效果如图:

编写Setup.exe,同时实现部分文件静默安装,和部分文件由用户指定路径安装_第2张图片

 

五.后记

(1).在操作文件的时候,dos命令会很大程度上简化操作。

(2).MFC快速使用笔记

建立工程:New project->MFC->MFC Apllication->Dialog based

在对话框中拖入各种控件,右击改变其属性,双击跳入操作函数。

程序执行时进入初始化函数OnInitDialog();在此函数return之前都不会出现对话框。

你可能感兴趣的:(MFC)