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

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Ruslan Demidow
Мужчина!
Мужчина!
Аватара пользователя
 
Сообщения: 987
Зарегистрирован: 25.03.2004 (Чт) 13:39
Откуда: N.Novgorod

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

Сообщение Ruslan Demidow » 14.11.2004 (Вс) 10:13

Вот захотел сделать сабж в своей программе.
Но работает через раз. Вернее не на всех машинах.
Пробовал под разными системами (2000 и ХР).
В одних случаях программа после непродолжительной паузы запускается, в других случаях висит в процессах, отжирая около 90% процессорного времени и всё. Снимается только убиением процесса.
Автоматическая регистрация нужна для того чтобы моя программа могла запуститься с компакт-диска на компьютере, где она не установлена, при условии наличия в каталоге программы нужных OCX.

Подскажите, плиз, как правильнее сделать.

Привожу свой способ решения
В глобальном модуле:

Код: Выделить всё
Sub Main()
Dim sFileName As String
Dim blnAXnotReg As Boolean
   
    blnAXnotReg = False
    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


'Проверим на наличие ключ в регистре: HKEY_CLASSES_ROOT\TypeLib\{71A2702D-C7D8-11D2-BEF8-525400DFB47A}
    cRegistry.ClassKey = HKEY_CLASSES_ROOT
    cRegistry.SectionKey = "TypeLib\{71A2702D-C7D8-11D2-BEF8-525400DFB47A}"
    If Not cRegistry.KeyExists Then
        blnAXnotReg = True
        sFileName = gAppPath & "SSubTmr6.dll"
        checkFile sFileName
        RegActiveX sFileName, " /s "
    End If
    cRegistry.SectionKey = "CLSID\{543749E2-8732-11D3-A204-0090275C8BC1}"
    If Not cRegistry.KeyExists Then
        blnAXnotReg = True
        sFileName = gAppPath & "vbalGrid6.ocx"
        checkFile sFileName
        RegActiveX sFileName, " /s "
    End If
    cRegistry.SectionKey = "CLSID\{396F7AC9-A0DD-11D3-93EC-00C0DFE7442A}"
    If Not cRegistry.KeyExists Then
        blnAXnotReg = True
        sFileName = gAppPath & "vbalIml6.ocx"
        checkFile sFileName
        RegActiveX sFileName, " /s "
    End If
       cRegistry.SectionKey = "CLSID\{D51F1EEB-CCBE-452F-9944-285D081BD883}"
    If Not cRegistry.KeyExists Then
        blnAXnotReg = True
        sFileName = gAppPath & "vbalColumnTreeView6.ocx"
        checkFile sFileName
        RegActiveX sFileName, " /s "
    End If
   
    If blnAXnotReg Then
        Shell (gAppPath & App.EXEName)
        Set FSO = Nothing
        End
    End If

Sub checkFile(ByVal sFile As String)
    If Not bFileExist(sFile) Then
        MsgBox "Ошибка: не найден файл " & vbCrLf & sFile, vbCritical + vbOKOnly, "FIPS base Reader"
        End
        Exit Sub
    End If
End Sub

Sub RegActiveX(ByVal sFile As String, ByVal sKey As String)
    Dim retval As Boolean
'    Dim Kav As String * 3
    Dim CmdLine As String
        CmdLine = "regsvr32 " & sKey & " " & """" & sFile & """"
        retval = CmdShell(CmdLine, gAppPath, vbNormal)
           If Not retval Then
                MsgBox "Ошибка при регистрации " & vbCrLf & sFile, vbCritical + vbOKOnly, "FIPS base Reader"
                End
                Exit Sub
           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

Public Function CmdShell(ComLine As String, DefaultDir As String, ShowFlag As VbAppWinStyle) As Boolean
Dim si As STARTUPINFO
Dim pi As PROCESS_INFORMATION
si.wShowWindow = ShowFlag
si.dwFlags = STARTF_USESHOWWINDOW
If CreateProcess(vbNullString, ComLine, ByVal 0&, ByVal 0&, False, 0, ByVal 0&, DefaultDir, si, pi) Then
WaitForSingleObject pi.hProcess, INFINITE
CloseHandle pi.hProcess
CmdShell = True
Exit Function
End If
CmdShell = False
End Function



Помогите плиз. Очень хочется реализовать эту фичу.
Это Ж-ж-ж-ж неспроста (с) Винни-Пух

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 14.11.2004 (Вс) 10:25

Чел :)
Нафига руками?
У каждого activex есть dllregisterserver - просто вызывай её через declare.

