パスワードを忘れた? アカウント作成
662413 journal

Ab.の日記: さーびすさーびす~

日記 by Ab.
Windows でのちょろいサービスプログラムを書こうと思うんだけど、
  1. C/C++ でスクラッチで起こす。
  2. VC++/ATL で CAtlServiceModuleT からクラスを派生させて作る。
  3. VC#/Windowsサービスプロジェクト から作る。
  4. (VB.Net/Windowsサービスプロジェクト から作る)

と沢山選択枝があって迷いますねー。

時間がたっぷりあればスクラッチで簡易フレームワークから起こして作るんだけど、それだけ手間をかけて作っても、あと何年使用可能なのか、何回再利用するのだろうか、と考えると二の足を踏みまくってしまうし…

VC# は試しに何もしないサービスを作ってインストールして起動してみたら、メモリ消費8Mとか言われて萎えるし…まー調べたら共通のランタイムが鬼のように読み込まれてたので .Net framework で作ったモノならそこら辺のメモリは共用されるだろうから、見た目ほど激しいものじゃないんだろうけど。

やっぱり現実的なのは ATL かなぁ…
って、プロジェクト試しに作ってみたら、サービスを登録してもサービス起動してくれないよ…
んで、色々ぐぐったら出てきました The Code Project - Migrating ATL service applications to Visual C++.NET - ATL の Phase 4 の第7項ですな。
つまり CAtlServiceModuleT の PreMessageLoop() にバグがあるので、派生クラスで override して workaround せよ、と。

HRESULT CDerivedServiceModule::PreMessageLoop(int nShowCmd) {
  HRESULT hr = __super::PreMessageLoop(nShowCmd);
#if _ATL_VER == 0x0700
  if (SUCCEEDED(hr) && !m_bDelayShutdown)
    hr = CoResumeClassObjects();
#endif
  return hr;
}

んで、空のサービスを動かしてみたら、消費メモリは2Mちょっと。
というわけで ATL で行ってみるかな…

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
typodupeerror

人生の大半の問題はスルー力で解決する -- スルー力研究専門家

読み込み中...