天天看點

VC++如何在程式中用代碼注冊和解除安裝ocx控件(代碼)

方法一:在dos或Windows指令行下運作:regsvr32 ocxname.ocx 注冊

示例:

regsvr32 netshare.ocx     //注冊netshare.ocx控件

regsvr32 /u netshare.ocx    //解除netshare.ocx控件的注冊

如果netshare.ocx檔案不在system目錄時,還必須在檔案名前加上完整的路徑。除了regsvr32應用程式之外,Microsoft在它的 web 站點上還提供了一個稱為regclean.exe 的程式,可以檢查系統資料庫并去掉丢失的元件在系統資料庫中的條目。regclean.exe 除了可以删除 “懸挂” 的條目,它還提供一個“undo” 檔案幫助恢複錯誤的删除。

用 regsvr32.exe 注冊 activeX 控件雖然簡單,但需要使用者手工進行注冊,在不用時還需手工解除注冊。

方法二:用 install shield,在裡面選 “self-registered”,安裝程式将自動注冊;

方法三:api 函數注冊

此方法的設計思路是:先将 activeX 控件載入記憶體,然後驗證其有效性,最後直接在記憶體位址中執行其注冊函數(DllRegisterServer、 DllUnregisterServer)。

其程式設計方法是:

1、使用Windows api 函數Loadlibrary 載入activeX 控件;

2、使用GetProcAddress 函數擷取activeX 控件中注冊函數DllRegisterServer(登出函數為 DllUnregisterServer)指針;

3、使用CallwindowProc 函數執行已載入記憶體的activeX 控件注冊函數(DllRegisterServer、 DllUnregisterServer)。

typedef int (callback* myfunction)(void);

myfunction  myfunction = null;

hinstance handle = null ;

handle = LoadLibrary("trdragdroptreectrl.ocx");

if( handle != null )

{

      myfunction = GetProcAddress(handle, "DllRegisterServer");

      if( myfunction != null )

      {

            myfunction();

      }

}

小小經驗:

1、有時候在程式中使用ocx控件時失效,檢查一下調用之間是否執行了afxoleinit()。如果使用了容器,還需要保證執行了 afxEnableControlContainer()

2、使用Activex Control Test Container 可以很友善地測試制作出來的ocx控件(從開始菜單-》程式-》Microsoft Visual Studio 6.0 -> Microsoft Visual Studio 6.0 Tools 可以看到該工具)

3、有時候控件制作的沒有問題,注冊方式也對,但是注冊的時候确失敗了,可能時dll的版本不對,使用Dependencies檢視ocx控件依賴dll是否跟現在使用的dll版本一緻。

////////////////////////////////////////////////////////////////////////////////////////////////////

ActiveX 控件是一個動态連結庫,是作為基于COM 伺服器進行操作的,并且可以嵌入在包容器宿主應用程式中,ActiveX 控件的前身就是OLE 控件。由于ActiveX 控件與開發平台無關,是以,在一種程式設計語言上開發的ActiveX 控件可以無須作任何修改,即可在另一種程式設計語言中使用,其效果如同使用Windows 通用控件一樣。如:在VC ++中開發的ActiveX 控件,不作任何修改即可應用于VB 中。由此可見,通過使用ActiveX 控件即可實作快速小型的元件重用、代碼共享,進而提高程式設計效率。

  從Internet 下載下傳的ActiveX 控件,或從其他途徑得到的ActiveX 控件,使用者應該怎樣做才能正确使用呢?一般來說,一個外來ActiveX 控件要在Windows 中被正确使用,首先必須将控件檔案( *.OCX) 複制到硬碟中,然後将其在Windows 中注冊,未在Windows 中注冊過的ActiveX 控件是不能使用的。注冊ActiveX 控件一般來說有三種途徑,适用範圍不同,各有各的優點,下面分别讨論。

  一、使用Regsvr32.exe 程式對ActiveX 控件進行注冊

  對于未注冊過的ActiveX 控件可使用此軟體對其進行注冊,外來ActiveX 控件要應用到自己的程式中也必須進行注冊。該檔案位于Windows 目錄的system 子目錄下。使用方法如下:點選“開始”→“運作”;在運作對話框中輸入以下指令:

regsvr32 < 檔案名>  注冊一個ActiveX 控件

regsvr32 /u< 檔案名> 解除某ActiveX 控件的注冊

  我們使用一些帶ActiveX 控件的應用程式時,有時會出現不能運作的情況,這有可能是其自帶ActiveX 控件未注冊所至,這時不妨使用上述指令一試。另外,VC ++使用者若對regsvr32.exe 的編碼感興趣的話,可在VC ++的聯機幫助中找到其源代碼。若使用VC ++6.0,則在MSDN CD光牒的/sample/VC98/MFC/controls/regsvr 中。

  二、使用安裝程式

