Перейти к публикации

Как зарегистрировать функцию c++


cppGhost

Рекомендованные сообщения

Ответ наверянка прост, и я даже где-то видел в каком-то мануале, но не могу никак найти. В плагине вызывается функция

TCComponent iComp = (TCComponent) userServ.call("SDB_XXX_create", objc);

выбрасывается исключение. как я понимаю, пытается вызваться функция из c++ dll. таковую я нашел, но она явно не зарегистрирована. Какие операции нужно произвести или хотя бы, где почитать. Спасибо

Ссылка на сообщение
Поделиться на других сайтах


Всё еще копаю. Нашел такую штуку, что в переменную TC_customization_libraries надо было добавить свою dll. Но всё равно метод пока не видит. Что еще я упускаю?

Ссылка на сообщение
Поделиться на других сайтах
TC_customization_libraries

здесь прописывается имя dll.
В dll делаете точку входа с названием самой библиотеки + "_register_callbacks" .
Далее внутри этой функции регистрируете то что вам нужно.

Для юзер_серфиса:
CUSTOM_register_exit("имя dll", "USERSERVICE_register_methods", my_register_userservices);

далее внутри my_register_userservices регистрирует сервисы:
USERSERVICE_register_method("my_service", my_service, num_arg, arg_list, USERARG_INT_TYPE);

 
Ссылка на сообщение
Поделиться на других сайтах

Ответ наверянка прост, и я даже где-то видел в каком-то мануале, но не могу никак найти. В плагине вызывается функция





TCComponent iComp = (TCComponent) userServ.call("SDB_XXX_create", objc);

выбрасывается исключение. как я понимаю, пытается вызваться функция из c++ dll. таковую я нашел, но она явно не зарегистрирована. Какие операции нужно произвести или хотя бы, где почитать. Спасибо

вы сами ответили себе на вопрос.

возьмите этот "какой-то мануал" по кастомизации, и читайте раздел User Services (регистрация своих функций на стороне сервера и вызов их из клиента на Java)

 

какое именно исключение вылетает? если исключение в духе ошибка доступа к памяти или какой-нибудь fatal error, то это говорить может о косяках в коде самой функции больше

 

с чего вы вообще взяли что она не зарегистрирована? если функция действительно не зарегистрирована обычно система выдаст сообщение что coud not find registered user function что-то вроде этого

 

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

Изменено пользователем lexx174
Ссылка на сообщение
Поделиться на других сайтах

Спасибо за разъяснение механизма. На самом деле, это ведь я просто пытаюсь перейти на TC10 с TC8. То есть прежний код работал и там действительно всё так. Я просто перекомпилял свою dll под x64. 

В зависимостях вроде все библиотеки присутствуют. Но когда пытаюсь вызвать через call, то появляется сообщение "Указанный метод не зарегистрирован для обслуживания пользователей"

 

Сама функция не вызывается. В начале ее стоит MSgBox, то есть просто не может быть совершен вызов. И ведь в TC8 все работало. Может еще не самым правильным образом установили сам TC, но как это может повлиять на вызов, я не очень понимаю

Изменено пользователем cppGhost
Ссылка на сообщение
Поделиться на других сайтах

В тупике  :wallbash:    Создал пустой проект dll, назвал его TC10. объявил функцию 

extern __declspec(dllexport) int tc10_register_callbacks()
{
	printf("%s: TEST TEST TEST TEST TEST TEST\n", modul_name);

	return 1;
}

добавил в tc_customization_libraries переменную tc10, перезапускаю teamcenter, соединяюсь с БД и в ТАО тишина. Что же не так то?

Ссылка на сообщение
Поделиться на других сайтах

Пробуйте вместо printf использовать TC_write_syslog
Сообщение должно быть в логе тс на сервере


printf в tc теперь не работает (по крайней мере у меня)

Изменено пользователем koner
Ссылка на сообщение
Поделиться на других сайтах

Увы, пустота. Пробовал еще MessageBox, создавать файл. Функция не вызывается. У меня заканчивается фантазия))

Ссылка на сообщение
Поделиться на других сайтах

Можно еще настройки проекта VS потыкать
отключить оптимизацию.
"настройка" многопоточности иногда влияет, у меня в 10 стоит /MD.
Ну и еще раз проверить все названия ( в преференсе без .dll)

Ссылка на сообщение
Поделиться на других сайтах

так вы используете класический UserService или custom_exits ? прописывать в преференсах нужно при использовании custom_exits.

 

 

по поводу "Указанный метод не зарегистрирован для обслуживания пользователей": самый простой вариант может быть из-за того что например у вас TC_ROOT  настроен на BIN клиента,а не сервера.  У меня как-то так было случайно забыл переменные подправить чтоб ссылались непосредственно на сервер.

 

если уверены что все правильно у вас, то почитайте внимательно документацию. в TC10 запросто радикально могли что-то поменять. Кстати userServ.call в TC10 вроде уже deprecated, хотя еще должно работать. Попробуйте через SOA методы

Ссылка на сообщение
Поделиться на других сайтах

Радикально в юзерСервисах ничо не поменялось. У меня код c юзерСервисом с tc8 на tc10 переехал без проблем, с заменой lib-ов и перекомпиляцией.
Да и причем тут юзерСервисы если у него dll вообще не загружается. Может там в логе чо есть. 
По опыту основные причины не загрузки dll
1. Тупо не находит длл (напутано ченить с путями)
2. Не может найти и загрузить зависимые библиотеки.
3. Не может загрузить т.к. не верно скомпилировано (влияют настройки проекта, разрядность и др.).
4. Пятница)

Изменено пользователем koner
Ссылка на сообщение
Поделиться на других сайтах

В логах стала появляться вот такая запись "ERROR loading C:\TC10\TC10\bin\MyLib.dll: Не найден указанный модуль.". Естественно по этому адресу файл лежит. Может ли это быть просто кривое сообщение об ошибке?

Или данное сообщение вполне может означать, что файл есть, но загрузить его не удалось по каким-то причинам?

Ссылка на сообщение
Поделиться на других сайтах

С разрядностью да. Я пошел дальше. Создал на той же машине новую dll с одной экспортной функцией. Прописал ее tc_customization_libraries. В итоге логе: dll успешно загрузилась, но вот функцию TC не увидел. Всё один в один (ну на первый взгляд). 

Ссылка на сообщение
Поделиться на других сайтах

Вот, кстати, сообщение из лога по поводу функции 

ERROR - 2016/8/15-15:22:09.665 UTC - vm-tc-10.03956.UnknownClient.00001 - Symbol tc100_register_callbacks not found - Teamcenter at R:\units\tc_syss\tc_syss.10.1_wntx64\src\syss\no\ind\lmldr.c(1594)

Ссылка на сообщение
Поделиться на других сайтах

Проблема решилась. Я смотрел зависимости TotalCommander'ом. Обычно в нём всё ок. Но тут оказалось, что через несколько зависимых dll одной не хватало, поэтому и не хотел грузить. Всем спасибо, всё равно много нового и полезного я для себя вынес

Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

Вы можете опубликовать сообщение сейчас, а зарегистрироваться позже. Если у вас есть аккаунт, войдите в него для написания от своего имени.
Примечание: вашему сообщению потребуется утверждение модератора, прежде чем оно станет доступным.

Гость
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Вставить в виде обычного текста

  Разрешено не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу.

×
×
  • Создать...