Flylib.com

Books Software

 
 
 

Essential COM - page 20

?

÷ C++ , ÷ . ø ÷ Dynamic Link Library (DLL) ÷ . ÷ , ÷ ÷ . , , vptr vtbl . ÷ ÷ LoadLibrary GetProcAddress . , RTTI- ÷ , . ø , .

÷, ÷ ( Component Object Model - ).

void *pv = malloc(sizeof(int)); 
int *pi = (int*)pv; 
(*pi)++; 
free(pv);

,1982

C++, ÷ , . ÷ , . ÷ ÷ , , ø ÷ ÷ ÷ ÷ . - , .


IDL

IDL
IUnknown
IUnknown
IUnknown
IUnknown

QueryInterface


÷
?

÷ . , ( level of indirection ), ÷ . , ø . , , DLL C++, .

, ÷ ÷ ÷ . , ÷ C++, ÷ ÷ ø C++. , , ÷ . , , ÷ ÷ , - . ÷ ÷ , .

, . C++ ÷ C++. , ÷ , ÷ , ÷ - , . , ÷ ÷, , , ÷ . C++ , ÷ C++.

C++ - ÷ ÷ , , ø . ÷ , ø ÷ , C++ . ÷ ÷ vptr/vtbl , ø .

÷ , - , ÷ ÷ . , C++ ÷ . ÷ , (back-end generator). ÷, , ÷ ø .

, C++ ÷, ÷ . ÷ ø , . , : ( caller ) ( callee ) - C++, ÷ . , ÷ , - , , - . ÷ , ÷ ÷ . , ø , ÷ . (Interface Definition Language - IDL ).

IDL

IDL ÷ ÷ ÷ - Open Software Foundation Distributed Computing Environment Remote Procedure Call (OSF DCE RPC). DCE IDL . IDL , ÷ ( transparently ), , . IDL ø, ÷ , DCE IDL - (, , ). ÷, ÷ ÷ 1 ÷ ø, - MS-RPC ( DCE RPC, ÷ Windows NT Windows 95) .

Win32 SDK ÷ IDL. , IDL - (artifacts). . 2.1, MIDL C/C++ ÷ , , , IDL-.

. 2.1. midl

÷ , (structure-based definitions), - , IDL, ÷ . , ÷ MIDL ÷ /++- ÷ , ÷, ÷ - C++ ÷. ÷ ÷ , . MIDL , ÷ , ø. 5. , MIDL ÷ , , , , IDL-, . ÷ ( type library ) IDL . ÷ ÷ , Visual Basic, Java, Object Pascal , .

× IDL, ÷ ÷ . ÷ . , , ÷ ÷ ÷ . ÷ ÷ (, vtbl , ). ÷ (, , ) .

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

[ 
    v1_enum, helpstring("This is a color!") 
] 
 enum COLOR { RED, GREEN, BLUE };

v1_enum ÷ (enumeration) COLOR. IDL , ÷ COLOR ÷ ÷ ÷ 32 , 16, ÷. helpstring LR "This is a color!" (" - !") ÷. IDL-, , . IDL , , , ÷, ( typedef ) - , ÷ .

IDL, ÷ , - - ÷ . [in] [out] :

void Method1([in] long arg1, [out] long *parg2, [in, out] long *parg3);

IDL , ÷ ÷ arg1 , parg3 . ø ÷ ÷ , parg2 parg3 . ÷, ÷ :

long arg2 = 20, arg3 = 30; 
p->Method1(10, &arg2, &arg3);

÷ ÷ 20 ÷ parg2 . , ÷ , ÷ C++, *parg2 ÷ 20 . ÷ , ÷ ÷ ÷ ( out-only ) , .


1 (execution context) , ÷ , ÷ (apartment). - ; . 5.

- , ÷ ÷ . , ÷ ø RESULT . COM- , ø , ÷ RPC-ø. ÷ RESULT 32- ÷, ø, (, ø , ). , (, Visual Basic, Java), HRESULT -÷ ø ÷ (programmatic exceptions).

. 2.2. hresult

. 2.2, HRESULT-÷ : ø (severity bit), . ø , ø , , HRESULT , ÷ . SDK (software development kit - ÷) , ÷ HRESULT:

#define SUCCEEDED(hr) (long(hr) >= 0)
#def1ne FAILED(hr)    (long(hr) < 0)

, ÷ RESULT ÷ ø .

SDK HRESULT . HRESULT ÷ , HRESULT , :

<facility>_<severity>_<information>

, HRESULT STG_S_CONVERTED , ÷ FACILITY_STORAGE . ÷, ÷ (Structured Storage) (Persistence). ø - SEVERITY_SUCCESS . ÷, ÷ ø . - CONVERTED - ÷, ÷ ÷ . HRESULT -÷, , FACILITY_NULL , ÷ . HRESULT FACILITY_NULL :

S_OK - успешная нормальная операция 
S_FALSE - используется для возвращения логического false в случае успеха 
E_FAIL - общий сбой 
E_NOTIMPL - метод не реализован 
E_UNEXPECTED - метод вызван в неподходящее время

FACILITY_ITF ÷ HRESULT HRESULT , . ÷ FACILITY_ITF . MAKE_HRESULT HRESULT :

const HRESULT CALC_E_IAMHOSED = 
                MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, 0х200 + 15);

HRESULT ø, ÷ ÷ ø 0200 , ÷ ÷, HRESULT -÷. , ÷, . , ø HRESULT , ÷ API FormatMessage . HRESULT , ÷, , , ÷ ø ÷.

× ÷ , ø ÷ HRESULT -÷, IDL retval . retval , ÷ ÷ ÷ , , . IDL- :

HRESULT Method2([in] short arg1, [out, retval] short *parg2);

Java :

public short Method2(short arg1);

Visual Basic :

Function Method2(arg1 as Integer) As Integer

C++ -, Microsoft C++ :

virtual HRESULT _stdcall Method2(short arg1, short *parg2) = 0;

÷, ÷ C++:

short sum = 10; 
short s; 
HRESULT hr = pItf->Method2(20, &s); 
if (FAILED(hr)) 
  throw hr; 
sum += s;

Java-:

short sum == 10; 
short s = Itf.Method2(20); 
sum += s;

HRESULT , , , Java Virtual Machine HRESULT ÷ Java. C++ ÷ HRESULT , , .