Существует метод на сервере TAAA, который должен возвращать интерфейс на TAutoIntfObject который поддерживает интерфейс IConnectInfo;
IConnectInfo = interface(IDispatch)
{########-############-###########-#}
function GetParams(const AName: WideString): OleVariant; safecall;
end;
function TAAA.GetConnection(Index: Integer): IDispatch;
begin
//FConnectInfo — интерфейс на необходимый объект
Result := FConnectInfo as IDispatch;
end;
На клиенте:
Var
AI : IDispatch;
V : OleVariant;
begin
AI := SockectConnection.AppServer.GetConnection(#####);
V := AI;
V.GetParams('AAA'); <--- вот тут происходит ошибка
Method "GetParams" not supported by automation object
end;
Подскажите пожалуйста — чего я неправильно делаю.
А если точно не знаете, то может мысли какие-нить есть по этому поводу.
Здравствуйте Body, Вы писали:
B>Существует метод на сервере TAAA, который должен возвращать интерфейс на TAutoIntfObject который поддерживает интерфейс IConnectInfo; B> IConnectInfo = interface(IDispatch) B> {########-############-###########-#} B> function GetParams(const AName: WideString): OleVariant; safecall; B> end;
B>function TAAA.GetConnection(Index: Integer): IDispatch; B>begin B> //FConnectInfo — интерфейс на необходимый объект B> Result := FConnectInfo as IDispatch; B>end;
B>На клиенте:
B>Var B> AI : IDispatch; B> V : OleVariant; B>begin B> AI := SockectConnection.AppServer.GetConnection(#####); B> V := AI; B> V.GetParams('AAA'); <--- вот тут происходит ошибка B> Method "GetParams" not supported by automation object B>end;
B>Подскажите пожалуйста — чего я неправильно делаю. B>А если точно не знаете, то может мысли какие-нить есть по этому поводу.
не совсем понимаю по паскалевски , но что-то сказать попробую:
1. зарегистрирована ли для сервера библиотека типов?
2. oleautomation маршалинг сделан для языков типа бейсика, а у них там особый тип строк- BSTR называется, т.е. надо описать в IDL-файле (или где это в Delphi?) параметр как BSTR (не знаю что такое WideString, скорее всего WCHAR* и передавать из клиента именно BSTR — смотри функции SysAllocString, SysFreeString и др.
Здравствуйте VVV, Вы писали:
VVV>1. зарегистрирована ли для сервера библиотека типов?
Все это в данный момент времени отлаживается на одной машине , поэтому библиотека тмпов зарегистрирована на 100%.
VVV>2. oleautomation маршалинг сделан для языков типа бейсика, а у них там особый тип строк- BSTR называется, т.е. надо описать в IDL-файле (или где это в Delphi?) параметр как BSTR (не знаю что такое WideString, скорее всего WCHAR* и передавать из клиента именно BSTR — смотри функции SysAllocString, SysFreeString и др.
WideString при описании интерфейсов в Delphi означает тоже самое что и BSTR.
HRESULT _stdcall GetParams([in] BSTR AName, [out, retval] VARIANT * Result );
Вся проблема видимо в маршалинге интерфейсов между процессами.
Re[2]: Не могу возвратить клиенту интерфейс объекта
Здравствуйте Body, Вы писали:
B>Существует метод на сервере TAAA, который должен возвращать интерфейс на TAutoIntfObject который поддерживает интерфейс IConnectInfo; B> IConnectInfo = interface(IDispatch) B> {########-############-###########-#} B> function GetParams(const AName: WideString): OleVariant; safecall; B> end;
B>Var B> AI : IDispatch; B> V : OleVariant; B>begin B> AI := SockectConnection.AppServer.GetConnection(#####); B> V := AI; B> V.GetParams('AAA'); <--- вот тут происходит ошибка B> Method "GetParams" not supported by automation object B>end;
B>Подскажите пожалуйста — чего я неправильно делаю. B>А если точно не знаете, то может мысли какие-нить есть по этому поводу.
Первейшая мысль: а V — это OleVariant. Я Дельфи помню плохо, но внутренний голос мне подсказывает, что V.GetParams в этом случае будет запускатся через Invoke(). И этот же голос мне подсказывает, что сервер имеет не дуальный интерфейс, а custom, и тамошний Invoke() ничего про твою функцию не знает. Отсюда и ошибка.
Sorry, если я не прав, но это первое, что в голову приходит.
WBR,Andrey_Reznik(2:5020/2999)
Moderator of RU.COM.ACTIVEX
Здравствуйте Резник Андрей Борисович, Вы писали:
РАБ>Первейшая мысль: а V — это OleVariant. Я Дельфи помню плохо, но внутренний голос мне подсказывает, что V.GetParams в этом случае будет запускатся через Invoke(). И этот же голос мне подсказывает, что сервер имеет не дуальный интерфейс, а custom, и тамошний Invoke() ничего про твою функцию не знает. Отсюда и ошибка. РАБ>Sorry, если я не прав, но это первое, что в голову приходит.
Все верно.
Метод GetParams должен вызываться через Invoke.
И мой интерфейс описан как:
[code]
// *********************************************************************//
// Interface: IConnectInfo
// Flags: (4416) Dual OleAutomation Dispatchable
// GUID: {82EDA7F0-AAE6-453B-A8E2-BDB3E841B4C4}
// *********************************************************************//
То есть он поддерживает дуальность.
Мне кажеться, что клиентское приложение просто не знает об этом интерфейсе и может быть просто необходимо каким-нить образом подгружать библиотеку типов. А как это делать — пока НИ НИ. (ну не знаю, а нужно ОЧЕНь )
Re[3]: Не могу возвратить клиенту интерфейс объекта
Всем огромное спасибо, а в особенности модератору Резнику Андрею, который
подтолкнул меня на проверку правильности создания объекта, где и обнаружилась
ошибка.
Ошибка была в том, что при создании объекта я передавал неправильный GUID dispinterface
и соответственно информация о возможных методах была неверна.
УРАААААААА!!!!
Re[4]: Не могу возвратить клиенту интерфейс объекта
Здравствуйте Body, Вы писали:
B>Всем огромное спасибо, а в особенности модератору Резнику Андрею, который B>подтолкнул меня на проверку правильности создания объекта, где и обнаружилась B>ошибка.
Рад за тебя. Только ты зря обратил внимания на мой template теперь объясняться придется, а то неправильно поймут RU.COM.ACTIVEX, где я модератор- это фидошная эха, к этому форуму отношения не имеет, кроме общей тематики.
B>Ошибка была в том, что при создании объекта я передавал неправильный GUID dispinterface B>и соответственно информация о возможных методах была неверна. B>УРАААААААА!!!!
WBR,Andrey_Reznik(2:5020/2999)
Moderator of RU.COM.ACTIVEX