ようこそ ゲスト さん、新規登録(無料)して気になる疑問を解決しませんか?

質問

QNo.3992930 ウィンドウを持たないアプリケーションにデータを送信したい
質問者:saigatou  あるサービスコントロールマネージャに登録されているアプリケーションにメッセージIDと、データを送りたいのですが、ウィンドウを持っていない為、データの送り方が分かりません。

これが仮にウィンドウを持つアプリケーションだったならば、
PreCreateWindow()内で
if (cs.lpszName)
{
WNDCLASS wc;
::GetClassInfo(AfxGetInstanceHandle(), cs.lpszClass, &wc);
wc.lpszClassName = _T("サービス名"); // 好きな名前を設定
AfxRegisterClass(&wc);
cs.lpszClass = wc.lpszClassName;
}
とでもしておいたならば、
hWnd=FindWindow(_T("サービス名"),ウィンドウタイトル);
とすればよく、
PostMessage()を使う事が出来ると思うのですが、このPreCreateWindow()を通らない為に、この処理が使えないのです。

 現状、サービスコントロールマネージャから起動するからか、ウィンドウがSpy++では見られない(生成していない?)状態です。exeを直に起動する分にはウィンドウが生成され、Spy++でも、所定の通り、「'サービス名'サービス名」として確認できます。FindWindow()でハンドルが取得でき、データも送れました。
 が、これでは当然ながら見える形でウィンドウが生成されているわけで、それでは都合が悪く、結局、こちらの方法は採用不可となります。

 どなたか、SCMで起動した場合のデータ送付方法をご存じではないでしょうか?

よろしくお願いします。
困り度:
  • 困っています
質問投稿日時:
08/05/02 20:12

回答

ANo.1 # MSDNで検索した限りの知識なので的外れなのかも …
使うとすれば OpenSCManagerでSCMデータベースのハンドルを取得
OpenServiceでサービスハンドルを取得
ControlServiceやHandlerなどで制御といった具合なように思います

作ったハンドルなどはCloseServiceHandleなどで閉じるのをお忘れなく
回答者:redfox63
種類:アドバイス
どんな人:一般人
自信:参考意見
回答日時:
08/05/02 21:19
この回答への補足この回答に補足をつける(質問者のみ)
この回答へのお礼この回答にお礼をつける(質問者のみ)