0

我需要有关 ActiveX(ATL) 项目中全局变量使用的帮助。基本上,ActiveX 组件功能是导航到复合控件中的指定 URL(嵌入 Web 浏览器)。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. 在 Information 对话框窗口中,插入 MyComponentCtrl ActiveX,通过单击 Mainframe Information 菜单项弹出 Information 对话框。目标是当信息对话框窗口弹出时,它总是可以转到指定的url。

在我的 MFC 测试应用程序启动后,我单击信息对话框菜单,信息对话框窗口可以打开并正确导航到 url。

但问题是,如果我关闭信息对话框,稍等片刻(大约 2~3 分钟),我试图再次打开信息对话框,它无法导航到 URL。我调试它,发现 MyComponenet 项目中的全局变量 szURL 失去了它的价值。

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

提前非常感谢!

仿生编码器

4

1 回答 1

1

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

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

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

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

于 2009-04-10T23:40:01.700 回答