Возврат DCOM сервером строки [Delphi, Windows]
От: Anders  
Дата: 11.07.02 10:25
Оценка:
Пожалуйста помогите!


Надо вернуть приложению-клиенту строку от приложения-DCOM-сервера.
С возвратом числа все Ok.
Не знаю, что не так ...

Далее код на Delphi:
Есть DCOM сервер со следующей функцией:
function TrdmControlWork.GetUserName: WideString;
begin
Result:='user';
end;

На клиенте:
procedure TfmControlWork.SpeedButton1Click(Sender: TObject);
var s : WideString;
begin
s:=dmControlWork.dcomconWork.AppServer.GetUserName;
end;


При вызове процедуры на клиенте получаю ошибку:
"The server threw an exception".

Если на сервере Result:='', то на клиенте ошибка:'Invalid callee'
Если вместо WideString использую Variant, то на клиенте
возвращатся ''(пусто).
anders
Re: Возврат DCOM сервером строки [Delphi, Windows]
От: Tom Россия http://www.RSDN.ru
Дата: 11.07.02 11:21
Оценка:
Здравствуйте Anders, Вы писали:

A>Пожалуйста помогите!



A>Надо вернуть приложению-клиенту строку от приложения-DCOM-сервера.

A>С возвратом числа все Ok.
A>Не знаю, что не так ...

A>Далее код на Delphi:

A>Есть DCOM сервер со следующей функцией:
A>function TrdmControlWork.GetUserName: WideString;
A>begin
A> Result:='user';
A>end;

A>На клиенте:

A>procedure TfmControlWork.SpeedButton1Click(Sender: TObject);
A>var s : WideString;
A>begin
A> s:=dmControlWork.dcomconWork.AppServer.GetUserName;
A>end;


A>При вызове процедуры на клиенте получаю ошибку:

A>"The server threw an exception".

A>Если на сервере Result:='', то на клиенте ошибка:'Invalid callee'

A>Если вместо WideString использую Variant, то на клиенте
A>возвращатся ''(пусто).

Вообще паскаль я забыл, но думаю тебе надо обратить внимание на proxy и idl. Какой proxy ты используешь ? Тот который oleautomation или свой и как у тебя описан интерфейс в idl?
Народная мудрось
всем все никому ничего(с).
Re[2]: Возврат DCOM сервером строки [Delphi, Windows]
От: Anders  
Дата: 12.07.02 08:13
Оценка:
Здравствуйте Tom, Вы писали:

Tom>Здравствуйте Anders, Вы писали:


Tom>Вообще паскаль я забыл, но думаю тебе надо обратить внимание на proxy и idl. Какой proxy ты используешь ? Тот который oleautomation или свой и как у тебя описан интерфейс в idl?


Использую proxy который oleautomation.

Код интерфейса:
IrdmControlWork = interface(IAppServer)
['{B3BBDE05-5A97-4B43-BD46-3D97EC4719F6}']
function GetUserName : WideString; stdcall;
end;

Но свою задачу решил по другому. Возвращаю требуемую строку
через параметр Name через указатель на вариант:
IrdmControlWork = interface(IAppServer)
['{B3BBDE05-5A97-4B43-BD46-3D97EC4719F6}']
function GetUserName(out Name: OleVariant): Integer; stdcall;
end;

В общем то поборол, но вопрос остался.
anders
Re: Возврат DCOM сервером строки [Delphi, Windows]
От: Vi2 Удмуртия http://www.adem.ru
Дата: 15.07.02 03:40
Оценка:
Здравствуйте Anders, Вы писали:

A>Надо вернуть приложению-клиенту строку от приложения-DCOM-сервера.

A>С возвратом числа все Ok.
A>Не знаю, что не так ...

A>Далее код на Delphi:

A>Есть DCOM сервер со следующей функцией:
A>function TrdmControlWork.GetUserName: WideString;
A>begin
A>  Result:='user';
A>end;


A>На клиенте:

A>procedure TfmControlWork.SpeedButton1Click(Sender: TObject);
A>var s : WideString;
A>begin
A> s:=dmControlWork.dcomconWork.AppServer.GetUserName;
A>end;



A>При вызове процедуры на клиенте получаю ошибку:

A>"The server threw an exception".

A>Если на сервере Result:='', то на клиенте ошибка:'Invalid callee'

A>Если вместо WideString использую Variant, то на клиенте
A>возвращатся ''(пусто).

Я встречал примеры на Pascal-е и WideString, и AnsiString (сам Pascal не знаю). Судя по названиям — это ANSI и UNICODE строки. В VC++ эквиваленты — char* и wchar*. Однако это не BSTR, которые нужны для передачи строк в СОМ-е.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[2]: Возврат DCOM сервером строки [Delphi, Windows]
От: Аноним  
Дата: 15.07.02 03:56
Оценка:
A>>Есть DCOM сервер со следующей функцией:
Vi2>
A>>function TrdmControlWork.GetUserName: WideString;
A>>begin
A>>  Result:='user';
A>>end;
Vi2>



Vi2>Я встречал примеры на Pascal-е и WideString, и AnsiString (сам Pascal не знаю). Судя по названиям — это ANSI и UNICODE строки. В VC++ эквиваленты — char* и wchar*. Однако это не BSTR, которые нужны для передачи строк в СОМ-е.


имхо BSTR в Delphi это именно WideString.
использую их в обе стороны и все ОК (клиент в Delphi, сервер в C++)

пример интерфейса:

interface ICryptoAPI : IUnknown
{
   HRESULT Encrypt([in] BSTR pwd, [in] long PK, [out,retval] BSTR *epd);
   HRESULT Decrypt([in] BSTR ewd, [in] long PK, [out,retval] BSTR *pwd);
   HRESULT GetKey([out, retval] long *PK);
};


в Delphi получил через TLB Import вот что:

  ICryptoAPI = interface(IUnknown)
    ['{13130A47-7675-4160-B253-3ACF56683205}']
    function  Encrypt(const pwd: WideString; PK: Integer; out epd: WideString): HResult; stdcall;
    function  Decrypt(const ewd: WideString; PK: Integer; out pwd: WideString): HResult; stdcall;
    function  GetKey(out PK: Integer): HResult; stdcall;
  end;
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.