Note: хе-хе, вот ещё одна область применений вызова по указателю. Щас запишем...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

XairOn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 324
Зарегистрирован: 19.07.2004 (Пн) 20:20
Откуда: Irkutsk region

Сообщение XairOn » 14.11.2004 (Вс) 10:45

Но dllregisterserver лежит в ComCtl32.ocx ты уверен, что он есть на любой тачке???

XairOn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 324
Зарегистрирован: 19.07.2004 (Пн) 20:20
Откуда: Irkutsk region

Сообщение XairOn » 14.11.2004 (Вс) 10:46

И вообще в API-Guide есть очень хороший пример по этому поводу!

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 14.11.2004 (Вс) 11:00

В любом ocx есть свой dllregisterserver, который регистрирует именно этот компонент.
Думаешь, regsvr32 что на самом деле делает? :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

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

Сообщение Ruslan Demidow » 14.11.2004 (Вс) 12:21

GSerg писал(а):Чел :)
Нафига руками?
У каждого activex есть dllregisterserver - просто вызывай её через declare.

Note: хе-хе, вот ещё одна область применений вызова по указателю. Щас запишем...

:oops:
Да я не знаю как это делать.
Если бы знал - сразу бы так и сделал.
Покажи пример плиз.
Это Ж-ж-ж-ж неспроста (с) Винни-Пух

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

Сообщение Ruslan Demidow » 14.11.2004 (Вс) 12:39

Вот в API-Guide нашёл:
Код: Выделить всё
'KPD-Team 1999
'URL: http://www.allapi.net/
'E-Mail: KPDTeam@Allapi.net

Declare Function DllRegisterServer Lib "ComCtl32.OCX" () As Long
Declare Function DllUnregisterServer Lib "ComCtl32.OCX" () As Long

Const ERROR_SUCCESS = &H0

' To register your OCX use this function:
If DllRegisterServer = ERROR_SUCCESS Then
    MsgBox "Registration Successful"
Else
    MsgBox "Registration Unsuccessful"
End If

' To unregister your OCX use this function:
If DllUnregisterServer = ERROR_SUCCESS Then
    MsgBox "UnRegistration Successful"
Else
    MsgBox "UnRegistration Unsuccessful"
End If

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

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 14.11.2004 (Вс) 13:03

Вместо lib "comctl32" пишешь lib "полный путь к ocx" :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

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

Сообщение Ruslan Demidow » 14.11.2004 (Вс) 15:20

GSerg писал(а):Вместо lib "comctl32" пишешь lib "полный путь к ocx" :)
Ок. Спасибо большое! :)
Это Ж-ж-ж-ж неспроста (с) Винни-Пух

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 15.11.2004 (Пн) 10:22

В любом ocx есть свой dllregisterserver, который регистрирует именно этот компонент.


Он то может и есть, но на всех операционках работать не будет. Проверено - это точно. Поэтому я под Win95/98/NT на этот случай запускаю regsvr32 (проблемы были именно с ними).
--------

Вообще сама идея правильная. Только вот у меня реализация несколько иная - на мой взгляд получше. А именно - один раз написана универсальная утилитка, считывющая INI-файл с версиями компонентов, и проверяющая их наличие/регистрацию при запуске, ну и устанавливающая/регистрящая их при необходимости. Причем проверяются не только DLL-ки, но и другие файлы (собственно exe, chm и пр.). Если все успешно то из той-же INI-шки читается имя exe-шника и он запускается. Все получилось достаточно универсально и удобно - собственно программу это никак не затрагивает - будет работать с любой. И уже несколько лет обновление программ и их компонентов на клиентских компьютерах никаких проблем не вызывает...

Рекомендую постараться сделать так-же...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

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

Сообщение alibek » 15.11.2004 (Пн) 11:21

GSerg писал(а):Вместо lib "comctl32" пишешь lib "полный путь к ocx" :)

С этим может быть проблема, т.к. программа не может знать "полный путь к ocx".
Я бы советовал использовать второй пример из AG, в котором адрес этой процедуры (DLLRegisterServer) находится kernel32::GetProcAddress и затем вызывается.
Сама функция:
Код: Выделить всё
Dim lb As Long, pa As Long
lb = LoadLibrary(DllServerPath)
If bRegister Then
  pa = GetProcAddress(lb, "DllRegisterServer")
Else
  pa = GetProcAddress(lb, "DllUnregisterServer")
