powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Переменная в веб сервисе
12 сообщений из 12, страница 1 из 1
Переменная в веб сервисе
    #39573257
roma1975
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте.

У меня возник такой вопрос. Есть функция которая вызывается из вне она имеет входной параметр, скажем строковый.
Внутри функции этот параметр может меняться. Можно ли из вне получить изменённое значение этого параметра не используя
вызов дополнительной функции?

Т. е. функция
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
   
function TWSTest.test(s_in: Widestring): widestring;
var s: string;
begin
s:=s_in;
s_in:='r1';
result:='webservices='+ s;
end;


s_in - нужно получить во вне
...
Рейтинг: 0 / 0
Переменная в веб сервисе
    #39573271
fraks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
function TWSTest.test(var s_in: Widestring): widestring;
begin
...
end;

procedure TWSTest.main;
var
  s1: string;
  s2: string; 
begin
  s1 := '123';
  s2 := test(s1);
end;
...
Рейтинг: 0 / 0
Переменная в веб сервисе
    #39573272
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
roma1975
Код: pascal
1.
function TWSTest.test(var s_in: Widestring)


roma1975
Код: pascal
1.
function TWSTest.test(out s_in: Widestring)
...
Рейтинг: 0 / 0
Переменная в веб сервисе
    #39573355
roma1975
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет для var и out выдаёт ошибку при использовании.

Код: pascal
1.
2.
[Pascal Error] Unit2.pas(32): E2033 Types of actual and formal var parameters must be identical
[Pascal Fatal Error] Project2.dpr(6): F2063 Could not compile used unit 'Unit2.pas'



Сама функция:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
TWSTest = class(TInvokableClass, IWSTest)
  public

   function test(out s_in: Widestring): widestring; stdcall;

  end;

implementation


{ TWSTest }

function TWSTest.test(out s_in: Widestring): widestring;
begin
s_in:='fg';
result:='webservices=99';
end;

вызов функции и модуль описания:


Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
 uses IWSTest1;
...

procedure TForm1.Button1Click(Sender: TObject);
var s,s1: string;
begin
s:=Edit1.Text;
  Memo1.text:=GetIWSTest.test(s1);
end;

 IWSTest = interface(IInvokable)
  ['{8706A028-4699-6AE6-215C-61B3A0587B66}']
    function  test(out s_in: WideString): WideString; stdcall;
  end;

function GetIWSTest(UseWSDL: Boolean=System.False; Addr: string=''; HTTPRIO: THTTPRIO = nil): IWSTest;


implementation

function GetIWSTest(UseWSDL: Boolean; Addr: string; HTTPRIO: THTTPRIO): IWSTest;
const
  defWSDL = 'C:\pr1\IWSTest.xml';
  defURL  = 'http://localhost/ws1/WebServiceTest.dll/soap/IWSTest';
  defSvc  = 'IWSTestservice';
  defPrt  = 'IWSTestPort';
var
  RIO: THTTPRIO;
begin
  Result := nil;
  if (Addr = '') then
  begin
    if UseWSDL then
      Addr := defWSDL
    else
      Addr := defURL;
  end;
  if HTTPRIO = nil then
    RIO := THTTPRIO.Create(nil)
  else
    RIO := HTTPRIO;
  try
    Result := (RIO as IWSTest);
    if UseWSDL then
    begin
      RIO.WSDLLocation := Addr;
      RIO.Service := defSvc;
      RIO.Port := defPrt;
    end else
      RIO.URL := Addr;
  finally
    if (Result = nil) and (HTTPRIO = nil) then
      RIO.Free;
  end;
end;


initialization
  InvRegistry.RegisterInterface(TypeInfo(IWSTest), 'urn:WSTestIntf-IWSTest', 'utf-8');
  InvRegistry.RegisterDefaultSOAPAction(TypeInfo(IWSTest), 'urn:WSTestIntf-IWSTest#test');

end.
...
Рейтинг: 0 / 0
Переменная в веб сервисе
    #39573379
fraks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну и что находится в 32 строке?

У тебя в объявлении функции упоминается stdcall; а в реализации нету. Так и должно быть?
...
Рейтинг: 0 / 0
Переменная в веб сервисе
    #39573392
roma1975
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в 32 строке:
Код: pascal
1.
Memo1.text:=GetIWSTest.test(s1);


реализация функции такая:
Код: pascal
1.
2.
3.
4.
5.
function TWSTest.test(out s_in: Widestring): widestring;
begin
s_in:='fg';
result:='webservices=99';
end;



вызов функции такой:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
 uses IWSTest1;
...

procedure TForm1.Button1Click(Sender: TObject);
var s,s1: string;
begin
s:=Edit1.Text;
  Memo1.text:=GetIWSTest.test(s1);
end;



Если убираю out или var перед s_in, то вызов функции работает, но как получить,
изменённое s_in?
...
Рейтинг: 0 / 0
Переменная в веб сервисе
    #39573399
fraks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот пример на D7, компилится и работает.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
program test_concole;

{$APPTYPE CONSOLE}

uses
  SysUtils;

var
  param: string;
  res  : string;

function test(var s: string):string;
begin
  Result := s + ' - out';
  s := s + ' - changed';
end;

begin
  WriteLn('Hello');
  param := 'start';
  WriteLn('param before = "' + param + '"');
  res   := test(param);
  WriteLn('param after  = "' + param + '"');
  WriteLn('res          = "' + res   + '"');
end.



Выдает вот это:
Код: plaintext
1.
2.
3.
4.
Hello
param before = "start"
param after  = "start - changed"
res          = "start - out"
...
Рейтинг: 0 / 0
Переменная в веб сервисе
    #39573404
roma1975
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вот теперь тоже самое попробуй в веб сервисе сделать.
...
Рейтинг: 0 / 0
Переменная в веб сервисе
    #39573408
Tactical Nuclear Penguin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
roma1975, какая версия Delphi?
...
Рейтинг: 0 / 0
Переменная в веб сервисе
    #39573416
fraks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
roma1975в 32 строке:
реализация функции такая:
Код: pascal
1.
function TWSTest.test(out s_in: Widestring): widestring;



вызов функции такой:
Код: pascal
1.
2.
3.
4.
procedure TForm1.Button1Click(Sender: TObject);
var s,s1: string;
...
  Memo1.text:=GetIWSTest.test(s1);




У тебя s1 которую ты толкаешь в параметр объявлена как string а параметр в процедуре как widestring;
При просто передаче праметров видимо работает неявное приведение или преобразование типов, но при передаче данных обратно типы видимо должны полностью совпадать. Объяви типы одинаково - должно заработать. Если еще где-нибудь ошибки нет :)

В моем тестовом примере если передаваемый параметр не совпадает по типу с параметром в процедуре - то возникает аналогичная ошибка

Код: plaintext
1.
[Error] test_concole.dpr(22): Types of actual and formal var parameters must be identical
...
Рейтинг: 0 / 0
Переменная в веб сервисе
    #39573418
fraks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
roma1975А вот теперь тоже самое попробуй в веб сервисе сделать.

Лучше ты попробуй упростить ситуацию до показанного работающего примера и потом постепенно дорастить его до своего веб сервиса.
Кто у нас тут задачу решает?
...
Рейтинг: 0 / 0
Переменная в веб сервисе
    #39573448
roma1975
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да спасибо. Получилось. Да тип переменной s1 нужно было объявить как widestring.
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Переменная в веб сервисе
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]