如何在ATL项目中保持全局变量值不变?

时间:2009-04-10 21:29:52

标签: c++ activex global-variables atl

我需要ActiveX(ATL)项目中全局变量使用的帮助。基本上,ActiveX组件功能是在复合控件(webbrowser embedded)中导航到指定的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(单文档/视图)测试应用程序中。流程如下:

  1. 在App Initinstance中,我调用了activeX InitPlugin来初始化URL字符串。
  2. 在“信息”对话框窗口中,插入MyComponentCtrl ActiveX,单击“大型机信息”菜单项即可显示“信息”对话框。目标是当弹出信息对话框窗口时,它总是可以转到指定的URL。
  3. 在我的MFC测试应用程序启动后,单击“信息”对话框菜单,“信息”对话框窗口可以启动并正确导航到该URL。

    但问题是如果我关闭“信息”对话框,等待一会儿(大约2~3分钟),我再次尝试调出“信息”对话框,无法导航到该URL。我调试它,发现MyComponenet项目中的全局变量szURL失去了它的价值。

    请告诉我该怎么做才能解决这个问题?

    提前多多感谢!

    Bionicoder

1 个答案:

答案 0 :(得分:1)

看起来应用程序和COM可能会在初始化调用和显示的控件之间释放和重新加载DLL。如果主应用程序没有任何DLL的COM组件的活动实例,并随后调用CoFreeUnusedLibraries(),则可能发生这种情况。

您可以通过为DdMain设置断点或跟踪来测试fdwReason == DLL_PROCESS_DETACH。如果这是问题,断点将在初始化调用之后但在OnInitDialog()之前触发。

如果这是问题,您可以通过使用实例状态而不是使用全局变量直接使用URL初始化控件实例来解决此问题。

您可以在应用程序的生命周期内保留对初始化接口的引用。