OCX控制項的註冊解除安裝,以及判斷是否註冊

2021-09-22 22:00:16 字數 3983 閱讀 5639

方法一:在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 )

}方法四:**呼叫regsvr32.exe

//vb寫法

shell "regsvr32.exe 控制項.ocx/s "

//vc寫法

::shellexecute(null,null,"regsvr32.exe","/s d:\\新建資料夾\\test\\test\\release\\test.reg ",null,null);

//新增reg檔案進入登錄檔

::shellexecute(null,null,"regedit.exe","/s d:\\新建資料夾\\test\\test\\release\\test.reg ",null,null);

注釋:/s標題不彈出訊息框。

小小經驗:

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版本一致。

regsvr32.exe 命令說明和引數

「regsvr32 [/s] [/n] [/i(:cmdline)] dllname」。其中dllname為activex控制項檔名,建議在安裝前拷貝到system資料夾下。

引數有如下意義:

/u——反註冊控制項

/s——不管註冊成功與否,均不顯示提示框

/c——控制台輸出

/i——跳過控制項的選項進行安裝(與註冊不同)

/n——不註冊控制項,此選項必須與/i選項一起使用

執行該命令的方法:

1、可以在「開始」--「執行」,調出執行的對話方塊,也可以使用win+r熱鍵,然後直接在輸入欄輸入即可

2、在開始--執行 輸入cmd,調出『命令提示符』視窗,然後再執行regsvr32命令。

方法三示例:

註冊控制項

bool cyourclass::registocx()

hinstance hlib = loadlibrary("ntgraph.ocx");      //指定要註冊的ocx檔案的路徑及檔名。

if (hlib == null)

//獲取註冊函式dllregisterserver位址

farproc lpdllentrypoint;

lpdllentrypoint = getprocaddress(hlib,"dllregisterserver");

//呼叫註冊函式dllregisterserver

if(lpdllentrypoint!=null)

;//messagebox(handle,"註冊成功!","reg",mb_ok);

messagebox("ocx註冊成功!");

}else

messagebox("ocx註冊失敗!");

//messagebox(handle,"呼叫dllregisterserver失敗!","失敗ing..",mb_ok);

解除安裝控制項

bool cyourclass::unregistocx()

hinstance hlib = loadlibrary("ntgraph.ocx");          //指定要解除安裝的ocx檔案的路徑及檔名。

if (hlib==null)

//獲取註冊函式dllregisterserver位址

farproc lpdllentrypoint;

lpdllentrypoint = getprocaddress(hlib,"dllunregisterserver");//注意這裡是dllunregisterserver。

//呼叫註冊函式dllregisterserver

if(lpdllentrypoint!=null)

;//messagebox(handle,"登出成功!","unreg",mb_ok);

messagebox("ocx登出成功!");

}else

//messagebox(handle,"呼叫dllunregisterserver失敗!!!","結果",mb_ok);

messagebox("ocx呼叫dllunregisterserver失敗!!!");

判斷是否註冊

bool cyourclass::isregistocx()

{hkey hkey;     

bool bpresent;     

tchar szpath[_max_path];     

dword dwregtype;     

dword cbdata   =   sizeof   szpath   *   sizeof   tchar;    

if(regopenkeyex(hkey_classes_root,"activex.activexcontrol\\clsid",0,key_read,&hkey)!=error_success)

return false;

else

return true;

為控制項的名稱和內部名稱   如"ntgraph.ntgraphctrl.1\\clsid"

如果是vc程式建議使用第三種,直接載入控制項暴露的註冊和解除安裝函式, 高效

OCX控制項的註冊解除安裝,以及判斷是否註冊

方法一 在dos或windows命令列下執行 regsvr32 ocxname.ocx 註冊 示例 regsvr32 netshare.ocx 註冊netshare.ocx控制項 regsvr32 u netshare.ocx 解除netshare.ocx控制項的註冊 如果netshare.ocx檔...

OCX控制項的註冊解除安裝,以及判斷是否註冊

方法一 在dos或windows命令列下執行 regsvr32 ocxname.ocx 註冊 示例 regsvr32 netshare.ocx 註冊netshare.ocx控制項 regsvr32 u netshare.ocx 解除netshare.ocx控制項的註冊 如果netshare.ocx檔...

Ocx控制項註冊不成功?可能是tlb檔案導致

ocx檔案是最常用的檔案,實際操作中常常需要註冊之 但是問題來了,經常會出現註冊不成功的問題 解決方法 1 以 管理員身份 註冊 2 dependency walker檢視依賴是否缺失 3 檢視ocx 最後的辦法 tlb檔案是什麼?tlb type library 檔案是乙個說明檔案,通過tlb檔案...