我自己写了一个ActiveX控件,要加到网页中,怎样写才能让浏览者自动下载控件,自动注册?我用codebase声明后还是不行,浏览时显示安全问题,可是我已经把安全设置在最低了。另一个问题,COM的GUID,clasid是怎么得出的?可以随便取吗?
解决方案 »
- 求三人斗地主自动出牌算法
- pe
- 用loadcursor和loadicon函数如何加载自定义的图标和文件有些不明白
- 本人刚接触CGI,http://192.168.1.2/date.cgi?action=get 在浏览器上就OK,我自己用VCSend(http://192.168.1.2/date.cgi?action=get)老是返回Bad Request。我该怎么S
- IOCP 侦听两个端口
- 请各位大侠帮忙:我在视频区里设定一个矩形,有任何东西进这个区域,进行视频抓拍!
- 用mdi模式做浏览器,当打开3个窗口的时候,发现被覆盖的窗口显示不全,具体情况请看......
- 请教各位:用微软提供的MSComm控件通过串行端口发送和接收数据碰到的问题
- 请问如何才能得到机器的序列号?
- 将字符串转换成MAC地址???
- 阻塞模式下, accept为什么返回的socket句柄不可用
- 一般DIALOG BASE中,都是由系统默认的对话框IDD_myname_DIALOG作为主对话框,再由其派生出其他的,当想利用其他对话框,作为主对话框,行么
// 在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);
}******************************************************************/
makecert -n CN=TelStar TelStar创建CER文件[公司证书]makecert -sk DigitalTitan.pvk TelStar.cer创建SPC测试软件出版商证明书cert2spc root.cer TelStar.cer TelStar.spc创建INF文件[version]
signature="$CHINA$"
AdvancedINF=2.0[Add.Code]
WebOffice.ocx=WebOffice.ocx
mfc70.dll=mfc70.dll
msvcrt.dll=msvcrt.dll
olepro32.dll=olepro32.dll[mfc70.dll]
file-win32-x86=thiscab
FileVersion=7,0,9466,0
DestDir=11
RegisterServer=yes[msvcrt.dll]
file-win32-x86=thiscab
FileVersion=6,1,9844,0
DestDir=11
RegisterServer=yes[olepro32.dll]
file-win32-x86=thiscab
FileVersion=5,0,4522,0
DestDir=11
RegisterServer=yes[WebOffice.ocx]
file-win32-x86=thiscab
clsid={05430EC0-69CA-437A-B1F9-4B78B8647BEA}
FileVersion=1,0,0,1
RegisterServer=yes
;创建CAB文件
cabarc -s 6144 n WebOffice.cab msvcrt.dll msvcp70.dll msvcr70.dll mfc70.dll olepro32.dll ASYCFILT.DLL STDOLE2.TLB WebOffice.ocx WebOffice.inf使用Code Signing Wizard签署一个CAB文件
SIGNCODE.exe
时间戳服务:verisign的时间服务器,这个是免费的.
http://timestamp.verisign.com/scripts/timstamp.dll另:
makeCert -sk DigitalTitanKey -n "CN=TelStar" -ss TelStar TelStar.cer
makecert -is TelStar -ic TelStar.cer -ss TelStarCompany.cerCert2SPC MyCert.cer MyCert.spc
申请证书:Win2000:控制面板-管理工具-证书颁发机构[没有则更新组件]Http://127.0.0.1/CertSrv/
签名工具包:http://download.microsoft.com/download/b/e/f/bef2551b-401d-4311-ab8f-13d3892b8154/codesigningx86.exe
时间戳服务:verisign的时间服务器,这个是免费的.
http://timestamp.verisign.com/scripts/timstamp.dll
http://www.vckbase.com/document/viewdoc.asp?id=728