程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> 關於VC++ >> 編寫在浏覽器中不彈出警告的ActiveX控件

編寫在浏覽器中不彈出警告的ActiveX控件

編輯:關於VC++

我們在編寫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 registry

STDAPI 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;
}

(全文完)

本文配套源碼

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved