问题描述
- Web调用ATL ActiveX控件,IE8无法打开网页,IE7可以运行,但提示内存访问冲突!
-
我的参考文章http://blog.csdn.net/u010258235/article/details/16823543,自己按照这个步骤试了一下,但是打开html网页时提示如下:Internet Explorer 已经为了帮助保护您的计算机而关闭此网页
运行不正常的加载项或恶意加载项导致 Internet Explorer 关闭此网页。
您可以执行以下操作:
转到主页尝试返回查看的页面 更多信息
我在工具-〉Internet选项-〉安全中将安全级别中所有ActiveX相关的选项都启用了以后,IE仍然提示“当前安全设置会使计算机有风险”,继续运行后还是提示修复设置,网页上仍然显示上面的“关闭网页”,上面的示例还有网上其他文章里不是说用IObjectSafety就可以了吗?可我将IE安全级别设到最低还是无法打开网页!换成IE7后没有安全问题了,可以运行,但是提示内存访问冲突,断点在调用外部DLL时:
我的源代码如下:
// DTUTest.h : CDTUTest 的声明#pragma once
#include "resource.h" // 主符号
#include "windows.h"#include "AOETest_i.h"
#include "_IDTUTestEvents_CP.h"#if defined(_WIN32_WCE) && !defined(_CE_DCOM) && !defined(_CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA)
#error "Windows CE 平台(如不提供完全 DCOM 支持的 Windows Mobile 平台)上无法正确支持单线程 COM 对象。定义 _CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA 可强制 ATL 支持创建单线程 COM 对象实现并允许使用其单线程 COM 对象实现。rgs 文件中的线程模型已被设置为“Free”,原因是该模型是非 DCOM Windows CE 平台支持的唯一线程模型。"
#endif// CDTUTest
class ATL_NO_VTABLE CDTUTest :
public IObjectSafetyImpl, // 安全提示解除,--当运行浏览器调用时,不会提示安全问题。
public CComObjectRootEx,
public CComCoClass,
public IConnectionPointContainerImpl,
public CProxy_IDTUTestEvents,
public IObjectWithSiteImpl,
public IDispatchImpl
{
public:typedef BOOL (*DTUStartServiceFunc)(USHORT); // 定义一个指向DSStartService函数地址的指针类型。
HMODULE hDllModule; // 指向动态库的句柄
DTUStartServiceFunc _DTUStartServiceFunc;
CDTUTest()
{
hDllModule = LoadLibrary((LPCWSTR) "DTUdll.dll"); // 装载动态库
if(hDllModule != NULL) // 成功调用动态库
_DTUStartServiceFunc = (DTUStartServiceFunc)GetProcAddress(hDllModule,"DSStartService"); // 从动态库中取得DSStartService函数的地址
else
FreeLibrary(hDllModule); // 未成功调用动态库,释放资源
}DECLARE_REGISTRY_RESOURCEID(IDR_DTUTEST)
BEGIN_COM_MAP(CDTUTest)
COM_INTERFACE_ENTRY(IDTUTest)
COM_INTERFACE_ENTRY(IDispatch)
COM_INTERFACE_ENTRY(IConnectionPointContainer)
COM_INTERFACE_ENTRY(IObjectWithSite)
COM_INTERFACE_ENTRY(IObjectSafety) // 安全提示解除,--当运行浏览器调用时,不会提示安全问题。
END_COM_MAP()BEGIN_CONNECTION_POINT_MAP(CDTUTest)
CONNECTION_POINT_ENTRY(__uuidof(_IDTUTestEvents))
END_CONNECTION_POINT_MAP()// STDMETHOD(InterfaceSupportsErrorInfo)(REFIID riid);
DECLARE_PROTECT_FINAL_CONSTRUCT()HRESULT FinalConstruct()
{
return S_OK;
}void FinalRelease()
{
}public:
STDMETHOD(DTUStart)(USHORT DTUListenPort);
};OBJECT_ENTRY_AUTO(__uuidof(DTUTest), CDTUTest)
// DTUTest.cpp : CDTUTest 的实现#include "stdafx.h"
#include "DTUTest.h"// CDTUTest
STDMETHODIMP CDTUTest::DTUStart(USHORT DTUListenPort)
{
// TODO: 在此添加实现代码
if(_DTUStartServiceFunc != NULL) // 是否成功取得函数地址
{
BOOL StartRes = this->_DTUStartServiceFunc(DTUListenPort); // 错误在这一行,IE提示内存访问冲突
}
else
{}
this->_AtlFinalRelease();return S_OK;
}调用的DLL中DSStartService函数的声明:
BOOL DSStartService(u16t uiListenPort);
解决方案
首先要正确注册ActiveX. 其次要有合法签名,否则浏览器会不认可。然后就是你的控件本身运行起来后的指针,函数估计有问题。