Setup.exeを作成し、同時にいくつかのファイルのサイレントインストールを実現し、ユーザーが指定したパスにいくつかのファイルをインストールします

1. 要件:

Setup.exe が実行されると、ファイル ヒープ A 内のすべてのファイルがユーザーが指定したパスにインストールされ、ファイル ヒープ B 内のすべてのファイルが C:\Program Files にサイレント インストールされ、進行状況バーが表示されます。

 

2. 実装アイデア:

 

3. 実現:

1. フォルダ A のファイルはソフトウェア Innosetup によって install.exe としてパッケージ化され、フォルダ B のファイルはフォルダ copyfile に置かれます。install.exe を実行して、フォルダー A 内のファイルをユーザーが指定したパスに公開します。Innosetup ダウンロード公式 Web サイトのアドレス

2. MFC を作成します。プロジェクト名は MessageBox です。

(1).初期設定

    すべてのボタンを削除し、静的テキストと進行状況バーを追加します。

    静的テキストを右クリックして、[プロパティ] -> [キャプション] を選択し、初期テキストの内容を変更します。

    静的テキストを右クリック -> プロパティ -> ID を変更する必要があります。変更しないと静的テキストにメンバー変数を追加できません。静的テキストのメンバー変数を追加します: 静的テキストを右クリック -> プロパティ -> メンバーの追加: Mytext1。

(2).構文の変更

    静的テキスト コンテンツを変更します。Mytext1.SetWindowTextW(TEXT("インストール ステータス: インストール中...")); を使用します。

    進行状況バーを変更します: CProgressCtrl *myProCtrl2;myProCtrl2 = (CProgressCtrl *)GetDlgItem(IDC_PROGRESS1);myProCtrl2->SetRange(0, 100);myProCtrl2->SetPos(0);then myProCtrl2->SetPos(20); 進行状況バーは20です。

    コピーや開くなどのファイル操作は、cmd コマンドを使用すると便利です。

(3). フォルダ操作

    システムを使用して vc で cmd コマンドを呼び出す

system("if exist C:\\environment rmdir /s/q C:\\environment");//如果存在文件,则删除文件
system("if not exist C:\\environment md C:\\environment");//如果不存在文件,则建立文件

    システム コマンドを使用すると Dos ブラック ボックスが表示されますが、WinExec パラメータが SW_HIDE に設定されている場合はブラック ボックスは表示されません。cmdコマンドも実行します

    WinExec("XCOPY copyfiles C:, \Program Files\\environment/S", SW_HIDE);//コピーファイルを指定されたパスにコピーします。

    ここで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(); が完全に実行された後でのみ表示できます。リターン前に追加したオペレーションでダイアログボックスが表示されないが、この初期化関数の実行後に MFC が静的になる場合、自動的に実行されるようにするために、OnInitDialog(); のリターンの前に SetTimer(1,100,NULL); を追加します。タイマーの計時時間を1~100msと開始タイミングを設定します。もちろん、ダイアログ インターフェイスで、[クラス ウィザード] -> [メッセージ] -> WM_TIMER -> [OnTimer] をダブルクリックしてタイマー割り込み関数に入り、この割り込み関数では KillTimer(1); close timer 1 を実行し、以上の操作を行ってください。

(6).プロジェクト -> プロパティ -> 一般 -> プラットフォーム ツールセットを xp に設定し、生成された exe が xp システムをサポートするようにします。リリース モードを選択し、ctrl+F5 で MessageBox.exe を生成して実行できます。

3. MessageBox.exe、install.exe、copyfiles を 1 つのフォルダーに配置し、MessageBox.exe を実行して copyfile 内のすべてのファイルを C:\Program Files にコピーし、install.exe を実行します。ここでは、winrar ソフトウェアを使用して、これら 3 つのファイルを Setup.exe にパッケージ化し、MessageBox.exe を自動的に実行できます。ただし、欠点は、Setup.exe の内容が解凍ソフトウェアを通じて閲覧できるため、機密性が十分ではないことです。そこで、別の小さなソフトウェアを紹介します。これら 3 つのファイルをパックし、MessageBox.exe を自動的に実行するように設定します。パッケージ ソフトウェアのダウンロード アドレス。

4. 効果は図に示すとおりです。

 

5. 追記

(1). ファイルを操作する場合、 dos コマンドを使用すると操作が大幅に簡略化されます。

(2).MFC クイック ユース ノート

プロジェクトの構築: 新しいプロジェクト -> MFC -> MFC Amplification -> ダイアログ ベース

さまざまなコントロールをダイアログ ボックスにドラッグし、右クリックしてプロパティを変更し、ダブルクリックして操作機能にジャンプします。

プログラムが実行されると、初期化関数 OnInitDialog() が開始され、この関数が戻るまでダイアログ ボックスは表示されません。

おすすめ

転載: blog.csdn.net/u012824853/article/details/84074544