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