Announcement

Collapse
No announcement yet.

Webservice Rückgabewerte

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Webservice Rückgabewerte

    Hallo,
    ich bastle grad an einem Webservice in D7.
    Ich habe eine Funktion die mir eine Liste an Informationen übermitteln muss.
    Zuerst wollte ich der Funktion eine Stringliste zurückgeben lassen, das hat aber beim Client nicht funktioniert.
    Dann hab ich mir gedacht, ich gebe ein Array of String zurück, funktioniert aber auch nicht so wie gepant.
    Hierfür habe ich den Typ "TUsers = array of String" deklariert. Aber leider bringt mir der Compiler die Meldung:

    [Fehler] ADImpl.pas(58): Inkompatible Typen: 'String' und 'TUsers'

    Code:
    type
    TUsers = array of String;
    
    function TAD.GetUsers(const Bindstring: string): TUsers; stdcall;
    var user: TStringList;
        i: integer;
        user_arr: array of TUsers;
    
    begin
      user := TStringList.Create;
      user.Assign(Webmodule1.AD1.GetUsers());
        
      SetLength(user_arr,user.Count);
      for i := 0 to user.Count - 1 do
          user_arr[i] := user.strings[i];
    
      Result := user_arr;
      user.Free;
    
    end;
    Ich steh gerade irgendwie auf dem Schlauch, kann mir jemand weiterhelfen? Bzw. hat jemand eine bessere/elegantere Lösung?
    Vielen Dank

  • #2
    Offenbar wird ein String zurückgegeben und kein Array
    Christian

    Comment


    • #3
      Code:
      TUsers = array of String;
      ...
      user_arr: array of TUsers;
      Ein Array von Arrays von string? Ist das Absicht?

      Code:
      function TAD.GetUsers(const Bindstring: string): TUsers; stdcall;
      ...
      Result := user_arr;
      Und hier versuchst du ein TUsers Array(user_arr) einem TUsers(Result) zuzuweisen.

      Comment


      • #4
        Ja das war mein Fehler:
        Code:
        user_arr: array of TUsers
        Musste natürlich so heißen
        Code:
        user_arr: TUsers;
        Vielen Dank für den Hinweis.

        Leider habe ich noch ein weiteres Problem. Wenn ich jetzt meinen Webservice von meinem Client aus aufrufe, bekomme ich immer ne Zugriffsverletzung.

        Der Client-Code ist recht simpel:

        Code:
        procedure TForm1.Button2Click(Sender: TObject);
        var ws: IADService;
            arr: TUsers;
        begin   
          ws := GetIADService(true);
          arr := ws.GetUsers('xx..xxxxxxxxxxxxxxxxx.xx');
        
        end;
        Wie man sieht ruft mein Client die Funktion GetUsers() auf, jedoch funktioniert es nicht.
        Hat jemand ne Idee?

        Comment


        • #5
          Ich hab jetzt rausgefunden, warum ich eine Zugriffsverletzung bekommen habe.

          Es liegt an der fett-dargestellten Zeile in meiner Methode auf dem Server:

          Code:
          function TADService.GetUsers(const Bind: string): TUsers; stdcall;
          var user: TStringList;
              i: integer;
              user_arr: TUsers;
          begin
          
            user := TStringList.Create;
            Webmodule1.AD.BindString := Bind;
            user.Assign(Webmodule1.AD.GetUsers());
            SetLength(user_arr,user.Count);
          
            for i := 0 to user.Count - 1 do
               user_arr[i] := user.strings[i];
          
            Result := user_arr;
          
          end;
          Zur Info:
          Ich weise in der markierten Zeile meiner Komponente AD mit der Property Bindstring einen neuen String namens Bind zu, und sobald ich das mache, kommt die Zugriffsverletzung. An meiner Komponente liegt es nicht, da es ja nur ein String ist indem geschrieben wird. Es muss also irgendwie daran scheitern, dass ich in die Propertys der Komponente im Webmodule nicht schreiben kann.
          Hatte jemand schon mal so ein Problem?

          Comment

          Working...
          X