Надо вернуть приложению-клиенту строку от приложения-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, Вы писали:
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?
Здравствуйте 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, Вы писали:
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, которые нужны для передачи строк в СОМ-е.
Vi2>Я встречал примеры на Pascal-е и WideString, и AnsiString (сам Pascal не знаю). Судя по названиям — это ANSI и UNICODE строки. В VC++ эквиваленты — char* и wchar*. Однако это не BSTR, которые нужны для передачи строк в СОМ-е.
имхо BSTR в Delphi это именно WideString.
использую их в обе стороны и все ОК (клиент в Delphi, сервер в C++)