首页 新闻 会员 周边

Web调用ATL ActiveX控件,IE8无法打开网页,IE7可以运行,但提示内存访问冲突!

0
[待解决问题]

我的参考文章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);

IE8不能打开可能是需要签名吧,这一步我还没做,注册是成功了,注册表里能找到。但是程序本身应该是有问题(换成IE7打开后),我现在就是不知道这个很简单的语句,问题出在哪里?BOOL StartRes = this->_DTUStartServiceFunc(DTUListenPort); // 错误在这一行,IE提示内存访问冲突,不好意思,我的C++初学不怎么样

qinmengsu的主页 qinmengsu | 菜鸟二级 | 园豆:202
提问于:2015-04-25 17:05
< >
分享
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册