[AccessD] A2K: Regsvr32 assistance please

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






More information about the AccessD mailing list