Автоматическая регистрация OCX при старте приложения

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 15.11.2004 (Пн) 17:42

Главное, чтобы они были на месте (в каталоге программы).

очень плохо! так лучше не делать


Да не очень хорошо - лучше все в один Exe впихнуть.
Но не всегда исходники контролов доступны. Тогда можно их и просто в каталог программы положить - работать будет (по крайней мере у меня работало), правда потом я все одно контролы по нормальному инсталировать стал...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 15.11.2004 (Пн) 17:49

В каталоге программы можно оставлять Native DLL. А все, что относится к COM лучше ставить туда, где им место -- system32.

Кстати, однажды у меня из-за чрезмерного желания к автономности прога перестала работать (дело еще на VB3 было). Я использовал Common Dialog и на всякий случай, вместе с ComDlg.vbx положил и ComDlg.dll. А на машине, на которой я запускал эту прогу, ComDlg.dll был другой, более свежей версии. Глюки были неописуемые :)
Lasciate ogni speranza, voi ch'entrate.

Ruslan Demidow
Мужчина!
Мужчина!
Аватара пользователя
 
Сообщения: 987
Зарегистрирован: 25.03.2004 (Чт) 13:39
Откуда: N.Novgorod

Сообщение Ruslan Demidow » 15.11.2004 (Пн) 18:20

codemaster писал(а):
Ruslan Demidow писал(а):SSubTmr6.dll
vbalColumnTreeView6.ocx
vbalGrid6.ocx
vbalIml6.ocx


Код этих контролов доступен!
перепиши его как UserControl в своей прогр. и не надо ничего регистрить.

Ок. Так пожалуй и сделаю, но это применимо, насколько я понял, только к последним трём контролам. Если мне не изменяет мой склероз - к dll код не доступен.
Её в любом случае регистрировать придётся.
codemaster писал(а):
Ruslan Demidow писал(а):Главное, чтобы они были на месте (в каталоге программы).


очень плохо! так лучше не делать

Почему? Частенько так делаю на подопытных программках - в большинстве случаев даже и регистрировать не приходится.
Это Ж-ж-ж-ж неспроста (с) Винни-Пух

Ruslan Demidow
Мужчина!
Мужчина!
Аватара пользователя
 
Сообщения: 987
Зарегистрирован: 25.03.2004 (Чт) 13:39
Откуда: N.Novgorod

Сообщение Ruslan Demidow » 15.11.2004 (Пн) 18:22

Упс. Сначала ответил на последнюю цитату, потом уже увидел объяснение на мой последний вопрос в предыдущих постах. Сорри.
Это Ж-ж-ж-ж неспроста (с) Винни-Пух

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 15.11.2004 (Пн) 18:52

GSerg писал(а):Ничё не понимаю.
Тёмыч, чё думаешь?

В VB есть такая рульная фишка, что он сам поправляет стек после каждого вызова API. При этом, если стек стоял неправильно, то в IDE выдаётся ошибка "Bad DLL calling convention", а в скомпилированном коде он молча проглатывает обиду.

МС о нас о всех позаботилась...
Изображение

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 15.11.2004 (Пн) 22:36

Ещё, если CallWindowProc действительно работает так, как ты показал, то достаточно просто объявить её с нужным (любым) числом параметров, и всё будет работать даже без перекоса стека.
Изображение

Ruslan Demidow
Мужчина!
Мужчина!
Аватара пользователя
 
Сообщения: 987
Зарегистрирован: 25.03.2004 (Чт) 13:39
Откуда: N.Novgorod

Сообщение Ruslan Demidow » 15.11.2004 (Пн) 23:30

Ну так что по моему вопросу-то?
Перекидывать все 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


Таким образом я избавляюсь от ошибки при запуске программы при смене привода с компакт-диском.
А так же от излишней регистрации компонентов при запуске стандартно установленной программы.
Остаётся только вопрос с "сильно урезанными" правами юзера при регистрации.

И нужно ли после каждой регистрации перезапускать программу или нет?

Или всё же поискать другой метод? Прошу извинить, если по чьему-то мнению я не вникаю в суть. :oops:
Впервые пишу что-то серьёзное и хочется это сделать правильно.
Это Ж-ж-ж-ж неспроста (с) Винни-Пух

codemaster
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 604
Зарегистрирован: 13.02.2004 (Пт) 13:35

Сообщение codemaster » 16.11.2004 (Вт) 12:05

Ruslan Demidow писал(а):Или всё же поискать другой метод? Прошу извинить, если по чьему-то мнению я не вникаю в суть. :oops:
Впервые пишу что-то серьёзное и хочется это сделать правильно.





1. Ради интереса добавь на свой компутер уч. запись типа User или ниже. и посмотри что получится.

2. После регистрации добавляются записи в реестр.

В случе расположения controls на CD они будут "сиротскими"
это 100% не вызовет "ентузазизма" у нормального сис.адм если не сказать большего . ("Могут и морду набить" О.Бендер )


3. распологая сторонние controls на CD ты открываеш изнанку своей программы. (Это особенно плохо если программа будет демостр.
работадателю который разбираеся в VB )


4. Subclassing
http://www.vbaccelerator.com/home/VB/Co ... rticle.asp


P.S. Лучше один раз потратить время на свои UserControl и больше не иметь гемор.

Ruslan Demidow
Мужчина!
Мужчина!
Аватара пользователя
 
Сообщения: 987
Зарегистрирован: 25.03.2004 (Чт) 13:39
Откуда: N.Novgorod

Сообщение Ruslan Demidow » 16.11.2004 (Вт) 13:37

Ок. Спасибо за советы и ссылку. :)
Это Ж-ж-ж-ж неспроста (с) Винни-Пух

Пред.

Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот и гости: 1

    TopList