![]() |
Com Objekt arrays als Übergabeparameter
Hallo leute,
Ich programmiere zurzeit ein Com Interface. das klappt fast alles; jedoch habe ich ein problem mit dem Übergabeparameter. Nun kann man in einem Com Objekt arrays als Übergabeparameter definieren? wenn ja, wie geht das? danke für eure hilfe. |
Re: Com Objekt arrays als Übergabeparameter
Meines wissens über SafeArray. Da gibst von der WINAPI ein paar schicke Funktionen. Schau mal im SDK oder bei msdn.
Wenn ich micht recht entsinne, kannst du das Array auch in ein Variant oder besser OleVariant legen. Da macht Delphi automatisch ein SafeArray draus. |
Re: Com Objekt arrays als Übergabeparameter
ok, habe deinen rat befolgt habe auch eine Ansatz gemacht jedoch habe ich probleme:
die Funktion SikoGetScale soll als übergabe parameter ein array erhalten ...das heißt ich muss eine funktion im meinem Com-server integrieren das ungefähr so aussieht:
Delphi-Quellcode:
und kann dann in dem client Applikation wie folgt vorgehen:
// *********************************************************************//
// Interface: ISikoInterface // Flags: (256) OleAutomation // GUID: {C78E36A5-99CF-4C1F-939D-324920AE34F8} // *********************************************************************// ISikoInterface = interface(IUnknown) ['{C78E36A5-99CF-4C1F-939D-324920AE34F8}'] ... function SikoGetScale(gNumber: SYSINT; buffSize: SYSINT; var buffArray: OleVariant): SYSINT; stdcall; end;
Delphi-Quellcode:
was mache ich falsch? gibt es vielleicht einen besseren(optimaleren) weg arrays zuübergeben?procedure TMainWin.button1Click(Sender: TObject); var index : integer; buffSize: Integer; myArray : OleVariant; Siko : ISikoInterface; begin Siko := CoSikoInterface.Create; buffSize := 10000; myArray := VarArrayCreate([0..10000],varDouble); Siko.SikoGetScale(0, buffSize,myarray ); //<--- hier mache ich einen Fehler ??? warum??? for index:=0 to (buffSize-1) do zeichne myArray[index] end; danke für deine Hilfe |
Re: Com Objekt arrays als Übergabeparameter
Hast du das Interface ISikoInterface selbst programmiert oder musst du es nur benutzen ?
Wenn ich dein Beispiel anschaue, sieht alles OK aus. Der Parameter buffSize: SYSINT wäre übrigens überflüssig, da man die Grösse des Array aus buffArray ermitteln kann. |
Re: Com Objekt arrays als Übergabeparameter
Zitat:
ürsprunglich habe ich gedacht ich könnte einen Zeiger auf ein Array übergeben und mit BuffSize festhalten wieviele Werte in den BuffArray geschrieben wurden. Aber Zeiger geht ja mal gar nicht in Com-objekten. Muss auch sagen das die OleVariants eine einefache Lösung/Alternative darstellen. ... habe mal folgende Abhilfe für mein Problem gefunden, allerdings weis ich nicht genau warum. mit der Funktion VarArrayRef(..) kann man anscheinend eine Referenz "zeiger" erzeugen... warum auch immer es funktioniert.
Delphi-Quellcode:
myArray := VarArrayCreate([0..10000],varDouble);
Siko.SikoGetScale(0, buffSize,VarArrayRef(myarray) ); // und hier ist die Abhilfe zu dem Problems danke noch mal für eure hilfe. |
Re: Com Objekt arrays als Übergabeparameter
Das ist das oben genannte SafeArray. In Delphi heißt es eben VarArray. Ich wusste auch nicht mehr, dass Delphi für die Kapselung des SafeArray einzelne Funktionen anbietet.
Das SafeArray selbst wird von Windows verwaltet. Da wird der Zugriff synchronisiert (bwz. ggf. gesperrt). Ausserdem liegt der Speicherplatz außerhalb deines Speichermanagers nämlich direkt in der Hand von Windows. Deswegen kannst du ein SafeArray auch problemlos übergeben. Und wie gesagt, dasselbe passiert bei Varianten (deswegen heißt es wahrscheinlich auch VarArray). Da erstellt Delphi auch ein SafeArray, wahrscheinlich auf dieselbe Art wie du und legt dann den Zeiger in das Variant. Deswegen sagte ich ja auch: nimm SafeArray oder eben Variant, da ist die Implementierung einfacher. |
Re: Com Objekt arrays als Übergabeparameter
danke sirius für den tip.
Es funktioniert wunderbar. habe mir jetzt auch noch das buch "com/Dcom/ com+ mit delphi" von Adreas Kosch zugelegt. er widmet dieser problematik ein kapitel. danke für eure hilfe. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:59 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 by Thomas Breitkreuz