Utilizarea practică a idispatch-ului

La început a fost cuvântul

Și cu ajutorul legării târzii, deci:

Utilizarea practică a idispatch-ului

Utilizarea practică a idispatch-ului

Fig.1 Interfața IUnknown

Fig.2 Interfața IDispatch

De fapt, interfata IUnknown are trei indicatoare către interfețe, care sunt baza COM și vă permite să începeți să utilizați COM-obiecte: QueryInterface (utilizate pentru a interoga pointerii obiect la alte interfețe), AddRef (servește pentru a crește numărul de referință pe interfața) și eliberați (servele pentru a reduce numărul de referință al interfeței). IDispatch include aceleași trei indicatoare de interfață de bază, plus patru indicatori de interfață personalizată, dintre care principalul este Invoke. deoarece datorită lui, vom avea ocazia să invocăm metodele implementate în obiectul COM, nu mult mai complicate decât într-un limbaj de nivel înalt.

Ce este un pointer de interfață? Pentru noi, acest lucru nu este altceva decât o chemare la o funcție de obiect COM. Adică, fiecare indicator indică locația funcției numite în obiectul COM. Deoarece fiecare pointer are o dimensiune de 4 octeți (dword), pur și simplu prin mutarea de la pointer la IDispatch, puteți apela funcția implementată în obiect. Dar suntem oameni inteligenți și, prin urmare, vom folosi numele funcțiilor direct. Deci este mai ușor și mai ușor de înțeles.

Servere locale interne

Deci, să începem. Mai întâi, creați un obiect COM simplu. Vom scrie serverul Inproc sub forma de dll, care va fi înregistrat pe o singură mașină cu clientul. Pentru aceasta, executați Visual Basic din pachetul Microsoft Visual Studio 6.0. Ca un nou proiect, selectați ActiveX Dll. Mergeți la fereastra Project Explorer și dați proiectului nostru numele mycom. și redenumiți Class1 la mine. În fereastra clasei noastre scriem următorul cod:

Utilizarea practică a idispatch-ului


Figura 3 Crearea unui server COM

Acum dau codul complet al programului în asamblare pentru accesul la obiectul nostru COM. Toate explicațiile după.

Acum pe puncte.

Iată descrierea funcției din MSDN:

Funcția acceptă ProgID-ul obiectului COM ca parametru de intrare și returnează CLSID-ul acestui obiect. Dacă am avea un GUID al unui obiect, am putea folosi o altă funcție API -

care vă permite să obțineți CLSID-ul obiectului de la pointer la șirul GUID.

Această pereche de funcții este utilizată pentru a inițializa / deinaliza biblioteca COM. Funcția OleInitialize are un singur (și rezervat parametru) care trebuie să fie zero. Apropo, practica arată că, în locul acestei perechi de funcții, este foarte posibil să folosiți o altă pereche:

care, în general, sunt destinate aceluiași scop.

Funcția principală a creării unei instanțe a unui obiect COM. Descrierea sa în MSDN este următoarea:

Cred că totul este clar. Al doilea parametru este NULL. nu avem nevoie de IUnknown. Al treilea parametru este una sau mai multe constante combinate de enumerator CLSCTX.

Al patrulea parametru este GUID al interfeței solicitate (în acest caz, solicităm un pointer la IDispatch). Și, în sfârșit, al cincilea parametru este o variabilă, în care acest indicator se va întoarce în cazul executării cu succes a funcției.

Dacă este reușită, funcția returnează S_OK (sau pur și simplu 0). Și în caz de eșec - una din cele trei erori (REGDB_E_CLASSNOTREG (clasa nu este înregistrată), CLASS_E_NOAGGREGATION (o clasă nu poate fi creată ca parte a procesului de asteptare), E_NOINTERFACE (fără interfață)).

Funcție fără parametri, care permite obținerea identificatorului local al sistemului în mod implicit (ceva asemănător). Pentru noi, va fi egal cu 419. Dar pentru puritatea experimentului, este mai bine să folosim funcția.

Și acum atenție. Dacă nu înțelegeți acest punct, nu veți înțelege deloc nimic. În acest caz, numim funcția IDIDatch GetIDsOfNames. Funcția GetIDsOfNames servește la obținerea unui pointer la interfața metodei memethod necesară și necesită cinci parametri:

Prin urmare, avem opt parametri în coinvoke: trei, obligatorii pentru macro, plus cinci pentru funcția. Sper că acest lucru ți-a devenit clar așa cum am făcut recent. -))

După ce dispunem de metoda de care avem nevoie, o numim doar folosind funcția Invocare invocare a dispecerului. Invocați că trebuie să treceți opt parametri:

Cu primii trei parametri, cred că totul este clar. Parametrii rămași necesită explicații. În ceea ce privește al patrulea parametru, imaginați-vă o situație în care dvs. COM-obiect implementat ca patru funcții cu același nume (de exemplu, de culoare.): O funcție normală, a doua pentru a stabili valoarea unei proprietăți, a treia pentru a seta proprietățile link-ul și al patrulea, valoarea restaurarea proprietăți. Dacă trecem numele funcției Invoke. Cum va determina care dintre funcțiile obiectului pe care îl chemăm pentru execuție? Acesta este motivul pentru care este necesar al patrulea parametru, care poate lua una dintre următoarele valori:

Al cincilea parametru este structura DISPPARAMS, care conține argumente pentru funcția apelată a obiectului COM. Iată definiția sa:

Cu alte cuvinte, dacă trebuie să trecem argumentul roșu la funcția Color a obiectului, vom trece acest argument în al cincilea parametru al funcției Invoke. Deoarece metoda momentul mymethod nostru COM-obiect nu are nevoie de nici un parametru, suntem în primele două elemente ale structurii trec NULL (nu avem argumente și argumente numite), iar al doilea două elemente trec 0 (număr de argumente și argumente numite). Dar amintiți-vă această structură pentru viitor, pentru că vom avea nevoie foarte mult la trecerea argumentelor funcțiilor în viitor.

În cei trei parametri rămași ai funcției Invoke, trecem NULL; caracteristică COM-obiect este nimic nu ne vom întoarce (afișează doar o casetă de mesaj), structura EXCEPINFO vom folosi nu va, și pentru că nu trece nici un argument metodei noastre COM-obiect, acesta nu este interesat de informații despre ce fel de argument este greșit .

Cred că acum vă bucurați de vizualizarea ferestrei de mesaje afișată de obiectul nostru COM. Dar toate astea sunt doar florete. Apoi așteptăm serverul Outproc și accesul la distanță la obiectele COM. Iar acum poți să bei o bere. -))

Articole similare