Az idispatch gyakorlati alkalmazása
Kezdetben a szó volt
És a késői kötés segítségével:
Fig.1 Interfész I Ismeretlen
2. ábra Interfész IDispatch
Tulajdonképpen IUnknown felület három mutatókat felületek, amelyek alapján a COM és lehetővé teszi az induláshoz a COM-objektumok: QueryInterface (lekérdezni a tárgy mutató egyéb interfészek), AddRef (szolgál, hogy növelje a referencia száma a felület) és az engedély (szolgál hogy csökkentsék a referencia száma a felületen). IDispatch tartalmazza ugyanazt a három alapvető mutató interfészeket, és négy saját felület mutató, az egy fő számunkra, hogy hívja meg. mert hála neki, mi lesz képes okozni, hogy végre az alkalmazott módszerek a COM-objektum, nem sokkal bonyolultabb, mint egy magas szintű nyelven.
Mi az a felületmutató? Számunkra ez nem más, mint egy COM objektum funkció hívása. Vagyis minden mutató a COM objektumban a hívott függvény helyére mutat. Mivel minden mutató 4 bájtnyi méretű (dword), egyszerűen a mutatóról az IDispatchra való áthelyezéssel felhívhatja az objektumban végrehajtott függvényt. De intelligens emberek vagyunk, ezért közvetlenül használjuk a funkciók nevét. Így könnyebb és érthetőbb.
Belső helyi szerverek
Szóval, kezdjük el. Először hozzon létre egy egyszerű COM objektumot. Az Inproc-kiszolgálót dll formájában fogjuk írni, amelyet az egyik gépen az ügyféllel regisztrálunk. Ehhez futtassa a Visual Basic programot a Microsoft Visual Studio 6.0 csomagból. Új projektként válassza az ActiveX Dll lehetőséget. Menjen a Project Explorer ablakba, és adja meg projektünknek a mycom nevét. és nevezze át a Class1-et a myclass-nak. A mi osztályunk ablakában a következő kódot írjuk:
3. ábra COM szerver létrehozása
Most megadom a program teljes kódját az assembler-ben a COM objektum eléréséhez. Az összes magyarázat után.
Most a pontokon.
Itt található az MSDN funkcióleírás:
A függvény beviteli paraméterként elfogadja a COM objektum ProgID-jét, és visszaküldi az objektum CLSID-jét. Ha volt egy objektum GUID-je, használhatnánk egy másik API-funkciót -
amely lehetővé teszi, hogy az objektum CLSID-jét a mutatóról a GUID-karakterláncba helyezze.
Ez a pár funkció a COM könyvtár inicializálására / deinicializálására szolgál. Az OleInitialize funkciónak egyetlen (és fenntartott paramétere van), amely nulla lehet. Egyébként a gyakorlat azt mutatja, hogy a pár funkció helyett teljesen más pár is használható:
amelyek nagyjából ugyanarra a célra szolgálnak.
A COM-objektum példányának létrehozásának fő funkciója. A leírás az MSDN-ben a következő:
Azt hiszem, minden itt világos. A második paraméter NULL. nem kell IUnknown. A harmadik paraméter egy vagy több kombinált számláló CLSCTX konstans.
A negyedik paraméter a kért interfész GUID-je (ebben az esetben egy mutatót kérünk az IDispatch-ra). És végül az ötödik paraméter egy változó, amelyben ez a mutató visszatér a funkció sikeres végrehajtása esetén.
Ha sikeres, akkor a függvény S_OK (vagy egyszerűen tegye 0). És elmulasztása esetén - az egyik három hiba (REGDB_E_CLASSNOTREG (Az osztály nincs regisztrálva), CLASS_E_NOAGGREGATION (egy osztály nem lehet létrehozni részeként a hívó folyamat), E_NOINTERFACE (nincs interface)).
Funkció paraméterek nélkül, amely alapértelmezés szerint lehetővé teszi a rendszer helyi azonosítóját (valami ilyesmi). Számunkra ez lesz 419. Ugyanakkor a kísérlet tisztasága miatt jobb, ha továbbra is használjuk a funkciót.
És most figyelem. Ha nem érted ezt a pontot, akkor semmit sem értesz. Ebben az esetben az IDIDatch GetIDsOfNames függvényt hívjuk. A GetIDsOfNames függvény egy mutatót kap a szükséges mymethod módszer interfészéhez, és öt paramétert igényel:
Ezért van nyolc paraméterünk: három, kötelező a makróhoz, öt pedig a függvényhez. Remélem, ez olyan egyértelművé vált számodra, mint a közelmúltban. -))
Miután megkaptuk a szükséges módszert, csak a diszpécser Invoke Invocation funkciójával hívjuk. Kérje, hogy nyolc paramétert kell megadnia:
Az első három paraméterrel azt hiszem, minden világos. A fennmaradó paraméterek magyarázatot igényelnek. Ami a negyedik paraméter, elképzelni egy olyan helyzetet, ahol a COM-objektumot végrehajtani négy funkció ugyanazzal a névvel (például szín.): Egy normális működéséhez, a második meg egy ingatlan értékét, a harmadik, hogy a tulajdonságokat a kapcsolat és a negyedik, a visszaállító értéke tulajdonságait. Ha átadjuk az Invoke függvény nevét. Hogyan fogja meghatározni, hogy a végrehajtandó objektum mely funkciói közül melyik? Ezért van szükség a negyedik paraméterre, amely a következő értékek valamelyikét eredményezheti:
Az ötödik paraméter a DISPPARAMS struktúra, amely argumentumokat tartalmaz a COM objektum nevezett funkciójához. Itt van a meghatározása:
Más szóval, ha mi vagyunk a színes tárgyat, akkor át kell mennie egy érv a piros, akkor ez az érv átadjuk az ötödik paraméter a Invoke funkciót. Attól a pillanattól kezdve eljárás mymethod a COM-objektum nem igényel semmilyen paramétert, mi vagyunk az első két eleme a szerkezet haladnak a NULL (nincs érveket és elemzi érvek), és a második két elem át 0 (számos érv és elemzi érveket). De ne feledjük, hogy a szerkezet a jövőben, mert akkor nagyon szükséges, ha az átviteli függvény paraméterei a jövőben.
Az Invoke függvény többi három paraméterében átadjuk a NULL értéket; jellemző COM-objektum nem mi nem fog visszatérni (csak az üzenet boxban), EXCEPINFO szerkezet használjuk nem fog, és mert nem adja át semmilyen érvet, hogy a módszer a COM-objektum, ez nem érdekli információt, hogy milyen érv téves .
Azt hiszem, most már élvezi a COM objektum által megjelenített üzenetablak nézetét. De mindez csak virágok. Ezután várjuk az Outproc-kiszolgálót és a COM-objektumok távoli elérését. És most megy és inni egy sört. -))