BOOL CreateProcess( LPCTSTR lpApplicationName , LPTSTR lpCommandLine , LPSECURITY_ATTRIBUTES lpProcessAttributes , LPSECURITY_ATTRIBUTES lpThreadAttributes , BOOL bInheritHandles , DWORD dwCreationFlags , LPVOID lpEnvironment , LPCTSTR lpCurrentDirectory , LPSTARTUPINFO lpStartupInfo , LPPROCESS_INFORMATION lpProcessInformation );lpApplicationName には、実行ファイル名を
typedef struct _STARTUPINFO { // si
DWORD cb;
LPTSTR lpReserved;
LPTSTR lpDesktop;
LPTSTR lpTitle;
DWORD dwX;
DWORD dwY;
DWORD dwXSize;
DWORD dwYSize;
DWORD dwXCountChars;
DWORD dwYCountChars;
DWORD dwFillAttribute;
DWORD dwFlags;
WORD wShowWindow;
WORD cbReserved2;
LPBYTE lpReserved2;
HANDLE hStdInput;
HANDLE hStdOutput;
HANDLE hStdError;
} STARTUPINFO, *LPSTARTUPINFO;
cb メンバは、この構造体のサイズを指定します| 定数 |
|---|
| FOREGROUND_BLUE |
| FOREGROUND_GREEN |
| FOREGROUND_RED |
| FOREGROUND_INTENSITY |
| BACKGROUND_BLUE |
| BACKGROUND_GREEN |
| BACKGROUND_RED |
| BACKGROUND_INTENSITY |
| 定数 | メンバ |
|---|---|
| STARTF_USESHOWWINDOW | wShowWindow |
| STARTF_USEPOSITION | dwX 及び dwY |
| STARTF_USESIZE | dwXSize 及び dwYSize |
| STARTF_USECOUNTCHARS | dwXCountChars 及び dwYCountChars |
| STARTF_USEFILLATTRIBUTE | dwFillAttribute |
| STARTF_FORCEONFEEDBACK | プロセス起動時に、カーソルを砂時計に変更する |
| STARTF_FORCEOFFFEEDBACK | プロセス起動時に、カーソルを変更しない |
| STARTF_USESTDHANDLES | hStdInput、hStdOutput、及び hStdError |
| 定数 | 解説 |
|---|---|
| SW_HIDE | ウィンドウを非表示にし、他のウィンドウをアクティブにします |
| SW_MAXIMIZE | ウィンドウを最大化します |
| SW_MINIMIZE | ウィンドウを最小化し、Z 順位が次のトップレベルウィンドウをアクティブにします |
| SW_RESTORE | ウィンドウをアクティブにし、表示します ウィンドウが最小化されていたり最大化されていたりすると 元の位置とサイズに戻ります |
| SW_SHOW | ウィンドウをアクティブにして、現在の位置とサイズで表示します |
| SW_SHOWMAXIMIZED | ウィンドウをアクティブにして、最大化します |
| SW_SHOWMINIMIZED | ウィンドウをアクティブにして、最小化します |
| SW_SHOWMINNOACTIVE | ウィンドウを最小化します アクティブなウィンドウは、アクティブな状態を維持します 非アクティブなウィンドウは、非アクティブなままです |
| SW_SHOWNA | ウィンドウを現在の状態で表示します アクティブなウィンドウはアクティブな状態を維持します |
| SW_SHOWNOACTIVATE | ウィンドウを直前の位置とサイズで表示します アクティブなウィンドウはアクティブな状態を維持します |
| SW_SHOWNORMAL | ウィンドウをアクティブにして、表示します ウィンドウが最小化または最大化されているときは、位置とサイズを元に戻します |
typedef struct _PROCESS_INFORMATION { // pi
HANDLE hProcess;
HANDLE hThread;
DWORD dwProcessId;
DWORD dwThreadId;
} PROCESS_INFORMATION;
hProcess は、作成したプロセスのハンドル#include <windows.h>
#define BUTTON_OK 1
LRESULT CALLBACK WndProc(HWND hWnd , UINT msg , WPARAM wp , LPARAM lp) {
TCHAR strExe[1024];
PROCESS_INFORMATION ps;
static STARTUPINFO si;
static HWND hEditExe , hButton;
switch (msg) {
case WM_DESTROY:
PostQuitMessage(0);
return 0;
case WM_CREATE:
hEditExe = CreateWindow(
TEXT("EDIT") , TEXT("") ,
WS_CHILD | WS_VISIBLE | WS_BORDER | ES_AUTOHSCROLL ,
10 , 10 , 200 , 25 , hWnd , NULL ,
((LPCREATESTRUCT)(lp))->hInstance , NULL
);
hButton = CreateWindow(
TEXT("BUTTON") , TEXT("OK") ,
WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON ,
230 , 10 , 100 , 25 , hWnd , (HMENU)BUTTON_OK ,
((LPCREATESTRUCT)(lp))->hInstance , NULL
);
GetStartupInfo(&si);
return 0;
case WM_COMMAND:
if (LOWORD(wp) == BUTTON_OK) {
GetWindowText(hEditExe , strExe , 1024);
if (!CreateProcess(NULL , strExe , NULL , NULL , FALSE ,
0 , NULL , NULL , &si , &ps))
MessageBox(hWnd , TEXT("実行できません") , NULL , MB_OK);
}
return 0;
}
return DefWindowProc(hWnd , msg , wp , lp);
}
int WINAPI WinMain(HINSTANCE hInstance , HINSTANCE hPrevInstance ,
PSTR lpCmdLine , int nCmdShow) {
HWND hWnd;
MSG msg;
WNDCLASS winc;
winc.style = CS_HREDRAW | CS_VREDRAW;
winc.lpfnWndProc = WndProc;
winc.cbClsExtra = winc.cbWndExtra = 0;
winc.hInstance = hInstance;
winc.hIcon = LoadIcon(NULL , IDI_APPLICATION);
winc.hCursor = LoadCursor(NULL , IDC_ARROW);
winc.hbrBackground = GetStockObject(WHITE_BRUSH);
winc.lpszMenuName = NULL;
winc.lpszClassName = TEXT("KITTY");
if (!RegisterClass(&winc)) return 1;
hWnd = CreateWindow(
TEXT("KITTY") , TEXT("Kitty on your lap") ,
WS_OVERLAPPEDWINDOW | WS_VISIBLE ,
CW_USEDEFAULT , CW_USEDEFAULT ,
CW_USEDEFAULT , CW_USEDEFAULT ,
NULL , NULL , hInstance , NULL
);
if (hWnd == NULL) return 1;
while (GetMessage(&msg , NULL , 0 , 0 )) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}