End If
If CallWindowProc(pa, hWnd, ByVal 0&, ByVal 0&, ByVal 0&) = ERROR_SUCCESS Then
  MsgBox IIf(bRegister = True, "Registration", "Unregistration") + " Successful"
Else
  MsgBox IIf(bRegister = True, "Registration", "Unregistration") + " Unsuccessful"
End If
FreeLibrary lb
Lasciate ogni speranza, voi ch'entrate.

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 15.11.2004 (Пн) 12:13

Кстати, надо еще сравнивать версию и размер файла (дату лучше не надо). Ибо при обновлении версии (особенно своей) Active-X компонента может потребоваться его перерегистрация.
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

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

Сообщение alibek » 15.11.2004 (Пн) 12:26

Перерегистрация может понадобиться только при обновлении самодельных компонентов, когда не выставляют бинарную совместимость (чтобы не перегенерировать CLSID).
Lasciate ogni speranza, voi ch'entrate.

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 15.11.2004 (Пн) 12:29

Перерегистрация может понадобиться только при обновлении самодельных компонентов, когда не выставляют бинарную совместимость (чтобы не перегенерировать CLSID).


Ну я и говорил - своих. Бинарную совместимость иногда приходится нарушать меняя интерфейс компонента - чтобы не мучиться, поэтому при установке новой версии компонента проще перерегистрить.
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

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

Сообщение Ruslan Demidow » 15.11.2004 (Пн) 12:41

Можно я встряну?
В общем идея моя такова: нужно при старте программы, до того как будет отображена основная форма со сторонними контролами, проверить регистрацию этих контролов, чтобы программа не вылетала с ошибкой. А то ведь пользователь запустит пару раз мою программу, пару раз получит ошибку и забросит её в дальний угол корзины. :) А мне этого не хочется.
И я подумал что нужен такой алгоритм действий:
Запускаемся. Проверяем, зарегистрированы контролы. Если какой-то из них не зарегистрирован - тогда молча регистрируем. И продолжаем запуск. В итоге программа, даже если она не устанавливалась на компьютер (при стандартной установке компоненты конечно регистрируются), а была просто скопирована, должна запуститься без ошибок хотя бы на уровне контролов стронних производителей.
У меня программа вьювер баз сообщений FIDO, и эти базы многие хранят на сидюках. И вполне понятно желание юзера сохранить вместе с базой на сидюк и мою программу. А потом прийти например к другу и с диска без установки (простым запуском) мог в моей програме открыть эту базу и показать несколько сообщений.
Поэтму мне нужно сделать так, что если компоненты уже зарегистрированы, то чтобы программа не перетягивала регистрацию компонента (путь в реестре) на сидюк, а оставляла там же. Если же нет регистрации, тогда уже можно и на сидюке регистрировать.

Сумбурно конечно же описал. Но уж как смог. :oops:
Это Ж-ж-ж-ж неспроста (с) Винни-Пух

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

Сообщение alibek » 15.11.2004 (Пн) 12:45

Именно это и делает инсталлятор в процессе установки системы. Правда по любому требуется наличие msvbvm60.dll, но обычно это не проблема.
Проверять регистрацию компонента лучше всего по CLSID (он меняться не должен). Если записи нет, то выполняешь регистрацию (предварительно скопировав компонент в system32).
Lasciate ogni speranza, voi ch'entrate.

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 15.11.2004 (Пн) 12:49

Можно я встряну?


Можно ;)

Давай я тебе проще решение для твоего случая подскажу.

При запуске программа ищет ключик в реестре со своей версией. Если не находит его (или находит старый) то устанавливает свой компоненты как положено - в каталог System. Если ключик соответствует текущей версии то просто выполняется.

На CD компоненты лучше не регистрить, так как во первых то как ты определяешь их регистрацию не гарантирует их наличия (юзер может просто вставить CD в дисковод с другой буквой) или скопировать файлы на локальный диск - вот и получишь свою ошибку...

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

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 15.11.2004 (Пн) 12:58

Проверять регистрацию компонента лучше всего по CLSID (он меняться не должен). Если записи нет, то выполняешь регистрацию (предварительно скопировав компонент в system32).


А я вот так сравниваю:

Код: Выделить всё
If tFileInf.ActiveX Then
    On Error Resume Next
    If tlb Is Nothing Then Set tlb = CreateObject("TLI.TypeLibInfo")
    tlb.LoadRegTypeLib tFileInf.GUID, -1, -1, -1
    If Err.Number = 0 Then
        sDFile = tlb.ContainingFile
        bCopy = (tFileInf.GUID <> tlb.GUID)
        If Not bCopy Then bCopy = Not CompVersions(tFileInf.Version, tlb.MinorVersion & "." & tlb.MajorVersion & "." & tlb.LCID, sSFile)
    Else
        bCopy = True
