Interface Befehl mit Windows API (IMAPI)

Anfängerfragen zum Programmieren mit PureBasic.
spacewalkerDE
Beiträge: 3
Registriert: 28.04.2010 17:18

Interface Befehl mit Windows API (IMAPI)

Beitrag von spacewalkerDE »

Hallo,

in dem thread hier
http://www.purebasic.fr/english/viewtop ... ilit=imapi

werden sehr viele Interfaces definiert.

z.B dieses:

Code: Alles auswählen

Interface IBootOptions Extends IDispatch
  get_BootImage(dispidMember.l)
  get_Manufacturer(dispidMember.l)
  put_Manufacturer(dispidMember.p-bstr)
  get_PlatformId(dispidMember.l)
  put_PlatformId(dispidMember.l)
  get_Emulation(dispidMember.l)
  put_Emulation(dispidMember.l)
  get_ImageSize(dispidMember.l)
  AssignBootImage(newVal.l)
EndInterface
IBoootOptions, und auch die anderen Interfaces dort, gehören alle zur Windows API "IMAPI2"

Meine Fragen wären :

1.
Jedes Interface, das in obigen Code definiert wird, listet eine ganze Menge an Methoden auf die irgendwie alle zu IMAPI gehöhren.
Aber ich kann in dem Quellcode nicht finden, wo der Code zu diesen Methoden stehen würde.
Heisst das, dass Methoden wie "get_Manufacturer(dispidMember.l)", die Bestandteil der Windows API sind, einfach per "Interface" Befehl benutzt werden können?

2.
Was ich auch nicht verstehe ist was "IDispatch" genau darstellt.
"Extends" erweitet das (schon bestehende?) Interface "IDispatch" - aber auch dieses kann ich in dem Code nicht finden?
Ist "IDispatch" auch schon in PB "enthalten" und bedarf daher keinen eigenen Deklaration?

Danke
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Interface Befehl mit Windows API (IMAPI)

Beitrag von ts-soft »

Der Code steckt in den entsprechenden DLLs (ActiveX usw.)
Zur Nutzung sollteste im engl. Form nach COMatePLUS ausschauen.

Die vordefinierten Interfaces findeste im "Strukturverzeichnis" der IDE ALT + S
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Josh
Beiträge: 1028
Registriert: 04.08.2009 17:24

Re: Interface Befehl mit Windows API (IMAPI)

Beitrag von Josh »

zu 1)

die interfaces sind ja dazu da, dass du auf die methoden zugreifen kannst.

zu 2)

- jedes com interface benötigt als mindestanforderung das IUnknown interface. darin enthalten ist das queryinterface um auf andere schnittstellen zugreifen zu können und zwei methoden für den referenzzähler. wenn mit der methode release() alle referenzen auf dieses objekt freigegeben worden sind, dann zerstört sich das objekt selber. wenn nur diese drei standardmethoden definiert sind (nicht die erweiterungen von IDispatch), kannst du auf das objekt nur mit früher bindung (vtable muss bekannt sein) zugreifen. diese methode ist auf jeden fall zu bevorzugen, da bereits beim kompilieren alles bekannt ist und du mit wenigen speicherzugriffen die methode aufrufen kannst. frühe bindung entspricht den beispielen aus deinem anderen beitrag

- als erweiterung zu IUnknown gibt es dann noch das interface IDispatch. diese beinhalten dann noch weitere grundsätzliche methoden um auf das objekt zugreifen zu können, ohne dass du das interface weiter kennst. dies ist weitaus aufwändiger und auch komplizierter. der vorteil dabei ist, dass du zur kompilierungszeit noch nicht wissen musst, wie die vtable genau aussieht. die vtable könnte sich ja bei verschiedenen versionen des com-objektes ändern. da die namen der methoden im allgemeinen aber gleich bleiben, kannst du trotzdem über die namen auf die methoden zugreifen. (späte bindung)

meistens sind in die com objekte beide methoden implementiert und du kannst es dir aussuchen, was du verwendest. wenn die möglichkeit besteht, dann würde ich auf jeden fall frühe bindung bevorzugen. da hast du mit wenigen codezeilen alles erledigt, wenn du allerdings späte bindung (z.b. mit comate) verwendest, dann hoppelt der dir sicher das 200-500 fache an codezeilen durch.

interpreter wie z.b. scriptsprachen können nur späte bindung, aber ich glaub eh nicht, dass du eine scriptsprache schreiben willst. ^^
Antworten