VB Code:
Private Function RegisterObject(strFullName As String, strKey As String, bForce As Boolean) As Boolean
Dim hKey As Long, stringbuffer As String, sysdir As String
Dim slength As Long, retval As Long, myTime As Single
Dim strHandle As String, strRegPath As String
Dim bPathWrong As Boolean, iSubKeyCnt As Integer, sSubKeyName As String, lSubKeyLen As Long, bSubKeyFound As Boolean
Dim lValueType As Long
RegisterObject = False
bPathWrong = True
lValueType = REG_SZ
retval = RegOpenKeyEx(HKEY_CLASSES_ROOT, ByVal strKey & "\CLSID", 0&, KEY_READ, hKey)
If retval = 0 Then
sSubKeyName = ""
retval = RegQueryValueEx(ByVal hKey, ByVal sSubKeyName, 0&, lValueType, ByVal strHandle, slength)
strHandle = String(slength - 1, vbNull)
retval = RegQueryValueEx(ByVal hKey, ByVal sSubKeyName, 0&, lValueType, ByVal strHandle, slength)
If retval = 0 Then
strHandle = Left(strHandle, slength)
Else
strHandle = ""
End If
retval = RegCloseKey(hKey)
End If
If strHandle <> "" Then
sSubKeyName = "SOFTWARE\Classes\CLSID\" & strHandle & "\InprocServer32"
retval = RegOpenKeyEx(HKEY_LOCAL_MACHINE, ByVal sSubKeyName, 0&, KEY_READ, hKey)
If retval = 0 Then
sSubKeyName = ""
strRegPath = ""
retval = RegQueryValueEx(hKey, sSubKeyName, 0&, lValueType, ByVal strRegPath, slength)
strRegPath = String(slength - 1, vbNull)
retval = RegQueryValueEx(hKey, sSubKeyName, 0&, lValueType, ByVal strRegPath, slength)
If retval = 0 Then
stringbuffer = String$(255, 0)
slength = GetShortPathNameA(strFullName, stringbuffer, 255)
stringbuffer = Left(stringbuffer, slength)
If UCase(strRegPath) = UCase(stringbuffer) Then
bPathWrong = False
ElseIf Mid(strRegPath, 1, 2) = "\\" And InStr(1, strRegPath, Mid(stringbuffer, 3, Len(stringbuffer) - 2)) Then ' in case it is a network path
bPathWrong = False
End If
End If
retval = RegCloseKey(hKey)
End If
End If
If bPathWrong Or bForce Then
stringbuffer = String$(255, 0)
slength = GetShortPathNameA(strFullName, stringbuffer, 255)
If slength > 0 Then
stringbuffer = Left(stringbuffer, slength)
sysdir = String$(255, 0)
slength = GetSystemDirectory(sysdir, 255)
sysdir = Left(sysdir, slength)
ChDrive sysdir
ChDir sysdir
retval = Shell("regsvr32.exe /s " & stringbuffer, 0)
RestoreDir
'wait for shell to finish
myTime = Timer
Do While Timer < myTime + 0.5
DoEvents
Loop
retval = RegOpenKeyEx(HKEY_CLASSES_ROOT, strKey, 0&, KEY_READ, hKey)
If retval = 0 Then
retval = RegCloseKey(hKey)
RegisterObject = True
End If
End If
Else
RegisterObject = True
End If
End Function