我的参考文章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++初学不怎么样