AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Com Objekt arrays als Übergabeparameter

Ein Thema von Mr.borland · begonnen am 18. Jan 2008 · letzter Beitrag vom 22. Jan 2008
Antwort Antwort
Mr.borland

Registriert seit: 16. Mai 2007
Ort: Plüderhausen
34 Beiträge
 
#1

Com Objekt arrays als Übergabeparameter

  Alt 18. Jan 2008, 11:09
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.
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: Com Objekt arrays als Übergabeparameter

  Alt 18. Jan 2008, 12:05
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.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Mr.borland

Registriert seit: 16. Mai 2007
Ort: Plüderhausen
34 Beiträge
 
#3

Re: Com Objekt arrays als Übergabeparameter

  Alt 18. Jan 2008, 14:13
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
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#4

Re: Com Objekt arrays als Übergabeparameter

  Alt 18. Jan 2008, 15:05
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.
Andreas
  Mit Zitat antworten Zitat
Mr.borland

Registriert seit: 16. Mai 2007
Ort: Plüderhausen
34 Beiträge
 
#5

Re: Com Objekt arrays als Übergabeparameter

  Alt 21. Jan 2008, 08:35
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.
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: Com Objekt arrays als Übergabeparameter

  Alt 21. Jan 2008, 12:05
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.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Mr.borland

Registriert seit: 16. Mai 2007
Ort: Plüderhausen
34 Beiträge
 
#7

Re: Com Objekt arrays als Übergabeparameter

  Alt 22. Jan 2008, 19:33
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.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:17 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz