none
ActiveXを挿入したVC++のプログラムをサービス化したい

    質問

  • お世話になります。

    表題のとおり、ActiveXを挿入したVC++のプログラムをサービス化したいと思っております。

    とりあえず組んでは見たのですがエラーが出てしまいます。

    エラー内容

    Debug Assertion Failed!

    File:f:\vctools\vc7libs\ship\atlmfc\src\mfc\oleinit.cpp line:78

    ・・・・・

    ActiveXをない状態にすると、普通にサービス化はできます。

    ソースを載せてない状態でいえる言葉じゃないかもしれませんが、何かアドバイス、もしくは参考になるホームページ等ありませんでしょうか?

    よろしくお願いします。

    2007年1月7日 15:39

すべての返信

  • 開発環境が何なのか分かりませんので、ただの推測…あてずっぽうですが…

    VisualStudio 2005 で oleinit.cpp のソースを眺めると、AfxGetThread() の結果が NULL でないことを ASSERT で確認しているようです。

    ですから、「AfxWinInit 関数を呼び出さずに MFC の初期化をしていない」に一票入れておきます。

     

    2007年1月7日 16:05
  • あ~・・・またやってしまった。

    すいません。WindowsXPでVisualStudio2005 MFCでダイアログベースでプログラムを作成しております。

    >「AfxWinInit 関数を呼び出さずに MFC の初期化をしていない」

    これでも十分わかりやすいんでしょうけど、初心者でもわかるようにやり方等説明していただけないでしょうか?

     

    2007年1月7日 17:02
  • MFCはソースがついているのだから探してみてはどうでしょう。結構勉強になります。

    まず、AfxWinInit()の定義を探してみるとafxwin.hにあり、"Advanced initialization: for overriding default WinMain"というコメントがついています。つまりWinMain(Cでいうところのmain())のかわりだよということが書かれています。

    そして、この実体はといえば、<VSインストールディレクトリ>\VC\atlmfc\src\mfc\appinit.cppにあります。これをみれば少なくともAfxWinInit()が何をやっているかはわかります。

    私はこの件で回答を持っているわけではないので、探し方だけ…ということで。Visual Studio 2005になってから、検索(grep)先のフォルダセットが任意で登録できるようになって便利になりました。今までcrtとかMFCのソース探すとき、秀丸のgrepではあっというまにフォルダがいなくなるので、面倒でした

    2007年1月8日 2:41
  • VisualStudio2005 で MFC アプリケーションを選択して、ダイアログベース、ActiveX コントロールにチェックを入れてある状態で発生するわけですね…。

    この場合には、MFC の初期化は CWinApp の中で実行されているでしょうから、AfxWinInit の呼び出し云々の問題は外れていそうです。

    # エントリポイントをいじられたりはしていらっしゃらないのですよね?(プロジェクトのプロパティからリンカの設定→詳細で見ることができます)

    「新規プロジェクトの作成、MFC アプリケーションを選択、ダイアログベースを選択、ActiveX コントロールを使用するにチェックを入れる」で作成したプロジェクト(MFCはDLL使用)で、リソースを開いて、右クリックメニューで ActiveX コントロールを挿入、Calendar Control 11.0 を追加…では再現できませんでした。

    どんな ActiveX コントロールを追加しても、その assertion failed は発生するのでしょうか?

     

    2007年1月8日 2:56
  • I get the same trouble and I solved it with below step.

    First, i search "AfxOleInit“ in project, and I find the it at 78 line.

    then, i replace it like this, to avoid the program called the AfxOleInit once more which casue the assert problem.

    #if 1
    _AFX_THREAD_STATE* pState = AfxGetThreadState();
    if (pState->m_bNeedTerm)
    AfxOleInit(); 
    #else
    AfxOleInit();
    #endif

    2018年10月25日 8:18