Az idispatch gyakorlati alkalmazása

Kezdetben a szó volt

És a késői kötés segítségével:

Az idispatch gyakorlati alkalmazása

Az idispatch gyakorlati alkalmazása

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:

Az idispatch gyakorlati alkalmazása


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. -))

Kapcsolódó cikkek