Ну так что по моему вопросу-то?
Перекидывать все OCX'ы в system32?
Я вот переделал немного свой подход к авторегистрации компонетвов в программе, если они не зарегистрированы в системе:
- Код: Выделить всё
'Глобальный модуль
Declare Function DllRegisterServer1 Lib "SSubTmr6.dll" () As Long
Declare Function DllRegisterServer2 Lib "vbalGrid6.ocx" () As Long
Declare Function DllRegisterServer3 Lib "vbalIml6.ocx" () As Long
Declare Function DllRegisterServer4 Lib "vbalColumnTreeView6.ocx" () As Long
Public cRegistry As New cRegistry 'класс для работы с регистром
Sub Main()
Dim sFileName As String
With FiltrOpt
.FiltrType = NO_FILTER
.Invert = False
.srchString = vbNullString
End With
Set FSO = CreateObject("Scripting.FileSystemObject")
gAppPath = IIf(Right$(App.Path, 1) = "\", App.Path, App.Path & "\")
If FSO.GetDrive(Left$(gAppPath, 1)).DriveType = CDRom Then
blnIniOnlyRead = True
Else: blnIniOnlyRead = False
End If
If Not FSO.FileExists(gAppPath & App.EXEName & ".ini") Then
CreateIniFile (gAppPath & App.EXEName & ".ini")
cIni.FileName = gAppPath & App.EXEName & ".ini"
Else
cIni.FileName = gAppPath & App.EXEName & ".ini"
CheckIniFile
End If
'Проверим на наличие ключи в реестре:
sFileName = "SSubTmr6.dll"
If Not CheckRegActiveX("CLSID\{71A27032-C7D8-11D2-BEF8-525400DFB47A}\InprocServer32", sFileName) Then
If bExistFile(sFileName) Then
If DllRegisterServer1 <> ERROR_SUCCESS Then
MsgBox "Ошибка регистрации " & sFileName, vbCritical + vbOKOnly, "F.I.P.S. base Reader"
End
End If
End If
End If
sFileName = gAppPath & "vbalGrid6.ocx"
If Not CheckRegActiveX("CLSID\{543749E2-8732-11D3-A204-0090275C8BC1}\InprocServer32", sFileName) Then
If bExistFile(sFileName) Then
If DllRegisterServer2 <> ERROR_SUCCESS Then
MsgBox "Ошибка регистрации " & sFileName, vbCritical + vbOKOnly, "F.I.P.S. base Reader"
End
End If
End If
End If
sFileName = gAppPath & "vbalIml6.ocx"
If Not CheckRegActiveX("CLSID\{396F7AC9-A0DD-11D3-93EC-00C0DFE7442A}\InprocServer32", sFileName) Then
If bExistFile(sFileName) Then
If DllRegisterServer3 <> ERROR_SUCCESS Then
MsgBox "Ошибка регистрации " & sFileName, vbCritical + vbOKOnly, "F.I.P.S. base Reader"
End
End If
End If
End If
sFileName = gAppPath & "vbalColumnTreeView6.ocx"
If Not CheckRegActiveX("CLSID\{D51F1EEB-CCBE-452F-9944-285D081BD883}\InprocServer32", sFileName) Then
If bExistFile(sFileName) Then
If DllRegisterServer4 <> ERROR_SUCCESS Then
MsgBox "Ошибка регистрации " & sFileName, vbCritical + vbOKOnly, "F.I.P.S. base Reader"
End
End If
End If
End If
End Sub
Public Function bExistFile(ByVal sPath As String) As Boolean
Dim blnResult As Boolean
If Len(Dir$(sPath)) > 0 Then
blnResult = True
Else
blnResult = False
End If
On Error GoTo bExistFile_Error
bExistFile = blnResult
On Error GoTo 0
Exit Function
bExistFile_Error:
If bSaveLog Then
SaveLog "Error " & Err.Number & " (" & Err.Description & ") in procedure bExistFile of Module Global"
End If
MsgBox "Error " & Err.Number & " (" & Err.Description & ") in procedure bExistFile of Module Global", _
vbCritical & vbOKOnly
End Function
Function CheckRegActiveX(ByVal Section As String, ByVal sFileName As String) As Boolean
Dim strFileName As String
Dim blnResult As Boolean
strFileName = gAppPath & sFileName
cRegistry.ClassKey = HKEY_CLASSES_ROOT
cRegistry.SectionKey = Trim$(Section)
If cRegistry.KeyExists Then
blnResult = True
If cRegistry.Value <> strFileName Then
If Not bFileExist(cRegistry.Value) Then
blnResult = False
End If
End If
Else
blnResult = False
End If
CheckRegActiveX = blnResult
End Function
Таким образом я избавляюсь от ошибки при запуске программы при смене привода с компакт-диском.
А так же от излишней регистрации компонентов при запуске стандартно установленной программы.
Остаётся только вопрос с "сильно урезанными" правами юзера при регистрации.
И нужно ли после каждой регистрации перезапускать программу или нет?
Или всё же поискать другой метод? Прошу извинить, если по чьему-то мнению я не вникаю в суть.
Впервые пишу что-то серьёзное и хочется это сделать правильно.