Проблема при автоматической регистрации своего собственного ActiveX компонента

Добрый день!

Террасофт CRM 3.4.0.180, WinXP sp3, права Администратора.
Создал собственный ActiveX компонент exportonline.dll
Прописал в RunSettings.xml

  Enabled="True" Force="False" Type="Network" Path="\\expert\pubfull\TSUpdate" URL="" FTPUserName="" FTPPassword="" MaxIterations="5"/>
  в > добавил строку
  FileName="ExportOnline.dll"/>

Библиотека копируется в папку bin, но ее регистрации не происходит
при запуске Террасофт. С чем это может быть связано. И правильно ли
я все сделал для автоматической регистрации собственного ActiveX?

С помощью regsvr32.exe все проходит успешно, но мне нужно чтобы
библиотека регистрировалась автоматом после обновления.

Нравится

24 комментария

Можно получить RunSettings.log ?

runsettings_23.rar
Файл прикрепил, но вроде там все нормально, тем не менее авторегистрация не проходит, а если вручную через regsvr32.exe, то все нормально.

Странно, судя по логу, команда регистрации была отправлена системе.
Можете прикрепить Вашу библиотеку, протестирую у себя локально?

Прикрепил exportonline.rar

runsettings_28.rar

Попробовал еще раз получился следующий лог, там только обновление файла, а регистрации нет

runsettingsxml.rar

Вот мой runsettings.xml на всякий случай

runsettingsxml.rar

Вот мой 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. Обратите внимание на комментарий.

Спасибо, проблема решена

Показать все комментарии