AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Ole Automation? Variants? Was ist das?
Thema durchsuchen
Ansicht
Themen-Optionen

Ole Automation? Variants? Was ist das?

Ein Thema von Aphton · begonnen am 24. Dez 2013 · letzter Beitrag vom 24. Dez 2013
Antwort Antwort
Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#1

Ole Automation? Variants? Was ist das?

  Alt 24. Dez 2013, 11:14
Guten Tag,
Ich habe neuerdings Ole-Objekte "verwendet" ohne das ich im geringsten eine Ahnung habe, was ich da wirklich gemacht habe (im Grunde habe ich da einfach vorgefertigten, alten Code angepasst und wieder funktionsfähig gemacht).

Ich habe bereits ein bisschen recherchiert und Sachen wie Ole-Automation (Beispiele mit Word Dokumenten) gefunden. Jedoch sind die Artikel/Tutorials dazu nicht wirklich aufklärend.

Was ich bisher so aus eigener Interpretation verstanden habe..:
1. man kann am System (OS) Objekte (Klassen/Funktionen?) registrieren
2. Anwendungen können über CreateOleObject (mehr?) diese Objekte&/Methoden importieren und verwenden

Meine Fragen nun dazu:
- wie funktioniert 1, wie bewerkstellige ich das selber?
- wo schlage ich für 2. nach um rauszufinden, was so alles ein Objekt drauf hat (Methoden? CLSID?)

Ich stell mir das momentan so ähnlich wie das Verwenden von Win-API Funktionen vor. Gibt es für OLE Objekte, die z.B. vom BS bereitgestellt werden, eine Doku/Spezifikation usw.?

Ich wünsche euch frohe Weihnachten und vorzeitig einen guten Rutsch ins neue Jahr.
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG

Geändert von Aphton (24. Dez 2013 um 13:37 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.171 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Ole Automation? Variants? Was ist das?

  Alt 24. Dez 2013, 13:01
- wie funktioniert 1, wie bewerkstellige ich das selber?
Die nötigen Infos werden in die Registry geschrieben
Selbst kannst du das machen indem du bei Delphi die entsprechenden Wizards über "Neu" bemühst.

- wo schlage ich für 2. nach um rauszufinden, was so alles ein Objekt drauf hat (Methoden? CLSID?)
In der sogenannten Typbibliothek steht beschrieben welche Methoden und Interfaces es gibt.
Microsoft stellt mit OleView ein Tool bereit mit der man die registrieten Anwendungen durchsuchen kann.
Aber jeder Hersteller sollte normalerweise eine Schnittstellenbeschreibung liefern.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.168 Beiträge
 
Delphi 12 Athens
 
#3

AW: Ole Automation? Variants? Was ist das?

  Alt 24. Dez 2013, 13:04
Wo ist die Frage zu den Variants?

Delphi-Referenz durchsuchenVariant ist ein Typ, wie z.B. Integer, allerdings kann der mehrere verschiedene Werte enthalten, also man kann da Strings, Integer, Interfaces, Arrays usw. dort reipacken.



Selbst genutzt hab ich das noch nicht, aber es gibt bestimmt Tutorials dafür.
Im Prinzip erstellt man ein Interface, welches, bzw. dessen DLL bei Windows registriert wird.
Und das dann von anderen Programmen abgefragt werden kann.
z.B. die Interfaces des MS-XML-DOM (IXMLDocument usw.)

https://www.google.de/search?q=windows+dll+registrieren
über Bei Google suchenDelphi DLL erstellen Regsvr32 oder sonstwie, sollten sich Tutorials finden lassen
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#4

AW: Ole Automation? Variants? Was ist das?

  Alt 24. Dez 2013, 13:37
Danke.

Zu Variants - meistens wird das in Verbindung mit Ole Objekten verwendet; ich wusste z.B. nicht, dass Variants wie Klasseninstanzen behandelt und beliebige (Ole) Methoden darüber aufgerufen werden können.

Ich werde weiter recherchieren, bis ich eine kleine Demo dazu schreibe, und ab und zu hier nachkucken, sofern etwas neues hinzukommt.
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.168 Beiträge
 
Delphi 12 Athens
 
#5

AW: Ole Automation? Variants? Was ist das?

  Alt 24. Dez 2013, 14:11
In Delphi wird der Vaiant mehr wie ein Record verwaltet.

Du kannst das mit den Record Operatoren vergleichen, wo in dem Variant schon automatische Konvertierungen integriert sind.
Aber eigentlich ist das ein Windows-Typ, ähnlich dem WideString, welcher im Delphi entsprechend weggekapselt ist.

Delphi-Quellcode:
var
  X: Variant;

X := 123;
ShowMessage(IntToStr(X));
ShowMessage(X);

X := 'abc';
ShowMessage(X);

X := '789';
ShowMessage(X);
ShowMessage(IntToStr(X + 210));
Die Unit Variants wäre noch interessant, wo viele Funktionen drin sind, um die Typen manuell umzuwandeln oder um zu prüfen welcher Typ grade im Variant steckt.
Und falls man selber den Variant erweitern will, dann könnte man beim TVariantManager weiter suchen.

Bissl was zum Aufbau, falls dich das interessiert (system.pas):
Delphi-Quellcode:
  varEmpty = $0000; { vt_empty        0 }
  varNull = $0001; { vt_null         1 }
  varSmallint = $0002; { vt_i2           2 }
  varInteger = $0003; { vt_i4           3 }
  varSingle = $0004; { vt_r4           4 }
  varDouble = $0005; { vt_r8           5 }
  varCurrency = $0006; { vt_cy           6 }
  varDate = $0007; { vt_date         7 }
  varOleStr = $0008; { vt_bstr         8 }
  varDispatch = $0009; { vt_dispatch     9 }
  varError = $000A; { vt_error       10 }
  varBoolean = $000B; { vt_bool        11 }
  varVariant = $000C; { vt_variant     12 }
  varUnknown = $000D; { vt_unknown     13 }
//varDecimal = $000E; { vt_decimal 14 } {UNSUPPORTED as of v6.x code base}
//varUndef0F = $000F; { undefined 15 } {UNSUPPORTED per Microsoft}
  varShortInt = $0010; { vt_i1          16 }
  varByte = $0011; { vt_ui1         17 }
  varWord = $0012; { vt_ui2         18 }
  varLongWord = $0013; { vt_ui4         19 }
  varInt64 = $0014; { vt_i8          20 }
  varUInt64 = $0015; { vt_ui8         21 }
  varRecord = $0024; { VT_RECORD      36 }
{  if adding new items, update Variants' varLast, BaseTypeMap and OpTypeMap }

  varStrArg = $0048; { vt_clsid        72 }
  varObject = $0049; {                 73 }
  varUStrArg = $004A; {                 74 }
  varString = $0100; { Pascal string  256 } {not OLE compatible }
  varAny = $0101; { Corba any      257 } {not OLE compatible }
  varUString = $0102; { Unicode string 258 } {not OLE compatible }
  // custom types range from $110 (272) to $7FF (2047)

  varTypeMask = $0FFF;
  varArray = $2000;
  varByRef = $4000;

  TVarData = packed record
    case Integer of
      0: (VType: TVarType;
          case Integer of
            0: (Reserved1: Word;
                case Integer of
                  0: (Reserved2, Reserved3: Word;
                      case Integer of
                        varSmallInt: (VSmallInt: SmallInt);
                        varInteger: (VInteger: Integer);
                        varSingle: (VSingle: Single);
                        varDouble: (VDouble: Double);
                        varCurrency: (VCurrency: Currency);
                        varDate: (VDate: TDateTime);
                        varOleStr: (VOleStr: PWideChar);
                        varDispatch: (VDispatch: Pointer);
                        varError: (VError: HRESULT);
                        varBoolean: (VBoolean: WordBool);
                        varUnknown: (VUnknown: Pointer);
                        varShortInt: (VShortInt: ShortInt);
                        varByte: (VByte: Byte);
                        varWord: (VWord: Word);
                        varLongWord: (VLongWord: LongWord);
                        varInt64: (VInt64: Int64);
                        varUInt64: (VUInt64: UInt64);
                        varString: (VString: Pointer);
                        varAny: (VAny: Pointer);
                        varArray: (VArray: PVarArray);
                        varByRef: (VPointer: Pointer);
                        varUString: (VUString: Pointer);
                        varRecord: (VRecord: TVarRecord);
                        //$ffff: (VLargest: TLargestVarData);
                     );
                  1: (VLongs: array[0..{$IFDEF CPUX64}4{$ELSE}2{$ENDIF}] of LongInt);
               );
            2: (VWords: array [0..{$IFDEF CPUX64}10{$ELSE}6{$ENDIF}] of Word);
            3: (VBytes: array [0..{$IFDEF CPUX64}21{$ELSE}13{$ENDIF}] of Byte);
          );
      1: (RawData: array [0..{$IFDEF CPUX64}5{$ELSE}3{$ENDIF}] of LongInt);
  end;
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (24. Dez 2013 um 14:21 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.024 Beiträge
 
Delphi 12 Athens
 
#6

AW: Ole Automation? Variants? Was ist das?

  Alt 24. Dez 2013, 14:14
Zu Variants - meistens wird das in Verbindung mit Ole Objekten verwendet; ich wusste z.B. nicht, dass Variants wie Klasseninstanzen behandelt und beliebige (Ole) Methoden darüber aufgerufen werden können.
Das ist nur bedingt richtig. Ein Variant kann verschiedene Datentypen enthalten. Integer, Double, Boolean usw. aber unter anderem auch Objekte und Interfaces. Wenn ein OLE-Interface (genauer ein IDispatch) in einem Variant gespeichert ist, dann kann ich auf die Interface-Methoden einfach durch die Punkt-Notation zugreifen. Allerdings wird dabei erst zur Laufzeit geprüft, ob die entsprechende Methode auch tatsächlich existiert.

Der folgende Code wird also vom Compiler durchgelassen, führt aber zu einem Laufzeitfehler:

Delphi-Quellcode:
var
  V: Variant;
begin
  V := 1;
  V.Hurz;
end;
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#7

AW: Ole Automation? Variants? Was ist das?

  Alt 24. Dez 2013, 14:24
Das ist alles echt aufklärend! Danke soweit.

Wie kommts, dass ich soetwas praktische nie gebraucht habe xD
Man lernt nie aus.

Ich macht dann mal weiter mit dem Einlesen (regsvr, clsids)..
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG
  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 16:25 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