End If
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 15.11.2004 (Пн) 13:15

Долго думал, почему это работает. Ведь по идее не должно, так как, по идее же, callwindowproc вызывает только функции с 4 параметрами. Ну пришлось дизассемблировать оную. Так вот.

Использовать эту фичу можно, но не нужно, поскольку она работает только благодаря тому, что callwindowproc скомпилирована именно так, а не иначе. В настоящий момент она выпихивает из стека адрес возврата и следующий за ним адрес прыжка (первый параметр), после чего кладёт адрес возврата обратно и выполняет jmp по адресу прыжка. То есть она сама ничего из стека не удаляет. И если этого не сделает вызываемая процедура, то всё в стеке и останется.
Рассмотрим процесс детально...

Перед переходом на CWP стек:
Код: Выделить всё
Адрес возврата в процедуру VB
Адрес прыжка (параметр 1 CWP)
hWnd (параметр 2 CWP)
0 (параметр 3 CWP)
0 (параметр 4 CWP)
0 (параметр 5 CWP)


Перед последней командой CWP стек:
Код: Выделить всё
Адрес возврата в процедуру VB
hWnd (параметр 2 CWP)
0 (параметр 3 CWP)
0 (параметр 4 CWP)
0 (параметр 5 CWP)

Эта самая последняя команда – jmp eax (а в eax предварительно помещается Адрес прыжка).

Вызываемая функция DllRegisterServer завершается командой ret (C3) (завершается, посмотрел). Поэтому она убирает из стека только этот самый адрес возврата. Четыре параметра в стеке остаются.


Честно говоря, я не понимаю, почему это не рушится. Но в общем-то случае это должно рухнуть, потому что вызывающая VB-функция ожидает, что из стека удалены все 5 параметров, а в итоге удаляется только 1. Даже если это не приведёт к крэшу, стек не резиновый.
Но это должно рухнуть!!! Потому что адрес возврата из процедуры VB будет на 16 байт дальше, чем ожидает функция!

Ничё не понимаю.
Тёмыч, чё думаешь?


Вот.
А если бы CWP была скомпилирована, к примеру, как последовательный push параметров начиная со второго, то это всё не сработало бы вообще (произошёл бы возврат по hWnd, трактуемому как адрес функции). Так что лучше так не делать. Где гарантия, что конкретный машиннокодный имплемент CWP не изменится?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

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

Сообщение Ruslan Demidow » 15.11.2004 (Пн) 15:02

Andrey Fedorov писал(а):
Можно я встряну?


Можно ;)

Давай я тебе проще решение для твоего случая подскажу.

При запуске программа ищет ключик в реестре со своей версией. Если не находит его (или находит старый) то устанавливает свой компоненты как положено - в каталог System. Если ключик соответствует текущей версии то просто выполняется.

Не хочется мне кроме регистрации компонентов связываться с реестром. :(

Andrey Fedorov писал(а):На CD компоненты лучше не регистрить, так как во первых то как ты определяешь их регистрацию не гарантирует их наличия (юзер может просто вставить CD в дисковод с другой буквой) или скопировать файлы на локальный диск - вот и получишь свою ошибку...

Так что старайся по возможности меньше мудрить...

Это я понял. Тогда я буду проверять наличие файлов, которые прописаны в ключе InppocServer32 в параметре по умолчанию - там ведь как-раз путь к OCX-файлу прописан. Если файла по этому пути нет - тогда регистрирую по новому пути. Если есть - то смело запускаюсь.
Я не мудрю. Просто хочется "всепроходимости" для своей программы. :)
Это Ж-ж-ж-ж неспроста (с) Винни-Пух

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 15.11.2004 (Пн) 15:06

Не хочется мне кроме регистрации компонентов связываться с реестром.


Или один ключик в реестре прописать/проверить или кучу ключей компонентов...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

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

Сообщение Ruslan Demidow » 15.11.2004 (Пн) 15:12

Andrey Fedorov писал(а):
Не хочется мне кроме регистрации компонентов связываться с реестром.


