Eine Zeichenkette über COM übertragen, die länger als ein bstr ist
-
Hi zusammen,
bin noch relativ neu in der COM-Programmierung und hab ein kleines Problem:
ich will über eine COM-Schnittstelle einen String übermitteln der auch 2MB groß sein kann. Bisher hab ich einfach einen bstr verwendet, aber bin schnell an dessen Grenzen von max. 64KB länge gestossen.
Kann mir jemmand einen Tipp geben, wie ich das am besten machen kann?
Vielleicht einen Array von bstr? Und wie?Bisher sieht meine IDL so aus:
[id(1)] HRESULT test([in] BSTR eingabe, [out, retval] BSTR *ausgabe);
Ich hoffe das ist das richtige Forum dafür...
-
Warum überträgst du die Daten dann nicht in 64KB Stücken?
-
Wie soll ich das machen? Jedes mal die Funktion neu aufrufen und das nächste 64KB-Häppchen holen? Das scheint mir komplizierter als irgendwie ein dynamisches Array anzulegen, das einmal übertragen wird.
-
Wie wärs mit Streams?
Schau dir mal CreateStreamOnHGlobal an.
-
Kann man noch etwas mehr über Dein Vorhaben erfahren? Mir scheinen Strings von >= 2MB irgendwie recht ungeschickt ...
MFK schrieb:
Wie wärs mit Streams?
Kommt auf sein Vorhaben an. Generell kann man aber sagen, daß Streams turbolangsam sind, gerade wenn es über Processgrenzen hinaus geht. Gar nicht auszudenken, wenn der Stream durchs Netz wandert. Dann schon lieber ein Byte-Array. Das verträgt sich dann auch, im Gegensatz zu Streams, mit OLE-Automation.
Benötigt denn die aufgerufene Methode tatsächlich alle Informationen aus dem String? So kannst Du die Informationen auch in einer Collection halten. Der Callee holt sich dann daraus, was er benötigt. Und zwar nur das, was auch tatsächlich benötigt wird. Ok, das Schnellste ist dieses Verfahren auch nicht. Aber IMO immer noch besser als Streams.
-
Hmm, vielleicht hab ich das auch falsch angepackt.
Folgende Situation:Client ruft die Funktion auf und der Server erstellt eine Datei.
Diese Datei soll dann zurück übermittelt werden.
Dabei soll der Client sehr wohl auch über's Netzwerk diese zugeschickt bekommen.Aus Deiner Antwort entnemme ich aber, dass das keine so gute Idee ist
Kannst Du oder sonst wer mir bitte einen Tipp geben, wie ich das sonst machen soll?Danke aber schonmal für eure Antworten, echt super hier
-
Verwende ein Byte-Array (Stichwort: SafeArrayCreateVector).
Sind die Daten denn wenigstens ReadOnly? Oder holst Du Dir erst die 2MB vom Server, änderst 3-4 Byte und schickst die vollen 2MB zurück an den Server? Und wenn Du dann noch ein Byte zu ändern vergessen hast, gehen die 2MB erneut auf die Reise?
-
Ähh, wie mach ich das Read-Only? Wie schon oben geschrieben, wird die Datei auf
dem Server erstellt und dann an den Client geschickt. Diese wird aus einer
Datenbank generiert.Hmm... grübel... überleg...
Ist es vielleicht einfacher, wenn ich die Datei auf'em Server erstelle und
dann vom Client über irgendeine Freigabe die Datei runterladen lassen kann?Das ist dann aber wieder ein C++ und keine WinAPI Problem, oder?
-
Warum kann der Server nicht die Daten aus der Datenbank an den Client schicken und der Client generiert die Datei? Oder kommt das im Endeffekt auf das selbe raus von der Größe?
-
Der Server muss das machen, da er die ganze Logik enthalten und die
Clients nur so ne Art Oberfläche sein sollen.Somit soll's möglich sein von nem PHP-Webserver oder von nem MFC-Programm
gleichermassen darauf zuzugreifen.