Не могу возвратить клиенту интерфейс объекта
От: Body Россия ICQ:55192992
Дата: 21.12.01 14:10
Оценка:
Существует метод на сервере 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;

Подскажите пожалуйста — чего я неправильно делаю.
А если точно не знаете, то может мысли какие-нить есть по этому поводу.
Re: Не могу возвратить клиенту интерфейс объекта
От: VVV Россия  
Дата: 21.12.01 15:42
Оценка:
Здравствуйте 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 и др.
Re: Не могу возвратить клиенту интерфейс объекта
От: VladD2 Российская Империя www.nemerle.org
Дата: 21.12.01 15:46
Оценка:
Здравствуйте Body.


Ой я Паскалем сто лет не возился, но может:

    function  GetParams(const AName: WideString): OleVariant; safecall;


Лучше заменить на что-то вроде:

    function  GetParams(const AName: WideString; var ret : OleVariant): HResult safecall;



Т.е., в терминах idl, описать параметр как [out, retval].
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Не могу возвратить клиенту интерфейс объекта
От: Body Россия ICQ:55192992
Дата: 24.12.01 07:57
Оценка:
Здравствуйте 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 Россия ICQ:55192992
Дата: 24.12.01 08:00
Оценка:
Здравствуйте VladD2, Вы писали:

VD>Здравствуйте Body.



VD>Ой я Паскалем сто лет не возился, но может:


VD>
VD>    function  GetParams(const AName: WideString): OleVariant; safecall;
VD>


VD>Лучше заменить на что-то вроде:


VD>
VD>    function  GetParams(const AName: WideString; var ret : OleVariant): HResult safecall;
VD>


VD>Т.е., в терминах idl, описать параметр как [out, retval].


Описано как:
[id(0x00000003)]
HRESULT _stdcall GetParams([in] BSTR AName, [out, retval] VARIANT * Result );


Вся проблема видимо в маршалинге интерфейсов между различными процессами.
Re: Не могу возвратить клиенту интерфейс объекта
От: Резник Андрей Борисович Россия  
Дата: 24.12.01 09:08
Оценка:
Здравствуйте 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
WBR, Andrey Reznik (2:5020/2999, Andrey_Reznik@rambler.ru)
Re[2]: Не могу возвратить клиенту интерфейс объекта
От: Body Россия ICQ:55192992
Дата: 24.12.01 09:42
Оценка:
Здравствуйте Резник Андрей Борисович, Вы писали:

РАБ>Первейшая мысль: а V — это OleVariant. Я Дельфи помню плохо, но внутренний голос мне подсказывает, что V.GetParams в этом случае будет запускатся через Invoke(). И этот же голос мне подсказывает, что сервер имеет не дуальный интерфейс, а custom, и тамошний Invoke() ничего про твою функцию не знает. Отсюда и ошибка.

РАБ>Sorry, если я не прав, но это первое, что в голову приходит.

Все верно.
Метод GetParams должен вызываться через Invoke.
И мой интерфейс описан как:
[code]
// *********************************************************************//
// Interface: IConnectInfo
// Flags: (4416) Dual OleAutomation Dispatchable
// GUID: {82EDA7F0-AAE6-453B-A8E2-BDB3E841B4C4}
// *********************************************************************//

IConnectInfo = interface(IDispatch)
{82EDA7F0-AAE6-453B-A8E2-BDB3E841B4C4}
function GetParams(const AName: WideString): OleVariant; safecall;
end;

// *********************************************************************//
// DispIntf: IConnectInfoDisp
// Flags: (4416) Dual OleAutomation Dispatchable
// GUID: {82EDA7F0-AAE6-453B-A8E2-BDB3E841B4C4}
// *********************************************************************//
IConnectInfoDisp = dispinterface
{82EDA7F0-AAE6-453B-A8E2-BDB3E841B4C4}
function GetParams(const AName: WideString): OleVariant; dispid 3;
end;
[\code]

То есть он поддерживает дуальность.
Мне кажеться, что клиентское приложение просто не знает об этом интерфейсе и может быть просто необходимо каким-нить образом подгружать библиотеку типов. А как это делать — пока НИ НИ. (ну не знаю, а нужно ОЧЕНь )
Re[3]: Не могу возвратить клиенту интерфейс объекта
От: Body Россия ICQ:55192992
Дата: 24.12.01 10:29
Оценка:
Всем огромное спасибо, а в особенности модератору Резнику Андрею, который
подтолкнул меня на проверку правильности создания объекта, где и обнаружилась
ошибка.
Ошибка была в том, что при создании объекта я передавал неправильный GUID dispinterface
и соответственно информация о возможных методах была неверна.
УРАААААААА!!!!
Re[4]: Не могу возвратить клиенту интерфейс объекта
От: Резник Андрей Борисович Россия  
Дата: 24.12.01 16:02
Оценка:
Здравствуйте Body, Вы писали:

B>Всем огромное спасибо, а в особенности модератору Резнику Андрею, который

B>подтолкнул меня на проверку правильности создания объекта, где и обнаружилась
B>ошибка.

Рад за тебя. Только ты зря обратил внимания на мой template теперь объясняться придется, а то неправильно поймут RU.COM.ACTIVEX, где я модератор- это фидошная эха, к этому форуму отношения не имеет, кроме общей тематики.

B>Ошибка была в том, что при создании объекта я передавал неправильный GUID dispinterface

B>и соответственно информация о возможных методах была неверна.
B>УРАААААААА!!!!

WBR,Andrey_Reznik(2:5020/2999)
Moderator of RU.COM.ACTIVEX
WBR, Andrey Reznik (2:5020/2999, Andrey_Reznik@rambler.ru)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.