質問 |
||
| 質問者:blackiori | ATLサービスの開発で困っています | |
|---|---|---|
困り度:
|
VC6.0でATLサービスの開発を行っています。 サービスの概要はサービスが開始するとサーバーを起動し、 サービスを停止させるとサーバーを終了させるというものです。 サーバーはコンソールアプリで別の担当者が作成しています。 CreateProcess()関数でサーバーを開き、そこで取得したプロセスIDを元にGenerateConsoleCtrlEvent()関数でサーバーを閉じようと試みていますが、サービスを停止しても動いたままになってしまっています。 そこで、GetLastErr()関数で調べてみるとエラーコード6、つまり「ハンドルが無効です」というエラーが返ってきていました。 原因がさっぱりわかりませんし、上からは「Ctrl+C」で終了するように言われています。 あちこちのサイトを見回ってみましたが、似たような質問はあるものの回答がありません。 どなたか原因がわかる方、若しくは別のコンソールを閉じる解決策をご存知の方がいらっしゃいましたら回答のほうお願いします。 ソースコードに関してですが、停止処理に入るときのデバッグ方法がわからなかった為、実験的にプロセス作成直後で終了を行おうとしています。 STARTUPINFO構造体、PPROCESS_INFORMATION構造体はグローバル変数です。 〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜 inline void CServiceModule::Handler(DWORD dwOpcode) { switch (dwOpcode) { case SERVICE_CONTROL_STOP: // アプリケーション終了 GenerateConsoleCtrlEvent(CTRL_C_EVENT, process.dwProcessId); // スレッド、プロセス破棄 ::CloseHandle(process.hThread); ::CloseHandle(process.hProcess); // サービス停止手続き中 SetServiceStatus(SERVICE_STOP_PENDING); // スレッドへの終了命令 PostThreadMessage(dwThreadID, WM_QUIT, 0, 0); break; 〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜 // タイマー作成 SetTimer(NULL, NULL, 1, NULL); // 構造体初期化 ZeroMemory(&start,sizeof(start)); ZeroMemory(&process,sizeof(process)); // スタートアップ情報サイズ確保 start.cb = sizeof(start); // アプリケーション起動 CreateProcess(NULL, (LPTSTR)PATH, NULL, NULL, TRUE, DETACHED_PROCESS | CREATE_NEW_PROCESS_GROUP, NULL, NULL, &start, &process); // 成否実験 GenerateConsoleCtrlEvent(CTRL_C_EVENT, process.dwProcessId); long i=GetLastError(); // メッセージループ MSG msg; while (GetMessage(&msg, 0, 0, 0)){ if (msg.message == WM_TIMER){ // 起動プロセスの監視 GetExitCodeProcess(process.hProcess, &ExitCode); // プロセスが終了したらサービスも終了 if(ExitCode != STILL_ACTIVE) _Module.Handler(SERVICE_CONTROL_STOP); } DispatchMessage(&msg); } 〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜 |
|
質問投稿日時:08/04/18 14:46 質問番号:3957112 |
||