Flylib.com

Books Software

 
 
 

Essential COM - page 25

IDL

IDL -. IDL ø , . IDL ÷ ÷ interface . ÷ ÷: , , . :

[ attribute1, attribute2, ...] 
interface IThisInterface : IBaseInterface { 
  typedef1; 
  typedef2; 
  :
  :
  method1; 
  method2; 
}

IDL. [object] , ÷ -, DCE-. ÷ ( ø IDL- IThisInterface ÷ ).

× , ÷ - ÷ , ÷ ÷ , . ÷ ø , ÷ . , , , ÷ , ÷ , , ÷- ÷. , ÷, , ÷ : ICalculator .

ø - ÷ ÷, , . ÷ , ICalculator , "ICalculator", . , ÷ ICalculator , , , , . ø , , ÷ ÷ .

× ÷ , - ÷ ÷ , ÷ . ÷ ( Globally Unique Identifiers - GUIDs ), ÷ squids 1 . GUID ÷ , . GUID ÷ ÷ ø 128- ÷, ÷ , . GUID ( Universally Unique Identifiers - UUIDs ), DCE RPC. GUID - ÷ ( Interface IDs - IIDs ). GUID, ÷ GUID ( Class IDs - CLSIDs ). ÷ , GUID ÷ :

BDA4A270-A1BA-11d0-8C2C-0080C73925BA

32 ø÷ 128- ÷ GUID. GUID .

GUID API-, 128- ÷, ø :

HRESULT CoCreateGuid(GUID *pguid);

, CoCreateGuid , ø, ø ÷÷ ÷ ÷ (, ÷ ÷ ). ø , ÷ ÷ CoCreateGuid HRESULT , , ÷ ÷ ÷ ÷ ø. CoCreateGuid , ø ÷ , SDK GUIDGEN.EXE . . 2.3 GUIDGEN . GUIDGEN CoCreateGuid ÷ GUID ÷ , ÷ C++ IDL. IDL ÷ (÷ ).

. 2.3. guidgen {% if main.adsdop %}{% include 'adsenceinline.tpl' %}{% endif %}

× ÷ IDL, - [uuid] . [uuid] - ÷ GUID:

[object, uuid(BDA4A270-A1BA-11dO-8C2C-0080C73925BA)] 
interface ICalculator : IBaseInterface { 
 HRESULT Clear(void); 
 HRESULT Add([in] long n); 
 HRESULT Sum([out, retval] long *pn); 
}

C++ ÷ IID ÷ , ø IID_ . , ICalculator IID, , IDL IID_ICalculator . ÷ C++.

ø C++ 128- ÷, - 128- ÷ GUID IID CLSID :

typedef struct _GUID { 
    DWORD Data1;
    WORD Data2;
    WORD Data3;
    BYTE Data4[8];
} GUID; 
typedef GUID IID; 
typedef GUID CLSID;

GUID ø , ÷ , GUID, - . ÷ ÷ ÷ GUID (constant reference aliases) GUID:

#define REFGUID const GUID& 
#define REFIID const IID& 
#define REFCLSID const CLSID&

× ÷ GUID, ÷ == != GUID:

inline BOOL IsEqualGUID(REFGUID r1, REFGUID r2) 
{ 
    return !memcmp(&r1, &r2, sizeof(GUID)); 
} 

#def1ne IsEqualIID(r1, r2) IsEqualGUID((r1) , (r2)) 

#define IsEqualCLSID(r1, r2) IsEqualGUID((r1), (r2)) 

inline BOOL operator == (REFGUID r1, REFGUID r2) 
{ 
    return !memcmp(&r1, &r2, sizeof(GUID)); 
} 

inline BOOL operator != (REFGUID r1, REFGUID r2) 
{ 
    return !(r1 == r2); 
}

÷ SDK , , ø.

, ÷ GUID, ; ÷, ÷ Dynamic_Cast , , . , ItensibleObject IUnknown , .


1 ÷ ø GUID ÷ ÷ . , ÷ GUID fluid ( ) , squid () , , ÷ ø, languid ()

IUnknown

- IUnknown ÷, ÷ IExtensibleObject , . IExtensibleObject , ø , :

class IExtensibleObject {
  public: 
    virtual void *Dynamic_Cast(const char* pszType) = 0; 
    virtual void DuplicatePointer(void) = 0; 
    virtual void DestroyPointer(void) = 0; 
}

Dynamic_Cast , ÷ C++ dynamic_cast . , ÷ , DuplicatePointer . , ÷ ÷ , DestroyPointer . IUnknown C++:

extern "С" const IID IID_IUnknown: 
interface IUnknown { 
    virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void **ppv) = 0; 
    virtual ULONG STDMETHODCALLTYPE AddRef(void) = 0;
    virtual ULONG STDMETHODCALLTYPE Release(void) = 0; 
};

÷ SDK interface ÷ C++ struct , . , , , ÷ , ÷ public . × - , STDMETHODCALLTYPE . Win32, Microsoft C++ _stdcall .

IUnknown IExtensibleObject . QueryInterface ÷ ÷ ++- dynamic_cast . AddRef , ÷ . Release , ÷ ÷ , , ÷. ÷ IUnknown , , ÷ , ÷ IUnknown GUID, .

IDL- IUnknown unknwn.idl SDK, ÷ :

// unknwn.idl - system IDL file 
// unknwn.idl - системный файл IDL 
[ 
  local, 
  object, 
  uuid (00000000-0000-0000-C000-000000000046) 
] 
interface IUnknown { 
  HRESULT QueryInterface([in] REFIID riid, [out] void **ppv);
  ULONG AddRef(void);
  ULONG Release(void); 
}

local . , ÷ ÷ , ÷ ø HRESULT . , IUnknown . , ÷ ÷, IDL- , SDK, ÷ , . ÷ ÷ , ø ø . ÷ ÷ SDK.

IUnknown - . IUnknown - , . IUnknown - , , ÷, IUnknown , - . ÷, ÷ ÷ vtbl , ÷ ÷ : QueryInterface , AddRef Release . ÷ ÷ vtbl , ÷ .

× IDL, IDL-, import , ÷ ø IDL- :

// calculator.idl 
[object, uuid(BDA4A270-A1BA-11dO-8C2C-0080C73925BA)] 
interface ICalculator : IUnknown { 
  import "unknwn.idl"; 
  // bring in def. of IUnknown 
  // импортируем определение IUnknown 
  HRESULT Clear(void); 
  HRESULT Add([in] long n); 
  HRESULT Sum([out, retval] long *pn);
}

import , , ø . ÷ import , IDL- . C/C++ ÷ /++- IDL-, ÷ ÷ , import IDL- #include ÷ /++-:

{% if main.adsdop %}{% include 'adsenceinline.tpl' %}{% endif %}
// calculator.h - generated by MIDL 
// calculator.h - генерированный MIDL 
// bring in def. of IUnknown 
// вводим определения IUnknown 
#include "unknwn.h" 
extern "C" const IID IID_ICalculator; 
interface ICalculator : public IUnknown { 
    virtual HRESULT STDMETHODCALLTYPE Clear(void) = 0; 
    virtual HRESULT STDMETHODCALLTYPE Add(long n) = 0; 
    virtual HRESULT STDMETHODCALLTYPE Sum(long *pn) = 0; 
}

MIDL -, ÷ GUID, IDL-:

// calculator_i.с - generated by MIDL 
const IID IID_ICalculator = 
{ 0xBDA4A270, 0xA1BA, 0x11d0, { 0x8C, 0x2C, 
  0x00, 0х80, 0хC7, 0х39, 0x25, 0xBA } };

, , calculator_i.c ( makefile ), ÷ calculator_i.c C++ . , IID_ICalculator 128- ÷ ÷ ø ø .

÷ , ÷ ÷ IUnknown . IDL :

import "unknwn.idl"; 
[object, uuid(DF12E151-A29A-11d0-8C2D-0080C73925BA)] 
interface IAnimal : IUnknown { 
    HRESULT Eat(void); 
} 

[object, uuid(DF12E152-A29A-11d0-8C2D-0080C73925BA)] 
interface ICat : IAnimal { 
    HRESULT IgnoreMaster(void); 
} 

[object, uuid(DF12E153-A29A-11d0-8C2D-0080C73925BA)] 
interface IDog : IAnimal {
    HRESULT Bark(void); 
} 

[object, uuid(DF12E154-A29A-11d0-8C2D-0080C73925BA)] 
interface IPug : IDog {
    HRESULT Snore(void); 
} 

[object, uuid(DF12E155-A29A-11d0-8C2D-0080C73925BA)] 
interface IOldPug : IPug {
    HRESULT SnoreLoudly(void); 
}

÷ : ÷ . :

[object, uuid(DF12E156-A29A-11d0-8C2D-0080C73925BA)] 
interface ICatDog : ICat, IDog { 
  // illegal, multiple bases 
  // неверно, несколько базовых интерфейсов 
    HRESULT Meowbark(void); 
}

÷. , ÷ ÷ C++ . ÷ ÷ , ÷. ÷ DCE RPC. ÷ DCE RPC ÷. , ÷, , . ÷, ÷ Cat/Dog - :

class CatDog : public ICat, public IDog { 
  // ... 
};

, Cat/Dog , QueryInterface . QueryInterface , Cat/Dog , . , ÷ ø ø ÷ .

÷, , . ÷, ÷ ÷ .

. 2.4. ÷

2.4 ÷ CatDog . , ÷ : ÷ , CatDog ÷ : ICat , IDog , IAnimal IUnknown .