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