Autor Beitrag
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Di 07.10.08 19:14 
Hi

Ich muss ein COM-Objekt verwenden, das in Delphi geschrieben ist. Die Übergabe der Parameter erfolgt als OleVariants.

Frage: wie komme ich elegant an den Inhalt heran?

Delphi-Seite:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
Procedure TMyCOMObject.SomeProcedure (Data : OleVariant; Var Value : OleVariant);
Var
  s : String;

Begin
  s := Data; // Data ist also ein String  
 ...
End;


C# Seite:
ausblenden C#-Quelltext
1:
2:
3:
object value;
string data = "Test";
MyCOMObeject.SomeProcedure ((object)data, out value);

Da C# so schön elegant ist und für alles eine Lösung hat, muss es das doch auch für die OleVariants geben, aber Google spuckt einfach nichts aus.

In meinem konkreten Beispiel ist 'Value' auf Delphi-Seite übrigens ein 'Variant Array' mit Bytes.

_________________
Na denn, dann. Bis dann, denn.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19274
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 11.10.08 10:44 
Ich habe jetzt kein Com-Objekt zum Testen, aber kompilieren lässt sich das hier. Ich bin in C# nicht besonders bewandert, aber so würde ich vermuten, dass es richtig ist ;-):
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
    static void SomeProcedure(object Data1, object Data2)
    {

    }

    static void Main()
    {
      object tmp = new byte[]{111};
      object str = "asdasd";
      SomeProcedure(tmp, str);
    }
alzaimar Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Sa 11.10.08 13:33 
Hi,

das geht Alles. Auch eine Instantiierung in C# ist nicht notwendig. Ich bekomme die Daten auch als Byte-Array zurück. Nur muss ich per Hand die ersten 27 bytes rausschnippeln, um an die echten Daten heranzukommen. Es handelt sich auf der Delphi-Seite um ein Variant: Array of Byte, sodaß ich mal annehme, die 27 Bytes vorne sind neben der 'TVarData'-Information noch die Dimensionen des Arrays.

Da es sich bei OleVariants jedoch um einen Windows-Datentyp handelt, denke ich, das es irgendwo in den Tiefen der Dot.Net-Matrix eine einfache Klasse gibt, die damit umgehen kann, um mir Typinformation etc. zu liefern.

_________________
Na denn, dann. Bis dann, denn.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19274
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 11.10.08 17:25 
Wenn du annimmst, dass die .NET CLR selbst OleVariant unterstützt so irrst du glaube ich. Wie das da genau aussieht muss ich mir mal anschauen, ich habe noch fast nichts mit C# wirklich gemacht ;-).

// EDIT:
www.delphi-treff.de/...-fuer-win32-und-net/ hat folgendes geschrieben:
Varianten: Implementiert mit Class Helpers. Sie können alle Methoden, die wir von Varianten erwarten, auf jedes Objekt anwenden. Variants haben in der CLR keine Implementierung - es ist alles Compiler-Magic. Delphi Variants werden in C# als System.Object angezeigt. OLEVariant wird ebenfalls unterstützt - das war besonders schmerzhaft [zu implementieren].
alzaimar Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: So 12.10.08 13:49 
Hallo Sebastian,
der Artikel ist interessant, bezieht sich aber auf die Implementierung von Delphi.NET.

Aber anscheinend gibt es keine .NET-Unterstützung für OleVariants, was ziemlich merkwürdig ist, das COM unterstützt wird. Nun denn, schreibe ich mir halt selber etwas. so schwer ist das ja nun nicht.

_________________
Na denn, dann. Bis dann, denn.