制作軟體:InstallShield

  使用regsvr32.exe 來注冊ActiveX 控件雖然簡單,但需要使用者手工注冊,在不用時還得手工解除注冊,是以,這對一個應用程式來說并非好的解決方案。大型應用軟體一般都有一個安裝程式,在安裝程式中解決ActiveX 控件注冊是較為理想的一種方案。使用InstallShield 可以制作出專業級的Setup,還可注冊其中的ActiveX 控件;而且,在以後攜載軟體時,自動登出掉以前注冊的ActiveX 控件。方法如下:

啟動InstallShield,使用Project Wizard 建立一個新的項目;

建立一個“File Group",将需要注冊的ActiveX 控件檔案放入此“File Group"中;

将上述“File Group"的“Self -Registered"屬性設定成“Yes"。

  上述步驟僅為制作Setup 中設定自動注冊ActiveX 控件幾步,至于使用InstallShield 怎樣制作一個完整的Setup 不在本文讨論範圍之中, 請讀者自己參看有關書籍。

  三、在應用程式中加入注冊代碼

  對于小型程式不宜采取第二種方法,較好的方法是在程式中嵌入注冊代碼,實作應用程式自注冊。其程式設計方法是:

  1、使用Windows API 函數LoadLibrary 載入ActiveX 控件;

  2、使用GetProcAddress 函數擷取ActiveX 控件中注冊函數DllRegisterServer (登出函數為DllUnregisterServer)指針;

  3、調用注冊函數DllRegisterServer(或登出函數DllUnregisterServer)。

  下面以VC ++6.0 編寫的RegActivex 程式為例,介紹怎樣在程式中自動注冊(登出)ActiveX 控件。RegActivex 的主體架構由VC ++6.0 的AppWizard 自動産生,在其基礎上增加兩個菜單項:“注冊ActiveX 控件”、“登出ActiveX 控件”。當選擇“注冊ActiveX 控件”菜單時,将對控件toweratl.ocx(一個漢諾遊戲)進行注冊;當選擇“登出ActiveX 控件”菜單時,将解除控件toweratl.ocx 的注冊。

  1、使用VC ++6.0 建立一個單文檔的應用程式RegActivex,其他項目接受預設設定;

  2、給應用程式增加兩個菜單項:“注冊ActiveX 控件”、“登出ActiveX 控件”,步驟如下:

  a、單擊VC ++6.0 左邊視窗的“ResoureView",輕按兩下MENU 項目下的IDR_MAINFRAME 以打開菜單編輯器;

  b、在菜單編輯器中,加入一個主菜單“注冊”,在“注冊”主菜單下加入兩個菜單項:“注冊ActiveX 控件”、“登出ActiveX 控件”;

  3、給建立的菜單項“注冊ActiveX 控件”和“登出ActiveX 控件”增加響應函數:

  b、在資源編輯器中,輕按兩下MENU 中的IDR_MAINFRAME 打開菜單編輯器,單擊“注冊ActiveX 控件”, 按Ctrl +W 打開MFC Class Wizard; 

  c、輕按兩下Messages 框中的COMMAND, 給“注冊ActiveX 控件”菜單項增加響應函數OnRegisterReg(), 單擊右邊“Edit"按鈕, 給OnRegisterReg() 函數增加如下代碼:

void CMainFrame::OnRegisterReg()

 {

 //ActiveX 控件的路徑及檔案名

 LPCTSTR pszDllName="toweratl.ocx";

  // 裝載ActiveX 控件

 HINSTANCE hLib = LoadLibrary(pszDllName);

  if (hLib < (HINSTANCE)HINSTANCE_ERROR)

  {

 MessageBox("不能載入Dll 檔案!",

"結果",MB_OK);

 return;

 }

 // 擷取注冊函數DllRegisterServer 位址

   FARPROC lpDllEntryPoint; 

   lpDllEntryPoint = GetProcAddress

   (hLib,_T("DllRegisterServer"));

   // 調用注冊函數DllRegisterServer

if(lpDllEntryPoint!=NULL)

   {

   if(FAILED(( *lpDllEntryPoint)()))

   MessageBox("調用DllRegisterServer 失敗!",

         "結果",MB_OK);

   FreeLibrary(hLib);

   return;

   };

   MessageBox("注冊成功","結果",MB_OK);

   }

   else

  c、"登出ActiveX 控件”菜單項響應函數的編寫方法同上,代碼也相似,隻是将“lpDllEntryPoint=GetProcAddress(hLib,_T("DllRegisterServer"));"改成:

 lpDllEntryPoint = GetProcAddress(hLib,_T

("DllUnregisterServer"))。

  4、編譯聯接上述程式,即可得一個可執行檔案。另需注意的是:應将ActiveX 控件檔案toweratl.ocx 複制到Windows 的system 目錄下。控件檔案toweratl.ocx 在微軟出版的《Visual C ++6.0 程式員指南》所附CD光牒中可以找到。

  5、測試上述程式:運作《Visual C ++6.0 程式員指南》所附CD光牒中的game2 程式,若使用RegActivex 注冊了toweratl.ocx 控件,則該程式可以正常運作;若使用RegActivex 登出了toweratl.ocx 控件則game2 不能運作。

繼續閱讀