/* CreateProcessによるプログラム起動と制御 2001/12/31 宍戸 輝光 */ #include LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM); HINSTANCE hInst; HWND hwMain; DWORD WINAPI func(LPVOID lpArg) { PROCESS_INFORMATION pi; STARTUPINFO si; ZeroMemory(&si,sizeof(si)); si.cb=sizeof(si); CreateProcess(NULL,(LPTSTR)lpArg,NULL,NULL,FALSE,NORMAL_PRIORITY_CLASS, NULL,NULL,&si,&pi); CloseHandle(pi.hThread); WaitForSingleObject(pi.hProcess,INFINITE); CloseHandle(pi.hProcess); PostMessage(hwMain,WM_USER,0,0); ExitThread(0); return 0; } int WINAPI WinMain (HINSTANCE hInstance,HINSTANCE hPrevInstance, PSTR szCmdLine,int iCmdShow){ MSG msg; WNDCLASS wndclass ; hInst=hInstance; /* プロセスのハンドルを保存 */ wndclass.style = CS_HREDRAW | CS_VREDRAW; wndclass.lpfnWndProc = WndProc; wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0; wndclass.hInstance = hInstance; wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION); wndclass.hCursor = LoadCursor (NULL,IDC_ARROW); wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wndclass.lpszMenuName = NULL; wndclass.lpszClassName = "CWindow"; RegisterClass(&wndclass); hwMain=CreateWindow("CWindow","CreateProcess",WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,CW_USEDEFAULT,560,128,NULL,NULL,hInstance,NULL); DragAcceptFiles(hwMain,TRUE); /* ドラッグ&ドロップ受入 */ ShowWindow(hwMain,iCmdShow); /* ウインドウを表示 */ UpdateWindow (hwMain); /* 再描画 */ while (GetMessage (&msg,NULL,0,0)) { /* メッセージループ */ TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam ; } LRESULT CALLBACK WndProc (HWND hwnd,UINT iMsg,WPARAM wParam,LPARAM lParam) { static TCHAR lpszCmd[MAX_PATH+64]; static HWND hwBtn,hwEdit; DWORD dwD; switch (iMsg) { case WM_CREATE: /* ボタン作成 */ hwBtn=CreateWindow("BUTTON","実行",WS_CHILD|WS_VISIBLE, 272,4,80,28,hwnd,(HMENU)0,hInst,NULL); /* コマンドライン入力欄作成 */ hwEdit=CreateWindow("Edit",NULL,WS_CHILD|WS_VISIBLE|WS_BORDER, 4,8,256,20,hwnd,(HMENU)1,hInst,NULL); return 0; case WM_COMMAND: if (LOWORD(wParam)==0) { /* 実行ボタン */ GetWindowText(hwEdit,lpszCmd,MAX_PATH+64); SetWindowText(hwBtn,"実行中"); EnableWindow(hwBtn,FALSE); CreateThread(NULL,0,func,(LPVOID)lpszCmd,0,&dwD); } return 0; case WM_USER: /* プログラム終了 */ SetWindowText(hwBtn,"実行"); EnableWindow(hwBtn,TRUE); return 0; case WM_DESTROY : PostQuitMessage(0); return 0; } return DefWindowProc (hwnd, iMsg, wParam, lParam) ; }