2009-04-10 71 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