Delphi - несколько удаленных объектов com

Мое приложение D5 находится на сервере, который удаленно используется несколькими пользователями, поэтому мне нужно использовать следующую функцию для создания COM-объекта для запуска другого приложения (LmPos), установленного обратно на ПК этого пользователя при запуске:

CreateRemoteComObject(const MachineName: WideString; const ClassID: TGUID): IUnknown;

вместо создания локального COM-объекта, как раньше:

EposServer := CreateOLEObject('POS.Server');

Однако MachineName и ClassID для подключения будут зависеть от того, какие пользователи запускают это приложение. Я вижу две проблемы в этом...

Параметры должны быть постоянными, так как я могу назначить их переменными? Или это невозможно, поскольку они константы.

Если я требую пользовательского ввода, как мне преобразовать строку в TGUID? Кажется, он принимает только формат: = '{xxxx-xxxx-xxxx etc}'

Любая помощь будет принята с благодарностью. Я даже не уверен, возможно ли это в настоящее время, я пытаюсь настроить DCOM, но безуспешно.


person notidaho    schedule 04.10.2011    source источник
comment
Если вы поместили ярлык из общего ресурса на машину и запускаете приложение оттуда, вы ничего не удаляете, создайте локальный COM-объект. Вы можете передавать переменные как константные параметры. См. StringToGUID.   -  person Sertac Akyuz    schedule 04.10.2011
comment
@Sertac, если вопрос здесь How do I convert the String into a TGUID ?, то ответом будет ваш комментарий;)   -  person TLama    schedule 04.10.2011
comment
@TLama - Глядя на заголовок, я бы сказал, что не совсем понимаю, в чем вопрос.. Спасибо за голос :)   -  person Sertac Akyuz    schedule 04.10.2011
comment
Спасибо, функция StringToGUID полезна, но мне нужен удаленный COM-объект. Пользователи должны иметь возможность удаленно подключаться к серверу, запускать приложение (Bookings), которое создает удаленную COM-ссылку на ПК пользователя для запуска локального приложения (Point of Sale). Видимо так быстрее работает...   -  person notidaho    schedule 04.10.2011
comment
@notidaho ...The parameters must be constant, so how can I assign them variable? Просто присвойте любое допустимое значение параметрам, параметры которых помечены как const, это не означает, что это не может быть значением переменной, это просто означает, что компилятор не позволит вам напрямую изменить его и только когда-либо читается по процедуре CreateRemoteComObject. Таким образом, вы можете использовать что-то вроде этого CreateRemoteComObject(MachineName,StringToGUID('{CA82B1FB-3D6C-4C16-871B-A6808A4D9F3A}')) без проблем.   -  person RRUZ    schedule 04.10.2011
comment
ок, спасибо, настроил нормально. Теперь нужно заставить удаленную машину принять вызов. В настоящее время я получаю сообщение Ошибка выполнения сервера   -  person notidaho    schedule 05.10.2011


Ответы (1)


AFAIK удаленное приложение DCOM на сервере всегда будет работать с текущим зарегистрированным пользователем, как вы сказали.

Избавьтесь от DCOM, если можете. Это устаревшая технология, и Windows Seven и 2008 Server ее не любят. Вам нужно принудительно использовать протокол SMB 1 на ПК, и даже с этим у нас было много проблем.

Недавно я столкнулся с аналогичной проблемой с некоторым пулом приложений Delphi 5. Я преобразовал вызовы DCOM существующих приложений Delphi 5 в службу HTTP, используя http://blog.synops.info/post/2011/03/11/HTTP-server-using-fast-http.sys.-kernel-mode-server, работающий в службе Windows (запускается при запуске сервера, даже до того, как какой-либо пользователь войдет в систему), и WinHTTP для клиента, который имитирует исходный класс DCOM (поэтому на клиенте поменялся только один блок). Поскольку HTTP не имеет состояния, для передачи событий с сервера клиентам я добавил в класс клиента запрос на основе таймера для получения любого ожидающего события с сервера (времени 500 мс достаточно и эффективно). Это решение прекрасно работало с существующим кодом Delphi 5, а конечным пользователям понравился результат с точки зрения скорости и стабильности.

person Arnaud Bouchez    schedule 05.10.2011
comment
спасибо Арно. Требует ли этот метод чего-то другого в коде, кроме CreateRemoteComObject, в противном случае я могу предложить его ИТ-специалистам на месте. Очевидно, что это не идеальное обслуживание клиентов, но мне кажется, что это немного выше моего понимания только для одного клиента. - person notidaho; 05.10.2011
comment
@notidaho Конечно, это может привести к переписыванию большого количества кода, если вам нужно преобразовать много классов DCOM. В моем случае был только один, так что это было легко сделать. С таким решением вы больше не используете DCOM. Но вам придется переписать часть кода вашего сервера и клиента. Это проблема не только ИТ-отдела — даже если ИТ-специалисты определенно предпочтут видеть пакеты HTTP в сети, а не DCOM. - person Arnaud Bouchez; 05.10.2011
comment
Неправильно: удаленный сервер приложений будет работать с пользователем, указанным в DCOMCnfg.exe — те же свойства можно задать при установке сервера с использованием соответствующих параметров реестра. Многие проблемы с DCOM связаны с его сложностью, скудной документацией и отсутствием знаний у разработчика/пользователя. Я бы избавился от D5 до DCOM. D5 здесь действительно старая технология. - person ; 02.11.2011