2009-04-10 108 views
0

我需要在ActiveX(ATL)項目中使用全局變量的幫助。基本上,ActiveX組件功能是導航到複合控件中的指定URL(網頁瀏覽器嵌入)。 URL字符串在開始時初始化並保存在全局變量中。這裏是我的ActiveX項目的源代碼文件。如何在ATL項目中保持全局變量值不變?

(不要關心語法,我只是想顯示代碼流)。

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(單文檔/視圖)測試應用程序中。流程是這樣的:

  1. 在應用程序的InitInstance,我打電話的ActiveX InitPlugin初始化URL字符串。
  2. 在信息對話框窗口中插入MyComponentCtrl ActiveX,通過單擊主機信息菜單項調出信息對話框。目標是當信息對話窗口彈出時,它總是可以轉到指定的URL。

我的MFC測試應用程序啓動後,我單擊信息對話框菜單,信息對話框窗口可以啓動並正確導航到該URL。

但問題是如果我關閉信息對話框,等待一段時間(大約2〜3分鐘),我試圖再次調出信息對話框,它無法導航到URL。我調試它,發現MyComponenet項目中的全局變量szURL失去了它的價值。

你能告訴我該怎麼做才能解決這個問題?

非常感謝!

Bionicoder

回答

1

它看起來像應用程序和COM可能被釋放並重新加載初始化調用和控制之間的DLL被顯示。如果主應用程序沒有任何DLL的COM組件的活動實例並隨後調用CoFreeUnusedLibraries(),則可能會發生這種情況。

您可以通過從dllMain中爲fdwReason == DLL_PROCESS_DETACH放置斷點或跟蹤來測試。如果這是問題,則在初始化調用之後但在OnInitDialog()之前觸發斷點。

如果這是問題,可以通過直接使用URL初始化控件實例來解決問題,而不是使用全局變量來使用實例狀態。

您可以在應用程序的生命週期中交替地保留對初始化接口的引用。

+0

嗨dmercredi,謝謝!你是對的。 fdwReason == DLL_PROCESS_DETACH在空閒時間後被觸發。 我需要使用全局var coz總共5個複合ctrls使用這個。所以我正在尋找保持一生的初始化參考。做這個的最好方式是什麼?我是新來的ActiveX。 – bionicoder 2009-04-11 01:11:49