用VC向导生成了个OCX,放到网页里用,却老是弹出这样的一个对话框,"在此页上的activeX 控件和本页上的其它部分交互可能不安全,你想允许这种交互吗?如何解决

解决方案 »

  1.   

    允许,你的OCX可能有点问题吧?
      

  2.   

    要实现IObjectSafetyImpl接口,类似下面这样:class ATL_NO_VTABLE TLesWebXImpl:
      VCLCONTROL_IMPL(TLesWebXImpl, LesWebX, TLesWebX, ILesWebX, DIID_ILesWebXEvents)
     ,public IPersistPropertyBagImpl<TLesWebXImpl>
     ,public IObjectSafetyImpl<TLesWebXImpl,INTERFACESAFE_FOR_UNTRUSTED_CALLER|INTERFACESAFE_FOR_UNTRUSTED_DATA>
    ...
    ...
    BEGIN_COM_MAP(TLesWebXImpl)
      ....
      COM_INTERFACE_ENTRY(IObjectSafety)
    END_COM_MAP()
      

  3.   

    // Copied from the ActiveX SDK 
        // This code is used to register and unregister a 
        // control as safe for initialization and safe for scripting 
         
        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; 
        } 
         
         
        /***************************************** 
        在 xxxctl.cpp 文件中添加如下两个头文件 
        *****************************************/ 
        #include "comcat.h" 
        #include "objsafe.h" 
         
        /***************************************** 
        修改如下函数 
        *****************************************/ 
        BOOL CxxxCtrl::CxxxCtrlFactory::UpdateRegistry(BOOL bRegister) 
        { 
        // TODO: Verify that your control follows apartment-model threading rules. 
        // Refer to MFC TechNote 64 for more information. 
        // If your control does not conform to the apartment-model rules, then 
        // you must modify the code below, changing the 6th parameter from 
        // afxRegInsertable | afxRegApartmentThreading to afxRegInsertable. 
         
        if (bRegister) 
        { 
        HRESULT hr = S_OK ; 
         
        // register as safe for scripting 
        hr = CreateComponentCategory(CATID_SafeForScripting, 
        L"Controls that are safely scriptable"); 
         
        if (FAILED(hr)) 
        return FALSE; 
         
        hr = RegisterCLSIDInCategory(m_clsid, CATID_SafeForScripting); 
         
        if (FAILED(hr)) 
        return FALSE; 
         
        // register as safe for initializing 
        hr = CreateComponentCategory(CATID_SafeForInitializing, 
        L"Controls safely initializable from persistent data"); 
         
        if (FAILED(hr)) 
        return FALSE; 
         
        hr = RegisterCLSIDInCategory(m_clsid, CATID_SafeForInitializing); 
         
        if (FAILED(hr)) 
        return FALSE; 
         
        return AfxOleRegisterControlClass( 
        AfxGetInstanceHandle(), 
        m_clsid, 
        m_lpszProgID, 
        IDS_DIEROLL, 
        IDB_DIEROLL, 
        afxRegInsertable | afxRegApartmentThreading, 
        _dwDierollOleMisc, 
        _tlid, 
        _wVerMajor, 
        _wVerMinor); 
        } 
        else 
        { 
        HRESULT hr = S_OK ; 
         
        hr = UnRegisterCLSIDInCategory(m_clsid, CATID_SafeForScripting); 
         
        if (FAILED(hr)) 
        return FALSE; 
         
        hr = UnRegisterCLSIDInCategory(m_clsid, CATID_SafeForInitializing); 
         
        if (FAILED(hr)) 
        return FALSE; 
         
        return AfxOleUnregisterClass(m_clsid, m_lpszProgID); 
        } 
        } 
         
         
         
        dalinda的意见: 
        我有几点补充: 
        1.在xxxctl.h 文件中添加如下两个头文件 
        #include "comcat.h" 
        #include "objsafe.h" 
        注意:要加在类的声明前 
        2.在UpdateRegistry(BOOL bRegister)中 
        第31行的IDS_DIEROLL 
        应为IDS_XXXXXXX 
        第32行的IDB_DIEROLL 
        应为IDS_XXXXXXX 
        第34行的_dwDierollOleMisc 
        应为_dwXXXXOleMisc 
        其中的XXXX为你的工程名。