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 Server Struktur (Interfaces zurückgeben?) (https://www.delphipraxis.net/152666-com-server-struktur-interfaces-zurueckgeben.html)

Whookie 1. Jul 2010 09:47

COM Server Struktur (Interfaces zurückgeben?)
 
Hallo zusammen
Ich beschäftige mich gerade mit COM-Servern und habe nach einigen Recherchen und Experimenten einige Fragen.

Zuerst aber einmal was ich machen möchte/schon gemacht habe: Ich habe, in einer DLL implementiert, einen COM-Server (über ROT registriert) den ich für alle Programme zurückgebe (dual, oleautomation; abgel. von IDispatch).
Dieser Server soll verschiedene "Geräte" (z.B.: über die serielle Schnittstelle) verwalten und diese meinen Applikationen anbieten.
Ich dachte an ein paar Funktionen wie (EnumDevices, GetDeviceList, OpenDevice) wobei EnumDevices im COM-Server eine Liste der Geräte zusammenstellt. Mit GetDeviceList sollte eine Liste von IDs (Strings) zurückgegeben werden (Variant Array??), mit deren Hilfe dann eines der Geräte über OpenDevice geöffnet werden kann.
OpenDevice könnte jetzt eine neues COM-Objekt zurückgeben über das ich die Eigenschaften des entspr. Gerätes ansprechen kann.


Nun zu meinen Fragen:
  • Ist das vom Grundkonzept ok? Also der eine Server der weitere COM-Objekte liefert?
  • Zusätzlich war es mir bisher nicht möglich überhaupt ein COM-Objekt als "out" bzw "retval" zurückzugeben (ich kriege immer "Out parameter requires pointer type")?
  • Ist Delphi (2007) einwenig instabil was COM-Experimente angeht (manchmal vergisst Delphi den Unterschrich vor TLB und kann das Projekt nicht mehr compilieren)?
TIA

sirius 1. Jul 2010 09:52

AW: COM Server Struktur (Interfaces zurückgeben?)
 
1. Ja, das Konzept ist in Ordnung.
2. IMHO musst du einen Stern (*) davor dahinter setzen
3. k.A. ich bin bei D7 hängen geblieben ;)

Whookie 1. Jul 2010 11:50

AW: COM Server Struktur (Interfaces zurückgeben?)
 
Zitat:

Zitat von sirius (Beitrag 1032790)
2. IMHO musst du einen Stern (*) davor setzen

Das mit dem Stern hab ich schon gemacht, es ändert nichts an der Fehlermeldung.

Es scheint eher so zu sein, dass nur "manche" Datentypen als "out" definiert werden dürfen. BSTR*, FONTITALIC*, __int64*, ... um einige zu nennen die bereits fix in der Dropdownliste stehen. Nicht funktioniert z.B.: IUNKNOWN*, IPICTURE*, ... und eben auch keines der selber erstellten Objekte (bei mir z.B.: IDevice*)?

sirius 1. Jul 2010 12:02

AW: COM Server Struktur (Interfaces zurückgeben?)
 
Nimm mal 2 Sterne (ich hab grad in mein letztes Projekt bzgl. COM geschaut)!

sirius 1. Jul 2010 12:08

AW: COM Server Struktur (Interfaces zurückgeben?)
 
Liste der Anhänge anzeigen (Anzahl: 1)
[add: Bild im Anhang]

Das sieht dann im Interface so aus:
Delphi-Quellcode:
function getAnalogChannelInfo(aIndex: Integer): IAnalogChannelInfo; safecall;
[br]
und wird natürlich so erstellt:

Delphi-Quellcode:
result:=CoAnalogChannelInfo.Create;

Whookie 1. Jul 2010 12:36

AW: COM Server Struktur (Interfaces zurückgeben?)
 
Ahhh :thumb: maximalen Dank, zwei Sterndaln sind halt immer besser wie Eines :wink:!

Dezipaitor 4. Jul 2010 17:50

AW: COM Server Struktur (Interfaces zurückgeben?)
 
In C/C++ sind Interfaces keine Zeiger, daher muss man erstmal einen Zeiger erzeugen, damit man mit dem Interface arbeiten kann. Der zweite Zeiger/Stern ist dann "out" für den Parameter.

himitsu 4. Jul 2010 18:10

AW: COM Server Struktur (Interfaces zurückgeben?)
 
dyn. Arrays und (Long)Strings dürfen nicht als OUT definiert werden, da hier die Compilermagic, bzw. das delphieigene Speichermanagement umgangen werden könnte.
Aber diese Typen sollte man eh nicht in einem externen Interface verwenden.

Und bei Interfaces/COM-Objekten würde ich es auch nicht machen, da hier die Referenzzählung Probleme bereiten könnte.
(Wo das endet, sieht man beim WMI, wo der Result-Parameter als OUT definiert ist, welches ein nettes Speicherleck erzeugt, wenn man da einen "gefüllten" / referenzierenden Variant übergibt.
Denn dessen alter Inhalt wird nicht freigegeben, sondern nur die Referenzen überschrieben.)


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