SHOJI's Code
 仕事や趣味で書いた各種言語のプログラミングコード(エクセルVBA,PHP,C/C++/C#,JavaScript等)、その他雑記。
2018.09<<12345678910111213141516171819202122232425262728293031>>2018.11
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

最近、サービスをプログラミングした。

で、サービスで検出した異常をユーザーに通知したいと思ったのだが…。
MessageBox(NULL, "...", "...", MB_ICONEXCLAMATION|MB_OK|MB_SERVICE_NOTIFICATION);

と、してしまうと、ユーザーが応答するまでサービスの処理が止まってしまう。
メッセージボックス表示部分だけをスレッドにしてみたのだけど、連続して異常が発生した場合など、なぜかうまくいかない(多分これは私がどっかミスってるんだと思うが…)

結局、無理矢理、メッセージ表示するためのEXEを作成(といっても自分自身。オプションで分岐するようにしてある)。その実行されたEXEはサービスから実行されているからユーザーはシステムアカウント。ってことでそこでも、上記のようなコードを記述。XPでは正常に表示できた。(かなり邪道な感じが拭えないが…)

が、これをVistaに持ってくるとうまく表示されない。いろいろ調べていると、どうやら、サービスのセッションがXPとVistaでは異なるということらしい(XPではサービスと最初のユーザーセッションがセッション0、Vista以降ではサービスはセッション0でユーザーのセッションはセッション1から、ということらしい)

で、また、いろいろ調べた結果、次のように変更。
static BOOL WINAPI ShowMessage(LPTSTR pszMessage, UINT flag)
{
PWTS_SESSION_INFO pwtssi;
DWORD n,i;

n = 0;
if (!WTSEnumerateSessions(WTS_CURRENT_SERVER_HANDLE, 0, 1, &pwtssi, &n)) {
// エラー処理...
return FALSE;
}

for (i=0;i<n;i++) {
WTSSendMessage(
WTS_CURRENT_SERVER_HANDLE, pwtssi[i].SessionId,
_T(SERVICE_DISPLAY_NAME), lstrlen(_T(SERVICE_DISPLAY_NAME))*sizeof(TCHAR),
pszMessage, lstrlen(pszMessage)*sizeof(TCHAR),
flag,
0,
&dwResponse,
FALSE);
}
WTSFreeMemory(pwtssi);

return TRUE;
}


WTSSendMessageは指定したセッションにのメッセージ表示を行うもの。今回は異常表示ということで、すべてのセッションに送っている。
と、書いていて気がついた。これってセッション0にも送っているのかな?…XPは良いけど、Vistaや7はまずい?…それともVistaや7のセッション0は画面がないから失敗するだけでOKなのかな?

テーマ:プログラミング - ジャンル:コンピュータ
コメント
この記事へのコメント
コメントを投稿する

管理者にだけ表示を許可する
トラックバック
この記事のトラックバックURL
この記事へのトラックバック
copyright © 2004-2006 SHOJI, Powered By FC2ブログ all rights reserved.
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。