0

ActiveX(ATL) プロジェクトでのグローバル変数の使用についてサポートが必要です。ActiveX コンポーネントの基本的な機能は、複合コントロール (webbrowser 組み込み) で指定された URL にナビゲートすることです。URL 文字列は最初に初期化され、グローバル変数に保存されます。これが私の ActiveX プロジェクトのソース コード ファイルです。

(文法は気にしないでください。コード フローを示したいだけです)。

    MyComponentInit.cpp


    // MyComponentInit.cpp : Implementation of MyComponentInit.cpp

    #include "stdafx.h"
    #include <ios> 

    char szURL[1024] = "\0";   // global variable holding URL string

    STDMETHODIMP CMyComponentInit::InitPlugin(BSTR url)
    {
       // convert BSTR to string
         ...... 

           memcpy(szURL, szUrl, len);
    }




    MyComponentCtrl.cpp 

    // MyComponentCtrl.cpp : Implementation of  MyComponentCtrl.cpp

    #include "stdafx.h"

    extern char  szURL[1024]

    LRESULT CMyComponentCtrl::OnInitDialog(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
    {
       ......

        m_spWebbrowser->Navigate(szURL, &v, &v, &v, &v);
     }

mycomponent ActiveX の使用は、MFC SDI (Single Doc/View) テスト アプリケーションで行われます。流れは次のようになります。

  1. App Initinstance では、activeX InitPlugin を呼び出して URL 文字列を初期化しました。
  2. [情報] ダイアログ ウィンドウで、MyComponentCtrl ActiveX を挿入します。[メインフレーム情報] メニュー項目をクリックすると、[情報] ダイアログが表示されます。目標は、情報ダイアログ ウィンドウがポップアップしたときに、常に指定された URL に移動できるようにすることです。

MFC テスト アプリが起動した後、[情報] ダイアログ メニューをクリックすると、[情報] ダイアログ ウィンドウが表示され、URL に正しく移動できます。

しかし、問題は、情報ダイアログを閉じて、しばらく (約 2 ~ 3 分) 待ってから、再度情報ダイアログを表示しようとしたところ、URL に移動できなかったことです。デバッグしたところ、MyComponenet プロジェクトのグローバル変数 szURL の値が失われていることがわかりました。

この問題を解決するにはどうすればよいか教えてください。

よろしくお願いします!

バイオニコダー

4

1 に答える 1

1

アプリケーションとCOMが、初期化呼び出しと表示されているコントロールの間にDLLを解放して再ロードしているようです。これは、メインアプリにDLLのCOMコンポーネントのアクティブなインスタンスがなく、その後CoFreeUnusedLibraries()を呼び出す場合に発生する可能性があります。

fdwReason == DLL_PROCESS_DETACHのDllMainからブレークポイントまたはトレースを配置することにより、これをテストできます。これが問題である場合、ブレークポイントは初期化呼び出しの後、OnInitDialog()の前にトリガーされます。

これが問題である場合は、グローバル変数を使用する代わりにインスタンスの状態を使用して、URLを使用してコントロールインスタンスを直接初期化することで解決できます。

または、アプリケーションの存続期間中、初期化インターフェースへの参照を保持することもできます。

于 2009-04-10T23:40:01.700 に答える