[100分]请教一个vc6写的ATL服务端组件在客户端数字签名安装的问题

yangbc 2004-08-03 04:05:41
首先声明:数字证书的制作我已经会了,也可以绑定组件了,现在是在客户端的执行有问题,我在本机访问没问题,应该不是组件的问题。
我用的是vc6的ATL开发了一个组件,想在网页中用<object >来调用,数字证书我都做好了,也和打包文件绑定了,但是客户端还是出现安全问题,不能显示
浏览器代码如下:
<HTML>
<HEAD>
<TITLE>使用自制组件制作的无刷新无闪烁信息通知(服务器端-->客户端)</TITLE>
<META NAME="GENERATOR" CONTENT="CutePage 2.0">
</HEAD>
<BODY onload="timer()">
<form name=meizz>
<input size=69 type=text name=clock style="border: 0px;background-color: transparent">
</form>
<object Classid="clsid:CC471E2F-CD02-4788-8FC3-55D2A424186C" Id="MyComponent" Width="0" Height="0" viewastext Codebase="http://10.151.172.109/asppicture/asp_zujian.cab#version=1,0,0,1">
<SPAN STYLE="color:red">ActiveX 控件装入失败!-- 请检查浏览器的安全设置。</SPAN>
</object>
<script language="Javascript">
<!--
function timer()
{
var now = new Date();
var h = ("00"+ now.getHours()).replace(/.*(\w{2})$/, "$1");
var m = ("00"+ now.getMinutes()).replace(/.*(\w{2})$/, "$1");
var s = ("00"+ now.getSeconds()).replace(/.*(\w{2})$/, "$1");
str2=MyComponent.GetRecordset2();
document.meizz.clock.value = h +":"+ m +":"+ s+str2;
//document.meizz.clock.value = h +":"+ m +":"+ s;

//MyComponent.get_MyFloat(2141)
setTimeout('timer()',1000);
}
// -->
</script>
</BODY>
</HTML>

出错说:“此页上的activex控件可能和本页上的其他部件的交流不安全,你想允许这种交流么?”
我选择允许后出现vc++ runtime liberary 错误,然后浏览器就被关闭了。

我现在怀疑我上面的代码有问题,我在本机上用ie浏览这个叶面没有问题,只是从别的机器上访问的时候出现了这个问题

不知道如何解决,只好求救于大家
...全文
278 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
basboy 2004-08-04
  • 打赏
  • 举报
回复
BEGIN_CATEGORY_MAP(YOURCLASSNAME)
IMPLEMENTED_CATEGORY(CATID_SafeForScripting)
IMPLEMENTED_CATEGORY(CATID_SafeForInitializing)
END_CATEGORY_MAP()

sorry:)
basboy 2004-08-04
  • 打赏
  • 举报
回复
在atl中没有那么复杂,在实现类声明中加入
BEGIN_CATEGORY_MAP(YOURCLASSNAME)
IMPLEMENTED_CATEGORY(CATID_SateForScripting)
IMPLEMENTED_CATEGORY(CATID_SateForInitializing)
END_CATEGORY
basboy 2004-08-04
  • 打赏
  • 举报
回复
不是的,是你的代码有问题,因为你的组件没有注册为安全类别的
gjd111686 2004-08-04
  • 打赏
  • 举报
回复
http://www.vckbase.com/document/viewdoc.asp?id=728

我们在编写ActiveX控件时,如果用在浏览器中,经常都会弹出现在运行的脚本不安全的提示, 如果给客户使用,将会带来极大不便。按照MSDN的介绍通常有两种一种是实现IObjectSafe接口,一种是通过修改注册表的方法。一般如果用ATL开发ActiveX控件,就用实现ObjectSafe接口的方法。如果用MFC开发,我觉得还是用修改注册表的方法比较方便。下面我们将第二种方法:

要包括两个文件

