÷ 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++, ÷ , . ÷ , . ÷ ÷ , , ø ÷ ÷ ÷ ÷ . - , .
÷ . , ( 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 ÷ ÷ ÷ - Open Software Foundation Distributed Computing Environment Remote Procedure Call (OSF DCE RPC). DCE IDL . IDL , ÷ (
Win32 SDK ÷ IDL. , IDL - (artifacts). . 2.1, MIDL C/C++ ÷ , , , IDL-.
÷ , (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-÷ : ø (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 , , .