200分,跪求ocx 安全警告的解决方法!!??解决后再开贴给分!

jiudon 2005-02-22 04:22:13
1、使用vc的 MFC ActiveX ControllWinzad 做的一简单控件(无界面)
2、在html页面中使用。

问题:
1、ocx打包在一客户端程序(使用前需安装)安装包,客户端程序中将该ocx注册到用户注册表!!
这种方法与制作cab文件,自动下载是否一样效果??

2、如果1成立,则怎么将我的ocx让客户机认为是安全的?也就是当该ocx运行时不出现IE的安全提示!??




...全文
355 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
jiudon 2005-03-23
  • 打赏
  • 举报
回复
问题解决了,多谢fool_leave() () 信誉:100 !!!!!
  • 打赏
  • 举报
回复
wangweixing2000(星(inspiration(灵感)))
谢谢啊,我也正好找,
fool_leave 2005-02-28
  • 打赏
  • 举报
回复
按照代码的注释要求修添加程序代码就可以避免上述的问题了。我的所有控件都是用该代码段,没有问题。

/****************
// 在ActiveX的类声明文件XXXCtrl.h的头部中添加如下代码
#include <objsafe.h>

// 在ActiveX的类声明文件C..Ctrl.h的类声明内部添加如下代码
// 接口映射
DECLARE_INTERFACE_MAP()
BEGIN_INTERFACE_PART(ObjSafe, IObjectSafety)
STDMETHOD_(HRESULT, GetInterfaceSafetyOptions) (
REFIID riid,
DWORD __RPC_FAR *pdwSupportedOptions,
DWORD __RPC_FAR *pdwEnabledOptions
);

STDMETHOD_(HRESULT, SetInterfaceSafetyOptions) (
REFIID riid,
DWORD dwOptionSetMask,
DWORD dwEnabledOptions
);
END_INTERFACE_PART(ObjSafe);
*********************************************** *******************/

/**********************
// 在ActiveX的类实现文件XXXCtrl.cpp中添加如下代码,并将CXXXCtrl更换为你的ActiveX的类名称
// IObjectSafety的接口映射
BEGIN_INTERFACE_MAP( CXXXCtrl, COleControl )
INTERFACE_PART(CXXXCtrl, IID_IObjectSafety, ObjSafe)
END_INTERFACE_MAP()


//////////////////////////////////// /////////////////////////////////////////
// IObjectSafety 成员函数
// AddRef, Release, QueryInterface
ULONG FAR EXPORT CXXXCtrl::XObjSafe::AddRef()
{
METHOD_PROLOGUE(CXXXCtrl, ObjSafe)
return pThis->ExternalAddRef();
}

ULONG FAR EXPORT CXXXCtrl::XObjSafe::Release()
{
METHOD_PROLOGUE(CXXXCtrl, ObjSafe)
return pThis->ExternalRelease();
}

HRESULT FAR EXPORT CXXXCtrl::XObjSafe::QueryInterface(
REFIID iid, void FAR* FAR* ppvObj)
{
METHOD_PROLOGUE(CXXXCtrl, ObjSafe)
return (HRESULT)pThis->ExternalQueryInterface(&iid, ppvObj);
}

const DWORD dwSupportedBits =
INTERFACESAFE_FOR_UNTRUSTED_CALLER |
INTERFACESAFE_FOR_UNTRUSTED_DATA;
const DWORD dwNotSupportedBits = ~ dwSupportedBits;

/////////////////////////////////////////////////////// //////////////////////
// CXXXCtrl::XObjSafe::GetInterfaceSafetyOptions
HRESULT STDMETHODCALLTYPE
CXXXCtrl::XObjSafe::GetInterfaceSafetyOptions(
REFIID riid,
DWORD __RPC_FAR *pdwSupportedOptions,
DWORD __RPC_FAR *pdwEnabledOptions
)
{
METHOD_PROLOGUE(CXXXCtrl, ObjSafe)

HRESULT retval = ResultFromScode(S_OK);

// 接口是否存在
IUnknown FAR* punkInterface;
retval = pThis->ExternalQueryInterface(&riid, (void * *)&punkInterface);
if (retval != E_NOINTERFACE) // 接口存在
{
punkInterface->Release(); // 释放引用
}

// We support both kinds of safety and have always both set,
// regardless of interface.
*pdwSupportedOptions = *pdwEnabledOptions = dwSupportedBits;
return retval; // E_NOINTERFACE if QI failed
}

//////////////////////////////////////////////////////////// /////////////////
// CXXXCtrl::XObjSafe::SetInterfaceSafetyOptions
HRESULT STDMETHODCALLTYPE
CXXXCtrl::XObjSafe::SetInterfaceSafetyOptions(
REFIID riid,
DWORD dwOptionSetMask,
DWORD dwEnabledOptions
)
{
METHOD_PROLOGUE(CXXXCtrl, ObjSafe)

// 接口是否存在
IUnknown FAR* punkInterface;
pThis->ExternalQueryInterface(&riid, (void * *)&punkInterface);
if (punkInterface) // 接口存在
{
punkInterface->Release(); // 释放引用
}
else // 接口不存在
{
return ResultFromScode(E_NOINTERFACE);
}
// Can't set bits we don't support.
if (dwOptionSetMask & dwNotSupportedBits)
{
return ResultFromScode(E_FAIL);
}

// Can't set bits we do support to zero
dwEnabledOptions &= dwSupportedBits;
// (We already know there are no extra bits in mask. )
if ((dwOptionSetMask & dwEnabledOptions) != dwOptionSetMask)
{
return ResultFromScode(E_FAIL);
}

// Don't need to change anything since we're always safe.
return ResultFromScode(S_OK);
}
Kudeet 2005-02-27
  • 打赏
  • 举报
回复
利用
http://msdn.microsoft.com/library/CHS/vccore/html/_atl_step_7.3a_.putting_the_control_on_a_web_page.asp
中的技术来避免安全性提示对话框。
jiudon 2005-02-27
  • 打赏
  • 举报
回复
自己顶一下,还是没有解决啊,我比较菜可能,麻烦大家给说具体些,最好有列子,谢谢了!!
jiudon 2005-02-22
  • 打赏
  • 举报
回复
关于2,楼上的几位能不能说的详细一点啊!!???????
dabears 2005-02-22
  • 打赏
  • 举报
回复
1。ActiveX在网上下载就用CAB包(记得要用证书签名)

2。好象还要用到
IObjectSafety::GetInterfaceSafetyOptions

IObjectSafety::SetInterfaceSafetyOptions

吹泡泡的小猫 2005-02-22
  • 打赏
  • 举报
回复
1。制作成cab自动下载会提示用户是否安装控件,直接注册就不会提示了

2。要实现自己IObjectSafety接口
关于这个接口msdn有完整的例子程序
anario 2005-02-22
  • 打赏
  • 举报
回复
如果你的ActiveX确实是不安全的,有这种方法吗?
wangweixing2000 2005-02-22
  • 打赏
  • 举报
回复
在你ocx空间的接口实现类的 .h 中继承类列表的末尾,并在上一行中添加一个逗号:
public IObjectSafetyImpl<CPolyCtl, INTERFACESAFE_FOR_UNTRUSTED_CALLER>
将下行添加到 .h 中的 COM 映射:
COM_INTERFACE_ENTRY(IObjectSafety)
即可

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