掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
PCをログオフ時に強制的にアプリケーションが終了される時に何らかの処理を行うには? (ID:67452)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
こんにちは。 今回はちょっと変わった質問かもしれません。 実は、現在ローカルシステムサービスで起動するExeとクライアントが実行す るExeの2つをセットで作成しています。 サービス側では、名前付きパイプを作成し、クライアントからのイベントが上 がるのを、WaitForSingleObject関数で待機し、イベントが上がるとパイプの 読込を行うように作っています。 クライアント側のExeでは、SetEvent関数でイベントをサービスへ通知後、パ イプにデータを送り込む用に作り込んでいます。 ここで質問なのですが、パイプで渡すデータに、クライアントExeを終了する と言うフラグを設けており、クライアントexeの終了時にこのフラグをたてて パイプを送るようにしているのですが・・・ (これを行わないと、クライアントのみをいったん終了→起動と行った時点で パイプに接続できなくなってしまいます[サービスを再起動すると復活します]) このクライアント用のexeはタスクトレイに常駐し、左クリックでメニューを 表示、選択した処理の命令をパイプでサービスに送る、という動きになってい るため、ユーザがクライアントexeを意図的に終了すると言うことはあまりあ りません。 そこで問題になっているのが、コンピュータをログオフした時の動作です。 ログオフすると、そのユーザで起動していたアプリケーションは強制的に終了 されますよね? この時に、クライアント側から終了パイプを送れないため、サービスを再起動 しない限り、クライアント側からパイプを送り込めなくなってしまいます。 このような場合、クライアント/サーバそれぞれの作りを変更して改善するこ とが可能なのでしょうか? 長々とすみませんが、よろしくおねがいいたします。 念の為、サーバ側と、クライアント側のパイプのやり取りにかかわる部分のみ を抜粋してのせておきます。 [サーバ側] HANDLE hSettingThread = NULL; HANDLE hEventSvToCl = NULL; HANDLE hEventClToSv = NULL; //Serviceのメインスレッド DWORD ServiceThread(LPDWORD param) { DWORD l_dwThreadID; static HANDLE l_hPipe; DWORD dwPipeDataSize; SECURITY_ATTRIBUTES l_sa; SECURITY_DESCRIPTOR l_sd; if(!InitializeSecurityDescriptor(&l_sd, SECURITY_DESCRIPTOR_REVISION)) { return -10; } if(!SetSecurityDescriptorDacl(&l_sd, TRUE, NULL, FALSE)) { return -20; } l_sa.nLength = sizeof(SECURITY_ATTRIBUTES); l_sa.bInheritHandle = FALSE; l_sa.lpSecurityDescriptor = &l_sd; hEventClToSv = CreateEvent(&l_sa, FALSE, FALSE, "DoraClToSv"); hEventSvToCl = CreateEvent(&l_sa, FALSE, FALSE, "DoraSvToCl"); if(hEventSvToCl == NULL || hEventClToSv == NULL) { return -30; } while(1) { if(l_hPipe) { FlushFileBuffers(l_hPipe); DisconnectNamedPipe(l_hPipe); CloseHandle(l_hPipe); } l_hPipe = CreateNamedPipe(PIPE_NAME, PIPE_ACCESS_DUPLEX, PIPE_TYPE_BYTE | PIPE_WAIT, 1, 0, 0, 150, &l_sa); if(l_hPipe == INVALID_HANDLE_VALUE) { return -40; } if(!ConnectNamedPipe(l_hPipe, (LPOVERLAPPED)NULL)) { CloseHandle(l_hPipe); return -50; } hSettingThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)SettingThreadFunc, (LPVOID)l_hPipe, 0, &l_dwThreadID); if(hSettingThread == NULL) { CloseHandle(l_hPipe); return -60; } WaitForSingleObject(hSettingThread, INFINITE); } if(hEventClToSv) { CloseHandle(hEventClToSv); } if(hEventSvToCl) { CloseHandle(hEventSvToCl); } if(hSettingThread) { CloseHandle(hSettingThread); } return 0; }
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2020 Takeshi Okamoto All Rights Reserved.