Login  

Blog Stats

News


Visual Developer - Visual Basic MVP

隨筆分類

文章分類

每月文章

優質好站連結


強力鎯頭 の VB 部落

您好 ! 歡迎蒞臨 Power Hammer 的 VB 部落 ! 網誌內容主要為 VB .Net C# WMI 等相關資訊 , 提供網友參考

如何 登錄註冊 Actvie X DLL , OCX , EXE (OLE) 元件

 

關於ActiveX動態連結程式庫DLLActiveX控制項OCXActiveX執行檔EXE

及物件連結與嵌入OLE 控制項 ( Object Linking and Embedding )

皆需要登錄註冊後方可使用,在此介紹幾種元件註冊方法 :

 

1.       使用 RegSvr32.exe 工具 ( 命令列 DOS 模式下註冊工具 )

 

語法 :

regsvr32 [/u] [/s] [/n] [/i[:cmdline]] dllname

 

參數 :

/u : Unregisters server.

/s : Specifies regsvr32 to run silently and to not display any message boxes.

/n : Specifies not to call DllRegisterServer. You must use this option with /i.

/i:cmdline : Calls DllInstall passing it an optional [cmdline]. When used with /u, it calls dll uninstall.

dllname : Specifies the name of the dll file that will be registered.

/? : Displays help at the command prompt.

 

:

   RegSvr32 C:\123.dll      註冊

   RegSvr32 /u C:\123.dll  反註冊

 

RegSvr32.exe的依存檔案 :

Kernel32.dllUser32.dllOle32.dllWindows NT相關OS平台中Msvcrt.dllAdvapi32.dll檔案。

Regsvr32.exe 會將您嘗試登錄或解除登錄的檔案,連同所有相依檔案一起載入。

如果必要的檔案遺失或損壞了,程序可能無法成功。

 