#include "comcat.h"
#include "Objsafe.h"
// 本控件的CLSID,注册表用 const GUID CDECL CLSID_SafeItem =
{ 0x7AE7497B, 0xCAD8, 0x4E66, { 0xA5,0x8B,0xDD,0xE9,0xBC,0xAF,0x6B,0x61 } };
// 创建组件种类 HRESULT CreateComponentCategory(CATID catid, WCHAR* catDescription)
{
ICatRegister* pcr = NULL ;
HRESULT hr = S_OK ;

hr = CoCreateInstance(CLSID_StdComponentCategoriesMgr,
NULL, CLSCTX_INPROC_SERVER, IID_ICatRegister, (void**)&pcr);
if (FAILED(hr))
return hr;

// Make sure the HKCR\Component Categories\{..catid...}
// key is registered.
CATEGORYINFO catinfo;
catinfo.catid = catid;
catinfo.lcid = 0x0409 ; // english

// Make sure the provided description is not too long.
// Only copy the first 127 characters if it is.
int len = wcslen(catDescription);
if (len>127)
len = 127;
wcsncpy(catinfo.szDescription, catDescription, len);
// Make sure the description is null terminated.
catinfo.szDescription[len] = ''\0'';

hr = pcr->RegisterCategories(1, &catinfo);
pcr->Release();

return hr;
}
// 注册组件种类HRESULT RegisterCLSIDInCategory(REFCLSID clsid, CATID catid)
{
// Register your component categories information.
ICatRegister* pcr = NULL ;
HRESULT hr = S_OK ;
hr = CoCreateInstance(CLSID_StdComponentCategoriesMgr,
NULL, CLSCTX_INPROC_SERVER, IID_ICatRegister, (void**)&pcr);
if (SUCCEEDED(hr))
{
// Register this category as being "implemented" by the class.
CATID rgcatid[1] ;
rgcatid[0] = catid;
hr = pcr->RegisterClassImplCategories(clsid, 1, rgcatid);
}
if (pcr != NULL)
pcr->Release();
return hr;
}
// 卸载组件种类HRESULT UnRegisterCLSIDInCategory(REFCLSID clsid, CATID catid)
{
ICatRegister* pcr = NULL ;
HRESULT hr = S_OK ;

hr = CoCreateInstance(CLSID_StdComponentCategoriesMgr,
NULL, CLSCTX_INPROC_SERVER, IID_ICatRegister, (void**)&pcr);
if (SUCCEEDED(hr))
{
// Unregister this category as being "implemented" by the class.
CATID rgcatid[1] ;
rgcatid[0] = catid;
hr = pcr->UnRegisterClassImplCategories(clsid, 1, rgcatid);
}

if (pcr != NULL)
pcr->Release();

return hr;
}
// DllRegisterServer - Adds entries to the system registry STDAPI DllRegisterServer(void)
{
HRESULT hr;

AFX_MANAGE_STATE(_afxModuleAddrThis);

if (!AfxOleRegisterTypeLib(AfxGetInstanceHandle(), _tlid))
return ResultFromScode(SELFREG_E_TYPELIB);

if (!COleObjectFactoryEx::UpdateRegistryAll(TRUE))
return ResultFromScode(SELFREG_E_CLASS);

// 标记控件初始化安全.
// 创建初始化安全组件种类
hr = CreateComponentCategory(CATID_SafeForInitializing, L"Controls safely initializable from persistent data!");
if (FAILED(hr))
return hr;
// 注册初始化安全
hr = RegisterCLSIDInCategory(CLSID_SafeItem, CATID_SafeForInitializing);
if (FAILED(hr))
return hr;

// 标记控件脚本安全
// 创建脚本安全组件种类
hr = CreateComponentCategory(CATID_SafeForScripting, L"Controls safely scriptable!");
if (FAILED(hr))
return hr;
// 注册脚本安全组件种类
hr = RegisterCLSIDInCategory(CLSID_SafeItem, CATID_SafeForScripting);
if (FAILED(hr))
return hr;

return NOERROR;
}
// DllUnregisterServer - Removes entries from the system registrySTDAPI DllUnregisterServer(void)
{
HRESULT hr;

AFX_MANAGE_STATE(_afxModuleAddrThis);

if (!AfxOleUnregisterTypeLib(_tlid, _wVerMajor, _wVerMinor))
return ResultFromScode(SELFREG_E_TYPELIB);

if (!COleObjectFactoryEx::UpdateRegistryAll(FALSE))
return ResultFromScode(SELFREG_E_CLASS);

// 删除控件初始化安全入口.
hr=UnRegisterCLSIDInCategory(CLSID_SafeItem, CATID_SafeForInitializing);
if (FAILED(hr))
return hr;
// 删除控件脚本安全入口
hr=UnRegisterCLSIDInCategory(CLSID_SafeItem, CATID_SafeForScripting);
if (FAILED(hr))
return hr;

//////////////////////////
return NOERROR;
}
gjd111686 2004-08-04
  • 打赏
  • 举报
回复
数字签名只有受客户端信任或者导入客户端或者通过CA验证才会不用降低IE安全级别.
johnshao 2004-08-03
  • 打赏
  • 举报
回复
控件在网页中运行,要将所有客户机的浏览器的安全级别降下来,才可以运行或下载控件。这是控件运行的本身问题,所以一般建议不用控件做。具体:
工具-安全,选择自定义安全级别,使浏览器可以下载及安装包后,控件才可以显示。
xsc2001 2004-08-03
  • 打赏
  • 举报
回复
我也遇到过这方面的问题,好象是防火墙的问题,再一个还是你的数字签名没有生效,别人本地机上没有你的认证控件。
(数字证书怎么做?还望请教!)

3,245

社区成员

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

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