Цитата:
Сообщение от
ShkipeRR
Из компании сканкод мне предложили получать данные из компоненты в Аксапту такими способами как колбек, эвент и сообщение окну.
Цитата:
Сообщение от
ShkipeRR
из этих способов что нито аксапта 3.0 поддерживает и где можно это посмотреть или почитать про эти 3 способа?
Аксапта написана для работы под управлением виндов, поэтому если ее научить, то она сможет делать (для 3.0 - почти) все, что могут делать другие виндовые приложения, другой вопрос, насколько это будет трудоемко. С вариантом callback-функции могут возникнуть определенные сложности, потому что там необходимо, чтобы эта функция была скомпилирована с учетом определенных соглашений о вызовах (т.н.
__stdcall). Под event'ом разработчики из Сканкода, видимо, понимают дергание обработчиков событий ActiveX-объектов, Аксапта это поддерживает, но нужно, чтобы сперва соотв. ActiveX-компонент кто-то написал. В этом смысле, наверно, вариант с обработкой оконных сообщений выглядит наиболее простым с точки зрения реализации на Х++. Пример реализации цикла обработки оконных сообщений можно посмотреть в \Classes\TableLookup_RU\waitAndSearch (по идее этот класс должен быть в 3.0, но сейчас проверить у меня нет возможности). Вкратце, в Windows есть окна, окна принимают сообщения, для которых организуется очередь, и есть callback-функции - обработчики оконных сообщений, в т.ч. обработчики по умолчанию, выполняющие большую часть рутинных операций; обработчики оконных сообщений также называют оконными функциями (Window Proc). Сообщение окну может быть помещено в очередь (для асинхронной обработки) либо может быть отправлено (для синхронной обработки с использованием прямого вызова оконной функции). Окна и оконные функции могут использоваться не только для отрисовки и реализации собственно окон (включая меню, кнопки и проч.), но и для сценариев интеграции, как в рассматриваемом случае. Обычно приложение организует
цикл обработки оконных сообщений, который представляет собой нечто вроде:
PHP код:
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
Тут за кадром остаются вызовы оконных функций, зарегистрированных для каждого соотв. класса окна. Опять же, поскольку оконные функции - это callback-функции, то реализация их в Аксапте на Х++ сопряжена с определенными трудностями (см. про __stdcall), но в примере с TableLookup_RU разработчики несколько упростили себе жизнь и вместо создания своей callback-функции встроили логику в цикл обработки сообщений, пожертвовав асинхронностью. Возможно, имеет смысл пойти примерно по тому же пути. Остается маленький нюанс - собственно создание окна, чья очередь сообщений задействуется в интеграции. Для этого используются функции
CreateWindow/
CreateWindowEx; перед созданием окна нужно зарегистрировать соотв. класс окна либо использовать один из предопределенных системных классов, таких как "BUTTON" или "EDIT". Конкретный класс окна влияет на его внешний вид и функциональные возможности, но поскольку тут окно нужно лишь для доступа к инфраструктуре обмена (оконными) сообщениями, конкретный класс не особо важен.
В общем, как мне представляется, с помощью оконных сообщений можно пусть не очень красиво и с использованием кучи оберток для функций Win32 API, но реализовать интеграцию на голом Х++, без написания дополнительных прослоек. Опять же, веселуха начнется в случае, когда на один хост с этой CipherLabTCPIP.dll начнут одновременно приходить данные от нескольких ТСД - это все надо будет разруливать внутри одной сессии Business Connector, крутящей цикл обработки оконных сообщений.
На счет доступа по http и тривиальности реализации в этом случае - утверждение, как мне кажется, не вполне однозначное

Вместо одной сессии с легкой реализацией хранения состояния и непростой реализацией разруливания параллельного доступа с нескольких ТСД получится, условно, куча stateless-сессий http с легким разруливанием параллельного доступа с нескольких ТСД, но с непростой реализацией хранения состояния каждой сессий. Плюс из http-сервера все равно надо будет дергать Business Connector. Впрочем, кому что удобнее.