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() が開始され、この関数が戻るまでダイアログ ボックスは表示されません。