Проблема при автоматической регистрации своего собственного ActiveX компонента
Добрый день!
Террасофт CRM 3.4.0.180, WinXP sp3, права Администратора.
Создал собственный ActiveX компонент exportonline.dll
Прописал в RunSettings.xml
в
Библиотека копируется в папку bin, но ее регистрации не происходит
при запуске Террасофт. С чем это может быть связано. И правильно ли
я все сделал для автоматической регистрации собственного ActiveX?
С помощью regsvr32.exe все проходит успешно, но мне нужно чтобы
библиотека регистрировалась автоматом после обновления.
Нравится
runsettings_23.rar
Файл прикрепил, но вроде там все нормально, тем не менее авторегистрация не проходит, а если вручную через regsvr32.exe, то все нормально.
Странно, судя по логу, команда регистрации была отправлена системе.
Можете прикрепить Вашу библиотеку, протестирую у себя локально?
Попробовал еще раз получился следующий лог, там только обновление файла, а регистрации нет
Вот мой runsettings.xml на всякий случай
Вот мой runsettings.xml на всякий случай
Андрей, попробуйте так:
<Item FileName="ExportOnline.dll" Required="True"/>
и что-бы библиотека уже была в Bin'e. У меня зарегистрировалась:
[14.01.30 14.30.03.086] Register Dll library C:\Terrasoft\Files\Bin\ExportOnline.dll [14.01.30 14.30.03.086] Command: "regsvr32" /s "C:\Terrasoft\Files\Bin\ExportOnline.dll"
Кстати, если такая команда в логе есть, почему Вы считаете что библиотека не зарегистрирована?
Так тоже не получается. При запуске Террасофта перерегистрации библиотек не происходит, новый лог не создается. Библиотеку проверяю попыткой создать activex объект в javascript. Если библиотека не зарегистрирована, то происходит ошибка. Если библиотеки нет в папке bin, то в лог пишется только обновление, а не перерегистрация. Этот лог я тоже выше прикреплял. А тот лог который я прислал первым, его лучше не учитывать, поскольку я точно не могу сказать когда он был сформирован и после каких действий. А на какой версии Вы мою библиотеку тестировали? У меня 3.4.0.180. И еще вопрос. Как террасофт определяет какие нужно регистрировать библиотеки? Ведь не может быть чтобы программа при каждом запуске их перерегистрировала. Или она смотрит на дату файла. Если файл более новый в папке bin лежит, то она только его перерегистрирует или как вообще алгоритм регистрации библиотек работает?
И еще вопрос нужно ли на Висте и Win7 запускать Террасофт от имени администратора для регистрации библиотек
Андрей, по поводу "от имени администратора" - это обязательно!
По поводу как происходит регистрация: есть 2 уровня проверки:
1) смотрим в реестр, есть ли такая библиотека. Нету - регистрируем.
2) В реестре библиотека есть. Смотрим не изменилась ли версия. Изменилась? Перерегистрируем.
Я проверял на 3.4.1, но в регистрации не думаю что меняли что-то.
Проверил в реестре - библиотека зарегистрирована:
А есть ли такая запись в реестре?
эта запись обязательна для запуска библиотеки. А то что у вас на картинке у меня такая запись была, но библиотека тем не менее не запускалась.
в ветке дерева ProgID должно быть значение ExportOnline.Online
И еще очень важный вопрос для понимания проблемы, в каком месте реестра и как террасофт проверяет регистрацию библиотеки?
Допустим если я нажимаю в проводнике правой кнопкой мыши на библиотеку делаю unregister, то при старте террасофта программа не поймет, что эта библиотека уже не зарегистрирована в данный момент. То есть проверка в реестре либо не проходит, либо проходит не там где надо.
Андрей, есть такая запись:
Выполните
regsvr32.exe /u C:\Terrasoft\Files\Bin\TSMAPILibrary.dll
а затем запустите TSClient.exe, запустится перерегистрация библиотек:
[14.01.31 11.41.18.889] Unregister Dll library C:\Terrasoft\Files\Bin\ExportOnline.dll
[14.01.31 11.41.18.890] Command: "regsvr32" /s /u "C:\Terrasoft\Files\Bin\ExportOnline.dll"
Но вот почему то регистрации у меня также не было.
Затем попробовал выполнить:
regsvr32.exe /u C:\Terrasoft\Files\Bin\TSMAPILibrary.dll regsvr32.exe /u C:\Terrasoft\Files\Bin\ExportOnline.dll
И запустить TSClient.exe:
Регистрации также не было. И запись ProgID также из реестра исчезла.
Передам данный вопрос команде разработчиков ядра для предоставления комментариев.
Здравствуйте.
Судя по всему проблема с библиотекой. При выполнении команды regsvr32.exe с ключем /u библиотека некорректно удаляется из системы, т.е. остается висеть. Можно посмотреть утилитой oleview (Library Types):
C:\Program Files (x86)\Windows Kits\8.0\bin\x86
Поэтому при удалении регистрации система при повторном запуске не запускает процесс перерегистрации.
Ну хорошо, пусть это проблема библиотеки, но на это я повлиять не могу поскольку библиотеку формирует Builder С++ 6, то и функция чистки DllUnregisterServer() формируется автоматически. Следовательно, можно ли решить проблему, если Террасофт будет проверять регистрацию библиотеки именно в той ветке реестра, где находятся InprocServer32, ProgID и т.д. Ведь эти разделы все-таки чистятся? У меня подобных библиотек для Террасофта на Билдере много.
Пробовали ли вы другие ваши библиотеки подключать?
Если да, то они нормально регистрируются и удаляются(что важнее) из системы?
Другие библиотеки работают аналогично первой. Чистятся только следующие разделы
HKEY_CLASSES_ROOT\CLSID\GUID Библиотеки\
HKEY_CLASSES_ROOT\CLSID\ExportOnline.Online
Возможно это особенность Билдера 6. Может ли Террасофт проверять зарегистрирована ли библиотека именно в этих разделах?
Андрей, попробую уточнить у коллег из департамента разработки.
Здравствуйте.
К сожалению, нет - мы не будем "собирать" отдельное ядро с таким поведением.
Однако, для обхода этой проблемы, выполните:
(Все ниже действия выполняются в текущей папке Terrasoft)
1. Создать bat файл unreg.bat
2. В нем пишем код:
@echo off regsvr32 ExportOnline.dll /s/u Reg delete "HKEY_CLASSES_ROOT\TypeLib\{74FCD2F5-4432-4309-A978-B267819572E1}" /f TSClient.exe
3. Для созданного батника создаем ярлык (можно сменить иконку).
4. Запускаем ярлык.
пс: cmd окно также можно спрятать:
1. Создаем файл Hide.vbs
2. В нем пишем скрипт:
Set WshShell = CreateObject("WScript.Shell")
RetCode = WshShell.Run("S:\TerrasoftCRM\Bin\unreg.bat", 0, False)
3. Создаем ярлык, по такому же сценария как и для unreg.bat
4. Запускаем созданный ярлык
Я решил сделать немного по другому и воспользоваться настройкой runsettings.
В runsettings.xml пишу
<!-- Commands for execute after update --> <PostUpdateRun> <Item FileName="{tscrm}\regdll.cmd" Parameters="" Show="True" UseSessionUser="False" Version="" /> </PostUpdateRun> <!-- Commands for execute before execute application --> - <PreExecuteRun> <Item FileName="{tscrm}\regdll.cmd" Parameters="" Show="True" UseSessionUser="False" Version="" /> </PreExecuteRun>
в regdll.cmd пишу такой код
regsvr32 ExportOnline.dll
Но этот код не отрабатывает ни на PostUpdateRun, ни на PreExecuteRun
в лог пишется вот что
[14.02.24 06.29.13.209] Run PreUpdateCommands [14.02.24 06.29.13.209] Run Deleting [14.02.24 06.29.13.209] Update local file G:\Program Files\Terrasoft\Bin\..\Bin\1.txt from network file \\expert\pubfull\TSUpdateLocal\Bin\1.txt [14.02.24 06.29.13.256] Run PostUpdateCommands
Это ошибка Террасофта или я что-то не так делаю?
Здравствуйте, Андрей!
Видимо, не там распологается файл для запуска. Попробуйте прописать путь без использованя макросов.
У меня отрабатывает так:
<PreExecuteRun> <Item FileName="C:\Users\a.kasparevich\Desktop\Terrasoft 3x\3.4.0.180\test.cmd" Parameters="" Show="True" UseSessionUser="False" Version="" /> </PreExecuteRun>
В файле просто команда "pause".
Андрей, обнаружена ошибка в статье по runsettings. Обратите внимание на комментарий.