如何将我的activex控件标记为安全的,看过类似帖子,但不是很明白,请详说。(60分)

解决方案 »

  1.   

    网页加入新做的ActiveX控件后,预览该网页,会弹出提示框
    所属类别: C/C++-ActiveX技术编号:QA003913
    建立日期: 2001年2月22日 最后修改日期:2001年6月26日  Xuys: 
        用VC新建一个项目,选择MFC ActiveX Control Wizard其他为默认选项,编译之后,用Frontpage新建一个网页,加入新做的ActiveX控件后,预览该网页,会弹出提示框,但你加入微软的ActiveX控件,却不会弹出对话框;我推断可能是在编写ActiveX控件时有设置的代码,具体设置什么代码,请指教。 回答:     (主持人注:VB的用户可以参考微 软 的 Knowledge Base的 文 章:“Q182598 OWTO: Implement IObjectSafety in Visual Basic Controls”) 
        解决方法如下: 
        添加以下代码 
        //////////////////////////////////////////////////////////////// 
        // 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.在XXXXctl.cpp中加入//////// 
        //Copied form the ActiveX SDK......... 
        时,不要忘了在头文件里加入函数声名。注意:要加在类的声明前 
        2.在UpdateRegistry(BOOL bRegister)中 
        第31行的IDS_DIEROLL 
        应为IDS_XXXXXXX 
        第32行的IDB_DIEROLL 
        应为IDS_XXXXXXX 
        第34行的_dwDierollOleMisc 
        应为_dwXXXXOleMisc 
        其中的XXXX为你的文件名。 此问题由Xuys回答。 
      

  2.   

    UpdateRegistry(BOOL bRegister)
    { if (bRegister)
    {
    BOOL retval = AfxOleRegisterControlClass(
    AfxGetInstanceHandle(),
    m_clsid,
    m_lpszProgID,
    IDS_MADMETHODCALL,
    IDB_MADMETHODCALL,
    afxRegApartmentThreading,
    _dwMadMethodCallOleMisc,
    _tlid,
    _wVerMajor,
    _wVerMinor);
    //  as safe for scripting--failure OK
    HRESULT hr = CreateComponentCategory(CATID_SafeForScripting, 
    L"Controls that are safely scriptable"); if (SUCCEEDED(hr))
    // only register if category exists
    RegisterCLSIDInCategory(m_clsid, CATID_SafeForScripting);
    // don't care if this call fails //  as safe for data initialization
    hr = CreateComponentCategory(CATID_SafeForInitializing, 
    L"Controls safely initializable from persistent data"); if (SUCCEEDED(hr))
    // only register if category exists
    RegisterCLSIDInCategory(m_clsid, CATID_SafeForInitializing);
    // don't care if this call fails return retval;
    }
    else
    {
    return AfxOleUnregisterClass(m_clsid, m_lpszProgID);
    }
    }
    HRESULT CreateComponentCategory(CATID catid, WCHAR* catDescription)
    {    ICatRegister* pcr = NULL ; // interface pointer
        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;
    }http://www.csdn.net/expert/topic/885/885674.xml?temp=.4752161