Essential COM

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:

 . 2.7.  "hi"   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, .



Suschnost' tehnologii SOM
Essential COM
ISBN: 0201634465
EAN: 2147483647
Year: N/A
Pages: 103
Authors: Don Box

flylib.com © 2008-2017.
If you may any questions please contact us: flylib@qtcs.net