John Skolits
askolits at ot.com
Wed Oct 22 08:46:05 CDT 2003
You can use the Shell, but I sometimes ran into problems with it.
This function will actually return a True or False if its registered or not.
Here's an example on how to use it:
Register The Control
call lbf_RegisterOCX("c:\winnt\system32\comdlg32.ocx",true)
Unregister control
call lbf_RegisterOCX("c:\winnt\system32\comdlg32.ocx",true)
Here's the code I use:
---------------------------------------------
Option Compare Database
Option Explicit
Private Declare Function LoadLibraryA Lib "kernel32" (ByVal lLibFileName As
String) As Long
Private Declare Function CreateThread Lib "kernel32" (lThreadAttributes As
Any, _
ByVal lStackSize As Long, ByVal lStartAddress As Long, ByVal larameter
As Long, _
ByVal lCreationFlags As Long, lThreadID As Long) As Long
Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle
As Long, _
ByVal lMilliseconds As Long) As Long
Private Declare Function GetProcAddress Lib "kernel32" (ByVal hModule As
Long, _
ByVal lProcName As String) As Long
Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA"
_
(ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, _
ByVal wParam As Long, ByVal lParam As Long) As Long
Private Declare Function FreeLibrary Lib "kernel32" (ByVal hLibModule 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, _
lExitCode As Long) As Long
Private Declare Sub ExitThread Lib "kernel32" (ByVal lExitCode As Long)
Function lbf_RegisterOCX(ByVal sFilePath As String, _
Optional bRegister As Boolean = True) As Boolean
Dim lLibAddress As Long, lProcAddress As Long, lThreadID As Long, _
lSuccess As Long, lExitCode As Long, lThread As Long
Dim sRegister As String
''**************************************************************************
******
'' Procedure Identification
''--------------------------------------------------------------------------
------
'' Name: lbf_RegisterOCX
''
'' Purpose: This function registers and Unregisters OLE components
''
'' Results: Returns True if successful
''
'' Inputs: sFilePath - The path to the DLL/OCX or ActiveX EXE
'' bRegister - If True Registers the control, else unregisters
control
''
''
'' Date/Author: Andrewb 04/09/2000 Loaded into CDD Lib 10/07/03 John
Skolits
''**************************************************************************
******
On Error GoTo lbf_RegisterOCX_ERR
'*********BEGIN CODE HERE ********
Const clMaxTimeWait As Long = 20000 'Wait 20 secs for register to
complete
If Len(sFilePath) > 0 And Len(Dir(sFilePath)) > 0 Then
'File exists
If UCase$(Right$(sFilePath, 3)) = "EXE" Then
'Register/Unregister ActiveX EXE
If bRegister Then
'Register EXE
Shell sFilePath & " /REGSERVER", vbHide
Else
'Unregister ActiveX EXE
Shell sFilePath & " /UNREGSERVER", vbHide
End If
lbf_RegisterOCX = True
Else
'Register/Unregister DLL
If bRegister Then
sRegister = "DllRegisterServer"
Else
sRegister = "DllUnRegisterServer"
End If
'Load library into current process
lLibAddress = LoadLibraryA(sFilePath)
If lLibAddress Then
'Get address of the DLL function
lProcAddress = GetProcAddress(lLibAddress, sRegister)
If lProcAddress Then
lThread = CreateThread(ByVal 0&, 0&, _
ByVal lProcAddress, ByVal 0&, 0&, lThread)
If lThread Then
'Created thread and wait for it to terminate
lSuccess = (WaitForSingleObject(lThread,
clMaxTimeWait) = 0)
If Not lSuccess Then
'Failed to register, close thread
Call GetExitCodeThread(lThread, lExitCode)
Call ExitThread(lExitCode)
lbf_RegisterOCX = False
Else
'Successfully registered component
lbf_RegisterOCX = True
Call CloseHandle(lThread)
End If
End If
Call FreeLibrary(lLibAddress)
Else
'Object doesn't expose OLE interface
Call FreeLibrary(lLibAddress)
End If
End If
End If
End If
Exit Function
lbf_RegisterOCX_EXIT:
Exit Function
lbf_RegisterOCX_ERR: 'Display the error
MsgBox "ERROR CODE:" & Err & " DESC:" & Error
Resume lbf_RegisterOCX_EXIT
End Function