(可用Depends.exe 來查看依存檔案;該工具有附在 M$ Windows XX Resource Kit 支援工具或其他開發工具中。

 

 

================================================================

 

 

2.       呼叫 API DLLSelfRegister ( 使用 vb6stkit.dll )

 

宣告

Private Declare Function DLLSelfRegister Lib "vb6stkit.dll" _

(ByVal lpDllName As String) As Integer

 

使用

ReturnCode = DLLSelfRegister("元件完整路徑加檔名,:C:\123.dllC:\123.ocx")

 

回傳值 :

                     0        -         OK

                     2        -         無法初始化 OLE 來註冊檔案

                     3        -         註冊檔案時,LoadLibrary() 函數執行失敗!

                     4        -         在檔案中無法找到 DllRegisterServer() 的進入點!

                     5        -         檔案中之 DllRegisterServer() 函數執行失敗!

                     Else   -         註冊檔案時,發生無法預期的錯誤!

 

 

================================================================

 

 

3.       呼叫 API DllRegisterServer

 

宣告

Private Declare Function DllRegisterServer Lib "元件完整路徑加檔名,:C:\123.dllC:\123.ocx " () As Long

 

使用

If DllRegisterServer = &H0 Then

MsgBox "註冊成功 !"

Else

MsgBox "註冊失敗 !"

End If

 

PS: 此方法有先天限制 , 一次只能宣告一個 , 因此也只能註冊一個元件

 

 

================================================================

 

 

4.       呼叫API LoadLibrary GetProcAddressCallWindowProc

 

宣告

Private Declare Function FreeLibrary Lib "kernel32" _

    (ByVal hLibModule As Long) As Long

Private Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" _

    (ByVal lpLibFileName As String) As Long

Private Declare Function GetProcAddress Lib "kernel32" _

    (ByVal hModule As Long, ByVal lpProcName As String) As Long

Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" _

    (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Any, _

    ByVal wParam As Any, ByVal lParam As Any) As Long

 

撰寫函數

Public Function Register(strFile As String, blnRegister As Boolean) As Boolean

    Dim lngLB As Long, lngPA As Long, lngHwnd As Long

    lngHwnd = Screen.ActiveForm.hWnd

    lngLB = LoadLibrary(strFile)

    If lngLB > 0 Then

        lngPA = GetProcAddress(lngLB, IIf(blnRegister, "DllRegisterServer", "DllUnregisterServer"))

        If lngPA > 0 Then Register = CallWindowProc(lngPA, lngHwnd, ByVal 0&, ByVal 0&, ByVal 0&) = &H0

    End If

    FreeLibrary lngLB

End Function

 

參數說明 :

strFile : 元件檔名

blnRegister : 布林值 , True 為登錄註冊元件 , False 為反註冊元件 !

回傳值 : 布林值, True為登錄註冊成功 , False 則為失敗 !

 

使用

If Register("元件完整路徑加檔名,:C:\123.dllC:\123.ocx ", True)  Then

MsgBox "成功 !"

Else

MsgBox "失敗 !"

End If

 

 

================================================================

 

5.       呼叫API LoadLibrary GetProcAddressCreateThreadWaitForSingleObject

 

宣告

Private Declare Function FreeLibrary Lib "kernel32" _

(ByVal hLibModule As Long) As Long

Private Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" _

(ByVal lpLibFileName As String) As Long

Private Declare Function GetProcAddress Lib "kernel32" _

(ByVal hModule As Long, ByVal lpProcName As String) As Long

Private Declare Function CreateThread Lib "kernel32" _

(lpThreadAttributes As Any, ByVal dwStackSize As Long, _

ByVal lpStartAddress As Long, ByVal lParameter As Long, _

ByVal dwCreationFlags As Long, lpThreadID As Long) As Long

Private Declare Function WaitForSingleObject Lib "kernel32" _

(ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long

Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long

Private Declare Function GetExitCodeThread Lib "kernel32" _

(ByVal hThread As Long, lpExitCode As Long) As Long

Private Declare Sub ExitThread Lib "kernel32" (ByVal dwExitCode As Long)

 

撰寫函數

Public Function Register(strFile As String, blnRegister As Boolean) As Boolean

    Dim lngLB As Long, lngPA As Long, lngThread As Long, lngExitCode As Long

    lngLB = LoadLibrary(strFile)

    If lngLB > 0 Then

        lngPA = GetProcAddress(lngLB, IIf(blnRegister, "DllRegisterServer", "DllUnregisterServer"))

        If lngPA > 0 Then

            lngThread = CreateThread(ByVal 0&, 0&, ByVal lngPA, ByVal 0&, 0&, lngThread)

            If lngThread Then

                Register = (WaitForSingleObject(lngThread, 5000) = 0)

                If Not Register Then

                    GetExitCodeThread lngThread, lngExitCode

                    ExitThread lngExitCode

                End If

                CloseHandle lngThread

            End If

        End If

    End If

    FreeLibrary lngLB

End Function

 

參數說明 :

strFile : 元件檔名

blnRegister : 布林值 , True 為登錄註冊元件 , False 為反註冊元件 !

回傳值 : 布林值, True為登錄註冊成功 , False 則為失敗 !

 

使用

If Register("元件完整路徑加檔名,:C:\123.dllC:\123.ocx ", True)  Then

MsgBox "成功 !"

Else

MsgBox "失敗 !"

End If

 

 

================================================================

 

 

6.       關於 ActiveX EXE

登錄註冊 : 只要執行該 EXE執行檔 , 即完成註冊

反註冊 : 執行該 EXE 執行檔 , 後面加 /UNREGSERVER 參數即可

 

posted on Thursday, April 06, 2006 3:54 PM

What People Are Saying About This Post...

# re: 關於 ActiveX (OLE) 元件登錄註冊 12/11/2006 12:23 PM 窃听器
OK~

# re: 關於 ActiveX (OLE) 元件登錄註冊 12/14/2006 3:35 PM 硬盘数据恢复
GOOD

# ASP 如何读取 Word 档案内容并显示于网页 12/15/2007 2:13 PM 唐太宗
ASP 如何?取 Word ?案?容并?示于网?

# re: 關於 ActiveX (OLE) 元件登錄註冊 3/28/2008 7:12 PM maslo
51231D321DS2312SD3

What do you have to say?

Title:
Name:
Url:
驗證碼  
Comments: