IDL. IDL , . 2.6 , IDL, , Java Visual Basic. . " " , , .
| IDL | Microsoft C++ | Visual Basic | Microsoft Java |
---|---|---|---|---|
| boolean | unsigned char | unsupported | char |
byte | unsigned char | unsupported | char | |
small | char | unsupported | char | |
short | short | Integer | short | |
long | long | Long | int | |
hyper | _int64 | unsupported | long | |
float | float | Single | float | |
double | double | Double | double | |
char | unsigned char | unsupported | char | |
wchar_t | wchar_t | Integer | short | |
enum | enum | Enum | int | |
Interface Pointer | Interface Pointer | Interface Ref. | Interface Ref. | |
| VARIANT | VARIANT | Variant | ms.com.Variant |
BSTR | BSTR | String | java.lang.String | |
VARIANT_BOOL | short [-1/0] | Boolean [True/False] | boolean [true/false] |
. 2.6.
OLECHAR. Windows NT, Windows 95, Win32s Solaris OLECHAR typedef wchar_t. . Win32 wchar_t 16- Unicode1. IDL , , , IDL [string], , - :
HRESULT Method([in, string] const OLECHAR *pwsz);
, OLECHAR, OLESTR, L , , wchar_t. , OLECHAR :
const OLECHAR *pwsz = OLESTR("Hello");
Win32 Solaris
const wchar_t *pwsz = L"Hello";
, .
wchar_t char, :
size_t mbstowcs(wchar_t *pwsz, const char *psz, int cch); size_t wcstombs(char *psz, const wchar_t *pwsz, int cch);
- strncpy, , . , , OLECHAR, , char:
class BigDog : public ILabrador { char m_szName[1024] ; public: STDMETHODIMP SetName(/* [in,string]*/ const OLECHAR *pwsz) { HRESULT hr = S_OK; size_t cb = wcstombs(m_szName, pwsz, 1024); // check for buffer overflow or bad conversion // if (cb == sizeof(m_szName) || cb == (size_t)-1) { m_szName[0] = 0; hr = E_INVALIDARG; } return hr; } };
, , . ( ) OLECHAR TCHAR Win32. OLECHAR char wchar_t, :
class BigDog : public ILabrador { TCHAR m_szName[1024]; // note TCHAR-based string // TCHAR public: STDMETHODIMP SetName( /*[in,string]*/ const OLECHAR *pwsz) { HRESULT hr = S_OK; #ifdef UNICODE // Unicode build (TCHAR == wchar_t) // Unicode (TCHAR == wchar_t) wcsncpy(m_szName, pwsz, 1024); // check for buffer overflow // if (m_szName[1023] != 0) { m_szName[0] = 0; hr = E_INVALIDARG; } #else // Non-Unicode build (TCHAR == char) // Unicode (TCHAR == char) size_t cb = wcstombs(m_szName, pwsz, 1024); // check for buffer overflow or bad conversion // if (cb == sizeof(m_szName) || cb == (size_t)-1) { m_szName[0] =0; hr = E_INVALIDARG; } #endif return hr; } };
, OLECHAR TCHAR . , , Win32.
C++ , . ustring.h , , string.h. , strncpy , , (wchar_t char):
// from ustring.h (book-specific header) // ustring.h ( , ) inline bool ustrncpy(char *p1, const wchar_t *p2, size_t c) { size_t cb = wcstombs(p1, p2, c); return cb != c && cb != (size_t)-1; }; inline bool ustrncpy(wchar_t *p1, const wchar_t *p2, size_t c) { wcsncpy(p1, p2, c); return p1[c - 1] == 0; }; inline bool ustrncpy(char *p1, const char *p2, size_t c) { strncpy(p1, p2, c); return p1[c - 1] == 0; }; inline bool ustrncpy(wchar_t *p1, const char *p2, size_t c) { size_t cch = mbstowcs(p1, p2, c); return cch != c && cch != (size_t)-1; }
, ustrncpy, , . (inline) , . :
class BigDog : public ILabrador { TCHAR m_szName[1024]; // note TCHAR-based string // TCHAR public: STDMETHODIMP SetName(/* [in,string] */ const OLECHAR *pwsz) { HRESULT hr = S_OK; // use book-specific overloaded ustrncpy to copy or convert // // ustrncpy, if (!ustrncpy(m_szName, pwsz, 1024)) { m_szName[0] = 0; hr = E_INVALIDARG; } return hr; } };
strlen, strcpy strcat ustring.h.
, , , . , API- Win32, . , IID:
HRESULT IIDFromHWND(HWND hwnd, IID& riid) { TCHAR szEditText[1024]; // call a TCHAR-based Win32 routine // TCHAR- Win32 GetWindowText(hwnd, szEditText, 1024); // call an OLECHAR-based routine // OLECHAR- return IIDFromString(szEditText, &riid); }
, - UNICODE; , TCHAR OLECHAR wchar_t . Win32 API, Unicode, TCHAR char, IIDFromString . , :
HRESULT IIDFromHWND(HWND hwnd, IID& riid) { TCHAR szEditText[1024]; GetWindowText(hwnd, szEditText, 1024); #ifdef UNICODE return IIDFromString(szEditText, &riid); #else OLECHAR wszEditText[l024]; ustrncpy(wszEditText, szEditText, 1024); return IIDFromString(wszEditText, &riid); #endif }
, , . , (shim) , . , : const char * const wchar_t *. , , . . ustring.h : _U _UNCC. ; , const2 ( IIDFromString). :
HRESULT IIDFromHWND(HWND hwnd, IID& riid) { TCHAR szEditText[1024]; GetWindowText(hwnd, szEditText, 1024); // use _UNCC shim class to convert if necessary // _UNCC, // return IIDFromString(_UNCC(szEditText), &riid); }
, . Win32 Unicode, _UNCC . Win32, Unicode, _UNCC Unicode. _UNCC , 3.
, , BSTR. BSTR , Visual Basic Java. BSTR OLECHAR- (length-prefix) . , ( ) , . 2.7 BSTR "Hi". BSTR , BSTR , . API- BSTR:
// from oleauto.h // allocate and initialize a BSTR // BSTR BSTR SysAllocString(const OLECHAR *psz); BSTR SysAllocStringLen(const OLECHAR *psz, UINT cch); // reallocate and initialize a BSTR // BSTR INT SysReAllocString(BSTR *pbstr, const OLECHAR *psz); INT SysReAllocStringLen(BSTR *pbstr, const OLECHAR * psz, UINT cch); // free a BSTR // BSTR void SysFreeString(BSTR bstr); // peek at length-prefix as characters or bytes // UINT SysStringLen(BSTR bstr); UINT SysStringByteLen(BSTR bstr);
[in] , SysAllocString , , SysFreeString , . :
HRESULT SetString([in] BSTR bstr);
, OLECHAR, , BSTR , :
// convert raw OLECHAR string to a BSTR // " " OLECHAR BSTR BSTR bstr = SysAllocString(OLESTR("Hello")); // invoke method // HRESULT hr = p->SetString(bstr); // free BSTR // BSTR SysFreeString(bstr);
BSTR, _UBSTR, ustring.h:
// from ustring.h (book-specific header file) // ustring.h ( ) class _UBSTR { BSTR m_bstr; public: _UBSTR(const char *psz) : m_bstr(SysAllocStringLen(0, strlen(psz))) { mbstowcs(m_bstr, psz, INT_MAX); } _UBSTR(const wchar_t *pwsz) : m_bstr(SysAllocString(pwsz)) { } operator BSTR (void) const { return m_bstr; } ~_UBSTR(void) { SysFreeString(m_bstr); } };
:
// invoke method // HRESULT hr = p->SetString(_UBSTR(OLESTR("Hello")));
, UBSTR char wchar_t.
[out] SysAllocString, . SysFreeString. :
HRESULT GetString([out, retval] BSTR *pbstr);
BSTR- :
STDMETHODIMP MyClass::GetString(BSTR *pbstr) { *pbstr = SysAllocString(OLESTR("Coodbye!")) ; return S_OK; }
, :
extern OLECHAR g_wsz[]; BSTR bstr = 0; HRESULT hr = p->GetString(&bstr); if (SUCCEEDED(hr)) { wcscpy(g_wsz, bstr); SysFreeString(bstr); }
BSTR. BSTR , . , . wcscpy:
wcscpy(g_wsz, bstr);
:
wcscpy (g_wsz, bstr ? bstr : OLESTR(""));
BSTR ustring.h :
intline OLECHAR *SAFEBSTR(BSTR b) { return b ? b : OLESTR(""); }
BSTR , .
, . 2.6, . IDL (tag namespace). , IDL- (typedef):
typedef struct tagCOLOR { double red; double green; double blue; } COLOR; HRESULT SetColor([in] const COLOR *pColor);
struct :
struct COLOR { double red; double green; double blue; }; HRESULT SetColor([in] const struct COLOR *pColor);
. , , Visual Basic, Java. , , Visual Basic , , , .
IDL (unions). IDL , (discriminator), , . (integral type) , . , (nonencapsulated):
union NUMBER { [case(1)] long i; [case(2)] float f; };
[case] . , [switch_is]:
HRESULT Add([in, switch_is(t)] union NUMBER *pn, [in] short t);
, (aggregate type) , (discriminated union):
struct UNUMBER { short t; [switch_is(t)] union VALUE { [case(1)] long i; [case(2)] float f; }; };
Visual Basic . VARIANT4 , IDL. :
VT_EMPTY nothing VT_NULL SQL style Null VT_I2 short VT_I4 long VT_R4 float VT_R8 double VT_CY CY (64-bit currency) VT_DATE DATE (double) VT_BSTR BSTR VT_DISPATCH IDispatch * VT_ERROR HRESULT VT_BOOL VARIANT_BOOL (True=-1, False=0) VT_VARIANT VARIANT * VT_UNKNOWN IUnknown * VT_DECIMAL 16 byte fixed point VT_UI1 opaque byte
, , (variant) :
VT_ARRAY , SAFEARRAY VT_BYREF ,
API- VARIANT:
// initialize a variant to empty // void VariantInit(VARIANTARG * pvarg); // release any resources held in a variant // , HRESULT VariantClear(VARIANTARG * pvarg); // deep-copy one variant to another // HRESULT VariantCopy(VARIANTARG * plhs, VARIANTARG * prhs); // dereference and deep-copy one variant into another // HRESULT VariantCopyInd(VARIANT * plhs, VARIANTARG * prhs); // convert a variant to a designated type // HRESULT VariantChangeType(VARIANTARG * plhs, VARIANTARG * prhs, USHORT wFlags, VARTYPE vtlhs); // convert a variant to a designated type // ( ) HRESULT VariantChangeTypeEx(VARIANTARG * plhs, VARIANTARG * prhs, LCID lcid, USHORT wFlags, VARTYPE vtlhs);
VARIANT' . , API- , , VARIANT [in]- :
HRESULT UseIt([in] VARIANT var);
, :
VARIANT var; VariantInit(&var); // initialize VARIANT // VARIANT V_VT(&var) = VT_I4; // set discriminator // V_I4(&var) = 100; // set union // HRESULT hr = pItf->UseIt(var); // use VARIANT // VARIANT VariantClear(&var); // free any resources in VARIANT // VARIANT
, (accessor) VARIANT.
V_VT(&var) = VT_I4; V_I4(&var) = 100;
, :
var.vt = VT_I4; var.lVal = 100;
, - , .
, VARIANT :
STDMETHODIMP MyClass::UseIt( /*[in] */ VARIANT var) { // declare and init a second VARIANT // VARIANT VARIANT var2; VariantInit(&var2); // convert var to a BSTR and store it in var2 // BSTR var2 HRESULT hr = VariantChangeType(&var2, &var, 0, VT_BSTR); // use the string // if (SUCCEEDED(hr)){ ustrcpy(m_szSomeDataMember, SAFEBSTR(V_BSTR(&var2))); // free any resources held by var2 // , var2 VariantClear(&var2); } return hr; }
, API- VariantChangeType VARIANT ( BSTR).
, , . . , :
HRESULT GetObject([out] IDog **ppDog);
, . IDL [iid_is]:
HRESULT GetObject([in] REFIID riid, [out, iid_is(riid)] IUnknown **ppUnk);
, - QueryInterface:
HRESULT GetObject([in] REFIID riid, [out, iid_is(riid)] void **ppv);
[iid_is] [in], [out] IUnknown * void *. , IID :
IDog *pDog = 0; HRESULT hr = pItf->GetObject(IID_IDog, (void**)&pDog);
QueryInterface :
STDMETHODIMP Class::GetObject(REFIID riid, void **ppv) { extern IUnknown * g_pUnkTheDog; return g_pUnkTheDog->QueryInterface(riid, ppv); }
IUnknown.
1 OLECHAR TCHAR, Wn32 API, (CHAR WCHAR). , UNICODE, .
2 _UNCC _U wchart * char *. , , , . , API , _UNCC .
3 ustring.h , ATL MFC , ll . .
4 VARIANTARG. VARIANTARG , . VARIANT , . VARIANTARG VARIANT, .