Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Com Objekt arrays als Übergabeparameter (https://www.delphipraxis.net/106896-com-objekt-arrays-als-uebergabeparameter.html)

Mr.borland 18. Jan 2008 12:09


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.

sirius 18. Jan 2008 13:05

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.

Mr.borland 18. Jan 2008 15:13

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:
// *********************************************************************//
// 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;
und kann dann in dem client Applikation wie folgt vorgehen:

Delphi-Quellcode:
   
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;
was mache ich falsch? gibt es vielleicht einen besseren(optimaleren) weg arrays zuübergeben?

danke für deine Hilfe

shmia 18. Jan 2008 16:05

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.

Mr.borland 21. Jan 2008 09:35

Re: Com Objekt arrays als Übergabeparameter
 
Zitat:

Hast du das Interface ISikoInterface selbst programmiert oder musst du es nur benutzen ?
habe das Interface selber programmiert. Mit der Variable Buffsize hast recht, es ist überflüssig geworden.
ü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.

sirius 21. Jan 2008 13:05

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.

Mr.borland 22. Jan 2008 20:33

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