- //=========================================================================
- // 動(dòng)態(tài)注冊 ActiveX 控件 LPCTSTR = const char *
- //=========================================================================
- BOOL __stdcall pfyRegControl(LPCTSTR lpFileName)
- { LPCTSTR lpDllName = lpFileName; //ActiveX控件的路徑及文件名
- HINSTANCE hLib = LoadLibrary(lpDllName); //裝載ActiveX控件
- if (hLib < (HINSTANCE)HINSTANCE_ERROR)
- { return FALSE;
- }
- FARPROC lpDllEntryPoint;
- lpDllEntryPoint = GetProcAddress(hLib, lpfnRegister); //獲取注冊函數DllRegisterServer地址
- if(lpDllEntryPoint != NULL) //調用注冊函數DllRegisterServer
- { if(FAILED((*lpDllEntryPoint)()))
- { FreeLibrary(hLib);
- return FALSE;
- }
- return TRUE;
- }else
- return FALSE;
- }
-
- //=========================================================================
- // 動(dòng)態(tài)卸載 ActiveX 控件
- //=========================================================================
- BOOL __stdcall pfyUnRegControl(LPCTSTR lpFileName)
- { LPCTSTR lpDllName = lpFileName; //ActiveX控件的路徑及文件名
- HINSTANCE hLib = LoadLibrary(lpDllName); //裝載ActiveX控件
- if (hLib < (HINSTANCE)HINSTANCE_ERROR)
- { return FALSE;
- }
- FARPROC lpDllEntryPoint;
- lpDllEntryPoint = GetProcAddress(hLib, lpfnUnReg); //獲取注冊函數DllUnregisterServer地址
- if(lpDllEntryPoint != NULL) //調用注冊函數DllUnregisterServer
- { if(FAILED((*lpDllEntryPoint)()))
- { FreeLibrary(hLib);
- return FALSE;
- }
- return TRUE;
- }else
- return FALSE;
- }
對于VB只要用API聲明這兩個(gè)函數即可,按一樣的方法調用,當然最簡(jiǎn)單的是Shell "cmd /c regsvr32 /q abc.dll"之類(lèi)的命令行
這些也是可以的,重復注冊不會(huì )造成破壞,只是感覺(jué)不爽,因此下面提供一種感覺(jué)更舒服的方法
- Public Sub Main() '注意工程的入口函數必須是Sub Main,如果是某個(gè)窗體,這個(gè)窗體包含未注冊的控件則直接出錯
- Dim strCom As String
- 'frmMain.Controls.Add "MSComctlLib.TreeView", "tv" '從報錯得到progid=MSComctlLib.TreeCtrl.2
- If pfyCheckClass(StrConv("MSComctlLib.TreeCtrl.2", vbUnicode)) = 0 Then
- '類(lèi)未注冊
- strCom = Environ("Windir") & "\mscomctl.ocx"
- If Dir(strCom) = "" Then strCom = Environ("Windir") & "\system32\mscomctl.ocx"
- '不再用Dir函數
- If FileLen(strCom) = 0 Then '系統沒(méi)有該文件
- If Dir(App.Path & "\mscomctl.ocx") = "" Then
- MsgBox "缺少組件!程序運行需要如下微軟組件:" & vbCrLf & "mscomctl.ocx", vbCritical, "#Error"
- End
- End If
- Else
- FileCopy App.Path & "\mscomctl.ocx", strCom
- End If
- If pfyRegControl("mscomctl.ocx") = 0 Then
- MsgBox "控件: mscomctl.ocx 注冊失??!請手動(dòng)注冊該組件!", vbExclamation, "#Error"
- Open App.Path & "\reg.bat" For Output As #1
- Print #1, "rem ======================================"
- Print #1, "rem 游俠組件注冊批處理,請雙擊運行……"
- Print #1, "rem 游俠技術(shù) http://blog.csdn.net/prsniper"
- Print #1, "rem ======================================"
- Print #1, "regsvr32 mscomctl.ocx"
- Print #1, "pause"
- Close #1
- End
- End If
- End If
上面的pfyCheckClass是我封裝的根據類(lèi)名檢查某個(gè)控件是否注冊的函數,其C/C++的源碼如下:
- //===============================================================
- // ActiveX控件類(lèi)注冊狀態(tài)判斷
- //===============================================================
- INSERT_API BOOL __stdcall pfyCheckClass(const USHORT *lpClass)
- { //S_OK 類(lèi)標志符檢索成功 CO_E_CLASSSTRING 類(lèi)標志符無(wú)效 REGDB_E_WRITEREGDB 寫(xiě)入標志符到注冊表出錯
- HRESULT hr;
- CLSID clsId;
- hr = CLSIDFromProgID(lpClass, &clsId);
- if(hr == S_OK) return TRUE;
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請
點(diǎn)擊舉報。