Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi COM Typenbibliothek - dispinterface und Records (https://www.delphipraxis.net/100737-com-typenbibliothek-dispinterface-und-records.html)

jensw_2000 3. Okt 2007 02:13


COM Typenbibliothek - dispinterface und Records
 
Ich habe eine ActiveX Bibliothek mit einem Automatisierungs-Objekt angelegt.
In der Typenbibliothek habe ich unter Anderem einige Enum-Typen und einige Records deklariert.

Die Records werden in der _TLB in den "dispinterface Deklarationen" nicht erkannt, und durch OleVariant ersetzt.
Bei den IDiapatch Deklarationen klappt das mit den Records.

Im Typenbibliotheks-Editor sieht noch alles richtig aus ...
Delphi-Quellcode:
IPDDAPIaxEvents = dispinterface
  [ uuid '{12345678-A8C6-44CE-BFF9-F5257644C83D}',
    version 1.0,
    helpstring 'Ereignis-Schnittstelle für PDDAPIax-Objekt' ]
  procedure OnErrorInfo(var aErrorInfo: TRecErrorInfo) [dispid $000000CE]; stdcall;
end;
... in der _TLB steht die Deklaration nachher falsch drin ...
Delphi-Quellcode:
procedure OnErrorInfo(var aErrorInfo: {??TRecErrorInfo}OleVariant); dispid 206;

TRecErrorInfo enthält einen Enum.Typen, einen Integer und einen WideString
Delphi-Quellcode:
TErrorSource = (
  [ uuid '{12345678-9482-4133-8FF8-3442B2D34AE2}',
    version 1.0 ]
  esApplication = 1;
  esPDDAPI = 2;
  esNetwork = 3;
  esServer = 4;
);

TRecErrorInfo = record
  [ uuid '{12345678-DE0C-48AA-94FE-2855D7D9942B}',
    version 1.0 ]
  ErrorSource: TErrorSource;
  ErrorID: Integer;
  ErrorText: WideString;
end;
Wie übergebe ich Records an ein EventObjekt bzw. an das dispinterface ?
Kann mit jemand stichpunktartig die Hintergründe erläutern ?

Danke,
schönen Feiertag,
Jens
:hi:

marabu 3. Okt 2007 06:38

Re: COM Typenbibliothek - dispinterface und Records
 
Moin Jens,

weil du nur mit OLE-kompatiblen Typen arbeiten darfst, musst du deinen Record auf einen unterstützten Typ abbilden. Aus dem Record wird dann ein VarArray und die einzelnen Felder werden zu varByte, varInteger und VarOleStr.

OLE soll nach dem Willen der Designer plattform-unabhängig sein, weshalb der einzige strukturierte Typ ein Array sein darf. Das funktioniert ganz gut, wenn du die Schnittstelle selbst entwirfst. Musst du mit einer fremden Schnittstelle arbeiten, dann hilft manchmal nur noch die Holzhammermethode.

In deinem Fall würde ich statt des Records eine dedizierte Schnittstelle entwerfen, deren Eigenschaften den Feldern deines Records entsprechen.

Freundliche Grüße

jensw_2000 3. Okt 2007 09:16

Re: COM Typenbibliothek - dispinterface und Records
 
Zitat:

Zitat von marabu
Moin Jens,

.... musst du deinen Record auf einen unterstützten Typ abbilden. Aus dem Record wird dann ein VarArray und die einzelnen Felder werden zu varByte, varInteger und VarOleStr.

Wie mache ich das ?

Im Typenbilbiothekseditor kann ich nur Records, Unions und Enumerationen anlegen.
Enumerationen werden automatisch zu TOleEnum.
Die Auswahl der Feldtypen für Records und Unions sind sehr beschränkt. varByte, varInteger und VarOleStr sind leider nicht darunter.
Ich möchte eigentlich erreichen, das alle Methoden nur einen "Record" als Parameter verwenden. Da dieser später problemlos um weitere Felder ergänzt werden kann.



Schöne Grüße,
Jens
:hi:

Elvis 3. Okt 2007 09:27

Re: COM Typenbibliothek - dispinterface und Records
 
Zitat:

Zitat von jensw_2000
Wie mache ich das ?
Im Typenbilbiothekseditor kann ich nur Records, Unions und Enumerationen anlegen.

Du kannst ein Interface anlegen, diesem Methoden und Eigenschaften verpassen und dann eine CoClass anlegen, die dieses Interface implementiert.
Der TLB Editor wird dann autom. der CoClass alles geben was sie braucht um dein Interface implementieren zu können.


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:44 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