ПредишенСледващото

В началото бе словото

И с късно свързване, както следва:

Практическо използване idispatch

Практическо използване idispatch

Фигура 1 IUnknown Интерфейсният

Фигура 2 интерфейс IDispatch

Всъщност, IUnknown интерфейс има три указатели към интерфейси, които са на базата на COM и ви позволява да започнете да използвате COM-обекти: QueryInterface (използва се за въпроси към обект указатели към други интерфейси), AddRef (служи за увеличаване на референтния брой на интерфейса) и освобождаване (сервиси за да се намали броят на препратка интерфейса). IDispatch включва същите три основни индекса на интерфейси, както и четири от собствен интерфейс показалка, сред които основните за нас е да се позове. защото благодарение на него, ние ще бъдем в състояние да причини за извършване на методите, прилагани в COM-обект, не много по-сложно, отколкото в езика на високо ниво.

Какво е указател към интерфейса? За нас това не е нищо повече от една функция повикване COM-обект. Това означава, че всеки показалка ни насочва към мястото на викащата функция в COM-обект. Тъй като всеки указател е 4 байта (DWORD), по простата изместване на указател към IDispatch, можете да се обадите на функцията изпълнява в съоръжението. Но ние сме интелигентни хора, и така ние ще използваме директно имената на функцията. Тя е по-лесно и по-интуитивно.

Вътрешен локален сървър

Да започваме. Първо, създаване на прост COM-обект. Нека пишат Inproc-сървър, като DLL, който ще бъде регистриран на същата машина с клиента. За да направите това, стартирайте Visual Basic на Microsoft Visual Studio 6.0 пакет. Като нов проект, изберете ActiveX Dll. Отиди до прозореца Project Explorer и да даде името си проект Mycom. и преименуване Клас1 да MyClass. В нашия клас прозорец напишете следния код:

Практическо използване idispatch


Фигура 3. Създаване на COM-сървър

Сега аз нося пълната програма на асемблер код, за да влезете в нашия COM-обект. Всички обяснения след това.

Сега точките.

Ето описанието на функцията на MSDN:

Функцията приема като вход ProgID COM-обект и връща CLSID на обекта. Ако имахме GUID на обекта, те биха могли да използвате различен API-функция -

който ви позволява да получите този идентификатор на обекта на указател към низ GUID.

Тази двойка функции се използва за инициализиране / отмяна на обезпечаването COM библиотека. OleInitialize функция има един (и запазени параметър), който dolzhet бъде нула. Между другото, практиката показва, че вместо двойката функции е възможно да се използва друг чифт:

което, като цяло, са предназначени за същата цел.

Основната функция на създаване на копие на COM-обект. описанието му в MSDN, както следва:

Мисля, че всичко е ясно тук. Вторият параметър ние NULL, защото ние не трябва да IUnknown. Третият вариант - това е един или повече от общия постоянна Enumerator CLSCTX.

Четвъртият вариант - е GUID на исканата интерфейс (в този случай, ние молим за указател към IDispatch). И най-накрая, че петият вариант - променлива, към който показалецът се връща в случай на успешно изпълнение на функцията.

При успех, функцията връща S_OK (или просто казано 0). И в случай на повреда - един от трите грешки (REGDB_E_CLASSNOTREG (клас не са регистрирани), CLASS_E_NOAGGREGATION (клас не може да бъде създаден като част от процеса на разговори), E_NOINTERFACE (без интерфейс)).

Функция без параметри, което ни позволява да се получи Местен идентификатор на системата по подразбиране (нещо подобно). За нас това ще бъде равна на 419. Но за чистотата на експеримента, по-добре е да използвате функцията.

И сега внимание. Ако вие не разбирате този момент, няма да разбере нищо. В този случай ние наричаме интерфейс GetIDsOfNames IDispatch. Тя GetIDsOfNames функция за получаване на указател към интерфейса имаме нужда mymethod метод изисква пет параметъра:

Така че трябва да coinvoke осем параметри: три задължителни за макро, плюс пет за функцията. Надявам се, че той също е ясно за мен напоследък. -))

След като желаната dispid нашия метод, ние просто го наричат ​​с помощта на функцията контролера Invoke. Позове трябва да прехвърлите осем параметри:

С първите три параметри, мисля, че всичко е ясно. Други параметри изискват обяснение. Що се отнася до четвъртия параметър, представете си ситуация, в която си COM-обект реализира като четири функции с едно и също име (например цвят.): Една нормална функция, а втората за задаване на стойността на имота, третият да зададете свойствата на връзката и четвъртия, възстановяване на стойността свойства. Ако премине на името на функцията Invoke. тъй като това ще определи какъв вид обект, което наричаме функции да изпълнява? Но за това за пореден път и се нуждаят от четвърти параметър, който може да приема една от следните стойности:

Петият параметъра - DISPPARAMS структура, съдържаща аргументите на функция, наречена COM-обект. Тук е неговата дефиниция:

С други думи, ако ние сме за обекта цвят, трябва да положите аргумент на червено, след това този аргумент ние в петата параметър на функцията на Invoke. Тъй като методът на момент mymethod ни COM-обект не изисква никакви параметри, ние сме в първите два елемента на структурата минават на NULL (ние нямаме аргументи и именувани аргументи), а следващите две елементи преминават 0 (брой аргументи и именувани аргументи). Но не забравяйте, че структурата на бъдещето, защото ще бъде много необходимо, когато аргументите на трансфер функция в бъдеще.

В останалите три параметри извикване на функцията, минаваме NULL, защото функция COM-обект не е нищо няма да се върне (това показва само съобщение кутия), EXCEPINFO структура ние използваме няма да и защото не минават никакви аргументи на метода на нашата COM-обект, той не се интересува от информация за какъв вид аргумент не е наред ,

Мисля, че сега вече се радват на прозорец изход оглед съобщение на нашата COM-обект. Но всичко това е само началото. Тогава ние чакаме Outproc-сървър и отдалечен достъп до COM-обекти. А сега можеш да излезеш и да пие бира. -))

Свързани статии

Подкрепете проекта - споделете линка, благодаря!