Или один ключик в реестре прописать/проверить или кучу ключей компонентов...
Андрей, ну ладно, предположим ключик в реестре с номером версии программы я создал.
После пользователь удалил мою программу с OCX-ми вручную. Ключик в реестре остался.
Принесут ему программу на диске, он запустит и получит вообще вылет программы, потому как она проверит именно этот ключик и убедится что всё в порядке, а следовательно смело продолжит загрузку без регистрации.
Это Ж-ж-ж-ж неспроста (с) Винни-Пух

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

Сообщение codemaster » 15.11.2004 (Пн) 15:15

Ruslan Demidow писал(а):Я не мудрю. Просто хочется "всепроходимости" для своей программы. :)


Есть одно маленькое НО.
В случае W2K/XP если пользователь "зарезан" в правах
фокусы с reg/unreg не пройдут.

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 15.11.2004 (Пн) 15:20

После пользователь удалил мою программу с OCX-ми вручную.


А вообще можешь сделать так:

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

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

Сообщение Ruslan Demidow » 15.11.2004 (Пн) 15:21

codemaster писал(а):
Ruslan Demidow писал(а):Я не мудрю. Просто хочется "всепроходимости" для своей программы. :)


Есть одно маленькое НО.
В случае W2K/XP если пользователь "зарезан" в правах
фокусы с reg/unreg не пройдут.
Понимаю. Может быть из-за этого у меня на первых этапах на некоторых машинах не запускалась с саморегистрацией программа? Вот не догадался проверить наличие прав.

А вообще, я подумал. Может быть ну его нафиг, эту регистрацию? Может быть пусть ставят на винт если нужно будет? Тем более дистриб занимает 1,24 Мб, а на диске программа занимает всего 2,8 Мб.
А то одна только автоматическая регистрация компонентов, со всеми возможными проверками приведёт к такому увеличению объёма кода, что аж страшно становится.
Это Ж-ж-ж-ж неспроста (с) Винни-Пух

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 15.11.2004 (Пн) 15:26

А вообще, я подумал. Может быть ну его нафиг, эту регистрацию? Может быть пусть ставят на винт если нужно будет? Тем более дистриб занимает 1,24 Мб, а на диске программа занимает всего 2,8 Мб.


И вообще следующие файлы можешь смело исключить из расчета занимаемого места на диске пользователя (ибо они и так скорей всего там есть в полном составе):

comcat.dll
msvbvm60.dll
oleaut32.dll
olepro32.dll
stdole2.tlb

И останется в итоге один твое exe-шник...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

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

Сообщение codemaster » 15.11.2004 (Пн) 15:35

Обновления на vb6 вообще печальная вещь.

на мой взгляд лучше всего сделать Internet проверку наличия обновлений в стиле MS. т.е. программа соединяется c твоим сайтом
и при наличии новой версии выкидывает пользователю Dlg.

ну а далее по вкусу.


P.S. В сучае инет обновления не стоит "зашивать" глубоко адрес сайта.

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 15.11.2004 (Пн) 15:37

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

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

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

Andrey Fedorov писал(а):
А вообще, я подумал. Может быть ну его нафиг, эту регистрацию? Может быть пусть ставят на винт если нужно будет? Тем более дистриб занимает 1,24 Мб, а на диске программа занимает всего 2,8 Мб.


И вообще следующие файлы можешь смело исключить из расчета занимаемого места на диске пользователя (ибо они и так скорей всего там есть в полном составе):

comcat.dll
msvbvm60.dll
oleaut32.dll
olepro32.dll
stdole2.tlb

И останется в итоге один твое exe-шник...

А я их и так не включал.
У меня в дистрибутив входят:
FIPS base Reader.exe
COMDLG32.OCX
MSCOMCTL.OCX
RICHTX32.OCX
TABCTL32.OCX
SSubTmr6.dll
vbalColumnTreeView6.ocx
vbalGrid6.ocx
vbalIml6.ocx

Первые четыре ocx для страховки - встречались случаи когда на конечном компьютере какого-нибудь из этих компонентов не было.
И то, они копируются в %system% и регистрируются только при установке, только если такой файл там отсутствует или версия уже существующего файла более старая.
А весь вопрос с последними четыремя:
Они должны лежать в каталоге программы.
первый - это сабклассер. Остальные три - примочки к стандартным компонентам.
Так вот. Если хоть один из последних четырёх не зарегистрирован - моя программа вылетает ещё на этапе запуска. А я хочу сделать авто-регистрацию. Главное, чтобы они были на месте (в каталоге программы).
Это Ж-ж-ж-ж неспроста (с) Винни-Пух

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

Сообщение codemaster » 15.11.2004 (Пн) 16:49

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


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

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


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

След.

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

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2

    TopList