BOOL CreateProcess( LPCTSTR lpApplicationName , LPTSTR lpCommandLine , LPSECURITY_ATTRIBUTES lpProcessAttributes , LPSECURITY_ATTRIBUTES lpThreadAttributes , BOOL bInheritHandles , DWORD dwCreationFlags , LPVOID lpEnvironment , LPCTSTR lpCurrentDirectory , LPSTARTUPINFO lpStartupInfo , LPPROCESS_INFORMATION lpProcessInformation );新しいプロセスを生成します
| 定数 | 解説 |
|---|---|
| 作成フラグ | |
| CREATE_DEFAULT_ERROR_MODE | 新しいプロセスに、呼び出し側プロセスのエラーモードを継承させません 新しいプロセスには、デフォルトのエラーモードを適用します |
| CREATE_NEW_CONSOLE | 新しいプロセスに、親のコンソールを継承させず、新しいコンソールを持たせます DETACHED_PROCESS と同時に指定することはできません |
| CREATE_NEW_PROCESS_GROUP | 新しいプロセスを、新しいプロセスグループのルートプロセスにします |
| CREATE_SEPARATE_WOW_VDM | Windows NT: 新しいプロセスを、プライベートな仮想 DOS マシン上で実行させます このフラグは、16 ビットのアプリケーションを起動するときにだけ有効です |
| CREATE_SHARED_WOW_VDM | Windows NT: WIN.INI ファイルの Windows セクション内の DefaultSeparateVDM スイッチが TRUE のとき そのスイッチを無効にし、新しいプロセスを共有された 仮想 DOS マシン上で実行させます このフラグは、16 ビットのアプリケーションを起動するときにだけ有効です |
| CREATE_SUSPENDED | 新しいプロセスを、プライマリースレッドをサスペンド状態にして起動します スレッドを実行するには、ResumeThread() 関数を使います |
| CREATE_UNICODE_ENVIRONMENT | lpEnvironment パラメータが指す環境ブロックが Unicode 文字を使用していることを示します デフォルトでは、ANSI 文字が使用されているものとみなされます |
| DEBUG_PROCESS | 呼び出し側プロセスがデバッガーのときに指定します 新しいプロセスはデバッグされるプロセスとして扱われ そのプロセス内で起きるすべてのデバッグイベントが 呼び出し側スレッドに通知されます |
| DEBUG_ONLY_THIS_PROCESS | 呼び出し側プロセスがデバッガーのときに指定します このフラグを指定しない場合 新しいプロセスは呼び出し側プロセスのデバッガーで デバッグされるほかのプロセスになります |
| DETACHED_PROCESS | 新しいプロセスに、親プロセスのコンソールへのアクセスを持たせません 新しいプロセスは、AllocConsole() 関数を使って新しいコンソールを作成できます CREATE_NEW_CONSOLE フラグと同時に指定することはできません |
| 優先順位フラグ | |
| HIGH_PRIORITY_CLASS | タイムクリティカルなタスクを実行するプロセスであることを示します |
| IDLE_PRIORITY_CLASS | システムがアイドル状態のときにだけ実行するプロセスであることを示します |
| NORMAL_PRIORITY_CLASS | 特別なスケジューリングを必要としない 一般的なプロセスであることを示します |
| REALTIME_PRIORITY_CLASS | 最も高い優先順位クラスを持つプロセスであることを示します このクラスのスレッドは、重要なタスクを行うオペレーティングシステムの プロセスを含むほかのすべてのプロセスのスレッドよりも先に実行されます 少しでも長い時間実行すると、ディスクキャッシュがフラッシュされなくなったり マウスが応答しなくなったりします |