Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi COM + (un)typisierte Zeiger (https://www.delphipraxis.net/107799-com-un-typisierte-zeiger.html)

Dezipaitor 2. Feb 2008 11:47


COM + (un)typisierte Zeiger
 
hi

ist es möglich mit COM-Objekte typisierte Zeiger zu verwenden? Wenn ja, wie geht das (auch mit type lib (TLB)) ? Geht das in der Steigerung auch mit untypisierten Zeigern (+ Größenangabe)?

Ist es überhaupt möglich WinAPI Handles (sind alle Prozessbezogen, können aber mit DuplicateHandle übertragen werden!) zu verwenden?

thx

Dezipaitor 3. Feb 2008 14:04

Re: COM + (un)typisierte Zeiger
 
24h sind um, daher

** ping **

marabu 3. Feb 2008 14:18

Re: COM + (un)typisierte Zeiger
 
Hallo,

auch nach mehrmaligem Lesen deines Beitrags bin ich nicht sicher, ob ich dich verstehe.

Typisierte Zeiger in COM-Objekten? Klar: PInteger, PChar, ...

TLB? Brauchst du nur für early binding ...

Untypisierte Zeiger mit Größenangabe? Was hast du da vor?

Freundliche Grüße

Dezipaitor 3. Feb 2008 14:49

Re: COM + (un)typisierte Zeiger
 
Naja ich dachte eigentlich, dass ich ein Ergebnis zurückgeliefert von eine C-Funktion, in ein COM-Objekt verwandeln könnte.

Als einfaches Beispiel liefert ConvertStringSidToSidW einen Zeiger auf eine TSID Struktur. Kann nun eine Methode in einem COM-Objekt, diese Datestruktur empfangen, um das COM-Objekt zu initialisieren?

marabu 3. Feb 2008 15:28

Re: COM + (un)typisierte Zeiger
 
Da ein COM-Object häufig in einer DLL erzeugt wird und diese DLL wiederum oft in C geschrieben wurde, kannst du also davon ausgehen, dass eine C-Library dir ein Interface zurückgeben kann. Ich denke, da müsste es entsprechende Kapitel zur ActiveX-Erstellung in deinem C-Handbuch geben.

Deine letzte Frage ist für mich schon wieder verwirrend, da ich mich mit deinem Spezialgebiet so gut wie nie beschäftige. Ich weiß gar nicht von welchem COM-Object du schreibst - es scheint ein bestimmtes zu sein.

Dezipaitor 3. Feb 2008 15:39

Re: COM + (un)typisierte Zeiger
 
Beispiel:

Ich will ein eigenes COM-Objekt erstellen. Das heißt z.B. TCOMSid .
Es verwaltet eine SID (Name, Autoritäten, usw).

Ich frage mich, ob es eine Methode in einem COM-Objekt gegeben kann, die wie folgt aussieht:

Delphi-Quellcode:
procedure InitSid(const Sid : PSid); safecall;
Diese Methode holt die benötigten Daten aus der SID und initialisiert Eigenschaften des COM-Objekts.

Die COM-Objekte verbleiben in der Sprache Delphi.

marabu 3. Feb 2008 16:03

Re: COM + (un)typisierte Zeiger
 
Wenn du das COM-Object mit D7 entwerfen würdest, dann würdest du es COMSid nennen, ihm vielleicht ein Interface ICOMSid verpassen un diesem eine Methode Init. Der Methode ordnest du einen Parameter zu, den Typ machst du vorher bekannt und wählst ihn dann im TLB-Editor als VAR-Parameter aus. Warum willst du das mit C machen?

Dezipaitor 3. Feb 2008 16:17

Re: COM + (un)typisierte Zeiger
 
Wie mache ich den Typ bekannt?

marabu 3. Feb 2008 16:59

Re: COM + (un)typisierte Zeiger
 
Natürlich weißt du, dass du einen Typ per type-declaration bekannt machst!

Ich habe mal im PSDK nachgesehen, was es mit PSID auf sich hat und jetzt ahne ich, was dein Problem ist: variable length structure - kann das sein? Solche Strukturen benötigen eine Größenangabe oder einen Delimiter. Mit SID solltest du dich aber besser auskennen als ich.

Dezipaitor 3. Feb 2008 17:19

Re: COM + (un)typisierte Zeiger
 
Zitat:

Zitat von marabu
Natürlich weißt du, dass du einen Typ per type-declaration bekannt machst!

Ich muss doch für COM diese Methode über IDL definieren. Im TLB Editor gibt es nur die Standardtypen.

Zitat:

Zitat von marabu
Ich habe mal im PSDK nachgesehen, was es mit PSID auf sich hat und jetzt ahne ich, was dein Problem ist: variable length structure - kann das sein? Solche Strukturen benötigen eine Größenangabe oder einen Delimiter. Mit SID solltest du dich aber besser auskennen als ich.

Die variable Länge ist ein kleineres Problem. Ich weiß nur nicht, wie ich mit früher Bindung solche Typen in TLB bekannt machen kann.

marabu 3. Feb 2008 17:33

Re: COM + (un)typisierte Zeiger
 
Ist nicht der ToolButton (im TLB Editor) für die Record-Deklaration das was du brauchst?
So habe ich es versucht und der Typ wird dann auch in der Auswahlliste für Parametertypen angeboten.
Probier doch mal.

Dezipaitor 3. Feb 2008 17:54

Re: COM + (un)typisierte Zeiger
 
Hier ist der Record.
Code:
typedef struct _SID {
  BYTE Revision;
  BYTE SubAuthorityCount;
  SID_IDENTIFIER_AUTHORITY IdentifierAuthority;
  DWORD SubAuthority[ANYSIZE_ARRAY];

SID, *PSID;
Wie kann ich sowas in IDL definieren?

marabu 3. Feb 2008 18:51

Re: COM + (un)typisierte Zeiger
 
Ja, das ist eine harte Nuss. Ich würde versuchen den Record in einem OleVariant auf die Reise zu schicken. Immerhin geht es ja nur darum, dass der variabel lange Record irgendwie das COM-Marshalling überlebt, oder?

EDIT: Kaum habe ich das geschrieben, da erinnere ich mich an diesen Beitrag: klick

Dezipaitor 3. Feb 2008 19:03

Re: COM + (un)typisierte Zeiger
 
Ok, Danke für die Info.

Aber das bedeutet wohl, dass für jede Clientanwendung, so eine Unwandlung gemacht werden muss.
D.h. zum Beispiel, dass ich eine DLL schreibe, die das ermöglicht, damit nicht in X-verschiedenen Sprachen diese Umwandlung gemacht werden muss.


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:19 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-2025 by Thomas Breitkreuz