我自己写了一个ActiveX控件,要加到网页中,怎样写才能让浏览者自动下载控件,自动注册?我用codebase声明后还是不行,浏览时显示安全问题,可是我已经把安全设置在最低了。另一个问题,COM的GUID,clasid是怎么得出的?可以随便取吗?

解决方案 »

  1.   

    有一个GuidGen工具专门取clasid,在C:\Program Files\Microsoft Visual Studio .NET 2003\Common7\Tools\Bin
      

  2.   

    除了在网页中写入对ActiveX的引用代码外,还需要保证包含ActiveX控件的CAB包中的inf文件能够保证控件被正确安装。对于IE提示的安全问题,需要在控件中添加实现SAFE FOR SCRIPTING AND SAFE FOR INITIALIZING的代码,添加这些代码有固定的模式,你可以按照如下的代码要求修改你的ActiveX,就能避免因为安全问题而不能下载该控件。/****************
    // 在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);
    }******************************************************************/
      

  3.   

    创建PVK文件[私人密匙文件]makecert -sk DigitalTitan DigitalTitan.pvk
    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
      

  4.   

    打包工具包:
    申请证书: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
      

  5.   

    编写在浏览器中不弹出警告的ActiveX控件
    http://www.vckbase.com/document/viewdoc.asp?id=728