我需要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(单文档/视图)测试应用程序中。流程如下:
在我的MFC测试应用程序启动后,单击“信息”对话框菜单,“信息”对话框窗口可以启动并正确导航到该URL。
但问题是如果我关闭“信息”对话框,等待一会儿(大约2~3分钟),我再次尝试调出“信息”对话框,无法导航到该URL。我调试它,发现MyComponenet项目中的全局变量szURL失去了它的价值。
请告诉我该怎么做才能解决这个问题?
提前多多感谢!
Bionicoder
答案 0 :(得分:1)
看起来应用程序和COM可能会在初始化调用和显示的控件之间释放和重新加载DLL。如果主应用程序没有任何DLL的COM组件的活动实例,并随后调用CoFreeUnusedLibraries(),则可能发生这种情况。
您可以通过为DdMain设置断点或跟踪来测试fdwReason == DLL_PROCESS_DETACH。如果这是问题,断点将在初始化调用之后但在OnInitDialog()之前触发。
如果这是问题,您可以通过使用实例状态而不是使用全局变量直接使用URL初始化控件实例来解决此问题。
您可以在应用程序的生命周期内保留对初始化接口的引用。