Windows環境でCreateProcess関数をどのように利用するか
Windowsでは、CreateProcess関数は新たなプロセスを作成するために用いられます。
CreateProcess関数は、Windows.hヘッダーファイルをインクルードする必要があります。また、関数のプロトタイプは以下のとおりです。
BOOL CreateProcessA(
LPCSTR lpApplicationName,
LPSTR lpCommandLine,
LPSECURITY_ATTRIBUTES lpProcessAttributes,
LPSECURITY_ATTRIBUTES lpThreadAttributes,
BOOL bInheritHandles,
DWORD dwCreationFlags,
LPVOID lpEnvironment,
LPCSTR lpCurrentDirectory,
LPSTARTUPINFOA lpStartupInfo,
LPPROCESS_INFORMATION lpProcessInformation
);
以下にパラメータの説明を示します
- lpApplicationName: (省略可)実行する実行ファイルの名前
- ネイティブに日本語として言い換えてください、1つの選択肢のみ必要です:lpCommandLine: (オプション)コマンドライン引数。
- (オプション)プロセスセキュリティ属性lpProcessAttributes
- スレッド属性:(オプション)スレッドセーフの属性。
- InheritHandles: 新しいプロセスが親プロセスからハンドルを継承するかどうかを示します。
- dwCreationFlags:新しいプロセスの作成方法を制御します。
- 環境: (省略可能) 新しいプロセス用の環境変数。
- lpCurrentDirectory:(省略可能) 新規プロセスのカレントディレクトリ
- lpStartupInfo: 起動情報構造体。
- プロセス情報構造体であるlp ProcessInformation
以下に CreateProcess 関数を使用して新しいプロセスを作成するサンプルを示します。
#include <Windows.h>
#include <iostream>
int main() {
STARTUPINFOA si;
PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
ZeroMemory(&pi, sizeof(pi));
// 使用CreateProcess函数创建新进程
if (!CreateProcessA("C:\\Windows\\System32\\notepad.exe", NULL, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) {
std::cout << "CreateProcess failed: " << GetLastError() << std::endl;
return 1;
}
// 等待新进程结束
WaitForSingleObject(pi.hProcess, INFINITE);
// 关闭句柄
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
return 0;
}
上の例では、CreateProcess関数を使って新しいメモ帳プロセスを作成しています。まず、STARTUPINFO構造体とPROCESS_INFORMATION構造体を定義し、ZeroMemoryでこれら2つの構造体のメモリをゼロクリアします。次に、CreateProcess関数を呼び出して新しいメモ帳プロセスを作成します。CreateProcess関数の呼び出しが成功すると、ゼロ以外の値が返され、新しいプロセスのハンドルとスレッドハンドルがPROCESS_INFORMATION構造体に格納されます。WaitForSingleObject関数を使って新しいプロセスが終了するまで待ち、CloseHandle関数を使ってプロセスハンドルとスレッドハンドルを閉じることができます。
CreateProcess関数は、ワイド文字版のCreateProcessWと、ナロー文字版のCreateProcessAを持つことに注意してください。上の例では、CreateProcessA関数を使用して新しいプロセスを作成していますが、これはナロー文字(ASCII)版を使用していることを意味します。ワイド文字(Unicode)版を使用する必要がある場合は、CreateProcessW関数を使用し、関連するパラメータの型をワイド文字版に変更してください。