![]() |
Webservice: String als null übergeben?
Ich habe einen Webservice, den ich mittels Delphi 6 ansprechen will (
![]() Die erste Hürde ist genommen, da erscheint sofort die zweite: Ich habe folgende aus dem WSDL generierte Methode:
Delphi-Quellcode:
Nun unterstützt der Report Server keine Historie der Reports. Ich darf also keine HistoryID übergeben. Ein Leerstring wird aber nicht als 'nichts' erkannt. Ich muss hier also 'null' bzw. 'nil' übergeben. Nur geht das hier ja nicht. Was nu?
function GetReportParameters(const Report: String; const HistoryID: String; const ForRendering: Boolean; const Values: ArrayOfParameterValue; const Credentials: ArrayOfDataSourceCredentials): ArrayOfReportParameter; stdcall;
|
Re: Webservice: String als null übergeben?
Nuja, PChar's währen hier an Stelle von Strings angebracht.
|
Re: Webservice: String als null übergeben?
Delphi-Quellcode:
geht auch nicht.
PChar(nil)
|
Re: Webservice: String als null übergeben?
Nur nil ohne Cast.
|
Re: Webservice: String als null übergeben?
Vorweg: Ich habe keinerlei Ahnung von WSDL und dem Import in Delphi. Aber: Wenn du in Delphi einer lokalen Variable oder einem Parameter einen Leerstring übergibst, wird intern nil übergeben. Das Äquivalent zum C-String #0 existiert in Delphi also nicht direkt. Insofern gibt es vermutlich keine Möglichkeit, an dem Delphi-Wrapper (ich hoffe mal, ich erzähle hier keinen Unsinn) ein nil vorbeizuschleusen, da dieser nil automatisch in einen Leerstring übersetzt.
|
Re: Webservice: String als null übergeben?
Zitat:
|
Re: Webservice: String als null übergeben?
Zitat:
|
Re: Webservice: String als null übergeben?
Ich habe ein WSDL. Das gibt an der Stelle nunmal String vor. Der WSDL-Importer erzeugt auch eine Unit, die hier String erwartet. Ich kann doch nicht einfach hergehen und das dort in PChar umwandeln? Dann bin ich doch nicht mehr mit dem WSDL konform?
|
Re: Webservice: String als null übergeben?
Zitat:
|
Re: Webservice: String als null übergeben?
Dann habe ich auch keine Idee, ein String kann nunmal nicht nil sein.
|
Re: Webservice: String als null übergeben?
Zitat:
|
Re: Webservice: String als null übergeben?
Es geht ja um String und nicht um Variant.
|
Re: Webservice: String als null übergeben?
Zitat:
|
Re: Webservice: String als null übergeben?
Zitat:
P.S.: gilt auch fuer Deddy ;-) |
Re: Webservice: String als null übergeben?
In C heißt es NULL (in Deiner Lieblingssprache Java btw. auch ;))
|
Re: Webservice: String als null übergeben?
Zitat:
|
Re: Webservice: String als null übergeben?
Kann möglich sein, ich hab seit 4 Jahren keine Zeile C mehr geschrieben. Leider löst das alles aber das Kernproblem auch nicht :mrgreen:
|
Re: Webservice: String als null übergeben?
Zitat:
P.S.: gehe nun mal zu Bett..Tag war lang..Morgen mal weiter lese hier..mal sehen..was passiert *g* |
Re: Webservice: String als null übergeben?
Zitat:
Weiterhin überrascht es mich, weil bei der Entwicklung einer DLL mit String in den Exports da ja so ein rumgezicke mit dem SharedMem ist. Ich glaub ich würde da tatsächlich mal aus jedem String ein PChar machen :mrgreen: und schauen was passiert. cu Oliver |
Re: Webservice: String als null übergeben?
DLL != WebService
|
Re: Webservice: String als null übergeben?
Ok, dann mal die C -> Delphi Experten, so geht das in C# (siehe
![]()
Code:
using System;
using System.Web.Services.Protocols; class Sample { public static void Main() { ReportingService2005 rs = new ReportingService2005(); rs.Credentials = System.Net.CredentialCache.DefaultCredentials; string report = "/SampleReports/Employee Sales Summary"; bool forRendering = false; string historyID = null; ParameterValue[] values = null; DataSourceCredentials[] credentials = null; ReportParameter[] parameters = null; try { parameters = rs.GetReportParameters(report, historyID, forRendering, values, credentials); if (parameters != null) { foreach (ReportParameter rp in parameters) { Console.WriteLine("Name: {0}", rp.Name); } } } catch (SoapException e) { Console.WriteLine(e.Detail.InnerXml.ToString()); } } } |
Re: Webservice: String als null übergeben?
C#.string != Delphi.string
Phoenix, vergleiche doch mal das SOAP von D2009 mit dem SOAP von D6. Wie wird ein 'NULL' String im D2009-SOAP dargestellt? |
Re: Webservice: String als null übergeben?
Zitat:
In VisualBasic wird bei HistoryID in diesem speziellen Fall Nothing übergeben. In C# wird NULL übergeben. Da ich in Delphi aber über einen Delphi-String keinen dieser Werte als Äquivalent übergeben kann (nil oder Variant-NULL) kann eigentlich nur noch die Deklaration so nicht stimmen. |
Re: Webservice: String als null übergeben?
Was passiert, wenn du einfach #0 übergibst?
|
Re: Webservice: String als null übergeben?
Egal, ob ich #0 oder auch einen Leerstring übergebe: Der Webservice ist der Meinung, ich hätte eine HistoryID übergeben und schmeisst eine Exception, dass die Snapshots nicht aktiviert seien.
Das stdcall hat übrigens gar nichts mit einer dll zu tun. Ich weiss nicht genau, warum das ein stdcall sein muss, es wird halt genau so generiert. Den Datentyp in der generierten Unit kann ich auch nicht auf PChar ändern, denn dann schmeisst mir der Compiler einen Fehler, dass der Typ PChar für diesen Aufruf nicht definiert sei. Das heisst also, ich kann keine Typen verwenden, die nicht im WSDL definiert werden. Allerdings habe ich eine Lösung gefunden, wenn auch eine extrem unsaubere: Ich habe den Aufruf in dem Remoting-Objekt mit overload gekennzeichnet, und einen gleichlautenden Aufruf deklariert, der diesen einen Parameter nicht hat. Im Code überprüfe ich nun, ob die HistoryId EmptyStr ist, und wenn ja, rufe ich die Methode ohne den Parameter auf und wenn ich einen Wert habe halt die mit dem Parameter. Ist der Parameter nicht im Methodenaufruf, wird der Wert im Soap-Envelope gar nicht mitgeschickt und vom Webservice als nicht angegeben -> null interpretiert. Das Problem ist also gelöst (wenn auch durch einen Hack). Morgen früh werde ich wohl mit dem nächsten Problem kommen ;-) |
Re: Webservice: String als null übergeben?
Zitat:
![]() Man darf auch mehr als eine Stimme abgeben :wink: Mehr Infos gibt es auch unter ![]() |
Re: Webservice: String als null übergeben?
Zitat:
|
Re: Webservice: String als null übergeben?
Aus diesem Grund verwies ich auf PChars. Das stdcall kennzeichnet für mich einen externen Aufruf zB. aus einer DLL.
Strings machen da nun mal Probleme. Du müsstest im String[0] die Stringlänge auf "0" setzen das könnte dann klappen wenn es Delphi zu liesse. |
AW: Webservice: String als null übergeben?
Falls jemand noch eine Lösung sucht:
der Experte für den WSDL-Import ![]() hat diese beiden relevanten Optionen: Optionale und nillable Elemente verarbeiten - Aktivieren Sie diese Option, damit das WSDL-Importprogramm relevante Informationen über optionale und nillable Eigenschaften erzeugt. Die SOAP-Laufzeit verwendet diese Informationen, um zu ermöglichen, dass bestimmte Eigenschaften nil sind. TXSString für einfache nillable Typen verwenden - Der WSDL-Standard lässt zu, dass einfache Typen in Delphi nil bzw. in C++ NULL sind. Delphi und C++ lassen das nicht zu. Aktivieren Sie diese Option, damit das WSDL-Importprogramm diese Beschränkung umgeht, indem Instanzen von Wrapper-Klassen verwendet werden. Aus ![]() Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:20 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz