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 ÷ (÷ ).
{% 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 ÷, ÷ 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 ÷ CatDog . , ÷ : ÷ , CatDog ÷ : ICat , IDog , IAnimal IUnknown .