C:\home\SVGCats_src\src\Variant.h
1|/************************************************************************** 2| 1. <<< Variant 型 >>> 3|***************************************************************************/ 4| 5|#ifndef __VARIANT_H 6|#define __VARIANT_H 7| 8|#ifndef USES_PRIORITY_HEADER 9|/*[START_OF_PRIORITY_HEADER]*/ 10| 11|#ifndef USES_VARIANT 12|#define USES_VARIANT 13| 14|#include <KS.H> 15|#include <OLEAUTO.H> 16|//#include <atlconv.h> 17| 18|#endif 19| 20|/*[END_OF_PRIORITY_HEADER]*/ 21|#endif 22| 23| 24| 25|/*---------------------------------------------------------------------*/ 26|/* 2. <<< Interface Area --------------------------------------------->>> */ 27|/*---------------------------------------------------------------------*/ 28| 29|#ifdef __cplusplus 30| extern "C" { 31|#endif 32| 33| 34|/*********************************************************************** 35| 3. <<< [VARIANT] OLE 変数 >>> 36| 37|・Variant, Bool, BSTR, SAFEARRAY 38|・E:\Program Files\Microsoft Visual Studio\VC98\Include\OAIDL.H 39| 型情報: VARIANT(例:variant.parray) 40|・E:\Program Files\Microsoft Visual Studio\VC98\Include\KS.H 41| 型識別子: VARENUM 42|・E:\Program Files\Microsoft Visual Studio\VC98\Include\OLEAUTO.H 43| 操作情報: BSTR, Time, SafeArray, VARIANT, Vector, VARTYPE Coercion, 44| VARTYPE Math, Format, MISC, V_ISARRAY 45|・E:\Program Files\Microsoft Visual Studio\VC98\Include\WinERROR.H 46| エラーコード 47|・型IDの例: long=VT_I4 48| 49| 50|4. <<< I で始まる COM インターフェイスの使い方 >>> 51| 52| IInkOverlay* m_InkOverlay; 53| 54| CoInitialize( NULL ); // COM インターフェイス全般の初期化 55| hr = CoCreateInstance( CLSID_InkOverlay, NULL, CLSCTX_INPROC_SERVER, 56| IID_IInkOverlay, (void*)&m_InkOverlay ); 57| if ( hr != 0 ) error(); 58| 59|型, CLSID, IID は、SDKのヘッダファイルにあります。 CLSCTX は、そのままで構いません。 60| 61| hr = m_InkOverlay->put_hWnd( m_hWnd ); // インターフェイスが持っているメンバ関数 62| if ( hr != 0 ) error(); 63| m_InkOverlay->Release(); // 開放して終了 64| CoUninitialize(); // COM インターフェイス全般の後始末 65| 66|エラーコードは以下のヘッダ、または SDKに添付のヘッダを参照。 67|E:\Program Files\Microsoft Visual Studio\VC98\Include\WinERROR.h 68|************************************************************************/ 69| 70| 71|/*********************************************************************** 72| 5. <<< [Variant] VARIANT 任意型 >>> 73|************************************************************************/ 74|void Variant_initEmpty( VARIANT* ); 75|void Variant_finish( VARIANT* ); 76| 77| 78| 79|/*********************************************************************** 80| 6. <<< [Bool] 論理型、VT_BOOL >>> 81|【補足】 82|・値は、VARIANT_TRUE, VARIANT_FALSE です。 83| E:\Program Files\Microsoft Visual Studio\VC98\Include\WTYPES.H 84|************************************************************************/ 85|/* void Variant_setBool( VARIANT*, bool ); */ 86| 87|#ifdef VARIANT_USES_OLD_030329 88|#define Variant_Bool_True ((VARIANT_BOOL)-1) 89|#define Variant_Bool_False ((VARIANT_BOOL)0) 90|#endif 91| 92| 93|/*********************************************************************** 94| 7. <<< [BSTR] 文字列型 >>> 95|************************************************************************/ 96|/* BSTR s; */ 97|/* s = SysAllocString( OLESTR("abc") ); */ 98|/* SysFreeString( s ); */ 99| 100|void Variant_initBSTR( VARIANT* m, const unsigned short* value ); 101|BSTR Variant_refBSTR( VARIANT* m ); 102|char* Variant_refWCharP( VARIANT* m ); 103|int Variant_getStrlen( VARIANT* m ); 104|void Variant_setStrlen( VARIANT* m, int mWChar ); 105|void Variant_strcat( VARIANT* dst, VARIANT* plus ); 106| 107| 108|/*********************************************************************** 109| 8. <<< [SAFEARRAY] 配列型、VT_ARRAY, VT_VECTOR >>> 110|************************************************************************/ 111|void Variant_initArray( VARIANT* m, int typeID, int iStart, int iEnd ); 112|SAFEARRAY* Variant_refSAFEARRAY( VARIANT* m ); 113| 114|/* type* Variant_startAccess( VARIANT* m, type ); */ 115|void Variant_endAccess( VARIANT* m ); 116| 117| 118| 119|/* 以下は内部用です */ 120|void* Variant_startAccess_imp( VARIANT* m ); 121| 122| 123| 124|/*---------------------------------------------------------------------*/ 125|/* 9. <<< Mapping Area ----------------------------------------------->>> */ 126|/*---------------------------------------------------------------------*/ 127| 128| 129| 130|/*********************************************************************** 131| 10. <<< [Variant_initEmpty] 空で初期化する >>> 132|【引数】 133| ・VARIANT* m; Variant型 134|************************************************************************/ 135|#define Variant_initEmpty( m ) \ 136| VariantInit( m ) 137| 138| 139| 140|/*********************************************************************** 141| 11. <<< [Variant_finish] 後始末する >>> 142|【引数】 143| ・VARIANT* m; Variant型 144|************************************************************************/ 145|#define Variant_finish( m ) \ 146| VariantClear( m ) 147| 148| 149| 150|/*********************************************************************** 151| 12. <<< [Variant_initBool] 論理値を代入する >>> 152|【引数】 153| ・VARIANT* m; Variant型 154| ・bool value; 代入する値 155|************************************************************************/ 156|#define Variant_initBool( var, value ) \ 157| ( VariantInit( var ), \ 158| V_VT( var ) = VT_BOOL, \ 159| V_BOOL( var ) = ( value ? Variant_Bool_True : Variant_Bool_False ) ) 160| 161| 162| 163|/*********************************************************************** 164| 13. <<< [Variant_initBSTR] BSTR 型変数に代入する >>> 165|【引数】 166| ・VARIANT* m; Variant型 167| ・const unsigned short* value; 文字列値(UNICODE) 168|************************************************************************/ 169|#define Variant_initBSTR( m, value ) \ 170| ( VariantInit( m ), \ 171| (m)->vt = VT_BSTR, \ 172| Variant_refBSTR( m ) = SysAllocString( value ) ) 173| 174|/*********************************************************************** 175| 14. <<< [Variant_refBSTR] BSTR を参照する >>> 176|【引数】 177| ・VARIANT* m; Variant型 178| ・BSTR 返り値; BSTR の参照 179|************************************************************************/ 180|#define Variant_refBSTR( m ) \ 181| ( (m)->bstrVal ) 182| 183|/*********************************************************************** 184| 15. <<< [Variant_refWCharP] WCHAR* で参照する >>> 185|【引数】 186| ・VARIANT* m; Variant型 187| ・const unsigned short* 返り値; 先頭アドレス(UNICODE) 188|************************************************************************/ 189|#define Variant_refWCharP( m ) \ 190| ((const unsigned short*) (m)->bstrVal ) 191| 192| 193|/*********************************************************************** 194| 16. <<< [Variant_getStrlen] 文字の長さを返す >>> 195|【引数】 196| ・VARIANT* m; Variant型 197| ・int 返り値; 文字の長さ(L'\0'を含まない)、UNICODE なのでバイト数の半分 198|************************************************************************/ 199|#define Variant_getStrlen( m ) \ 200| ( (m)->vt == VT_BSTR ? SysStringLen( (m)->bstrVal ) : 0 ) 201| 202| 203|/*********************************************************************** 204| 17. <<< [Variant_setStrlen] 文字列の長さを修正する >>> 205|【引数】 206| ・VARIANT* m; Variant型 207| ・int mWChar; 文字数(バイト数の半分マイナス1) 208|************************************************************************/ 209|#define Variant_setStrlen( m, mWChar ) \ 210| SysReAllocStringLen( Variant_refBSTR(m), NULL, mWChar ) 211| 212|/*********************************************************************** 213| 18. <<< [Variant_strcat] 文字列を連結する >>> 214|【引数】 215| ・VARIANT* m; Variant型 216| ・VARIANT* plus; 追加する文字列の Variant 217|************************************************************************/ 218|#define Variant_strcat( dst, plus ) \ 219| VarBstrCat( Variant_refBSTR(dst), Variant_refBSTR(plus), \ 220| &Variant_refBSTR(dst) ) 221| 222|/*********************************************************************** 223| 19. <<< [Variant_initArray] 配列を確保する >>> 224|【引数】 225| ・VARIANT* m; Variant型 226| ・int typeID; 型ID、VT_I4 など 227| ・int iStart; 配列番号の最小値(通常1) 228| ・int iEnd; 配列の要素数(→補足) 229|************************************************************************/ 230|#define Variant_initArray( m, typeID, iStart, n ) \ 231| ( VariantInit( m ), \ 232| (m)->vt = VT_ARRAY | (typeID), \ 233| (m)->parray = SafeArrayCreateVector( typeID, iStart, n ), \ 234| (m)->parray == NULL ? error() : 0 ) 235| 236| 237| 238|/*********************************************************************** 239| 20. <<< [Variant_refSAFEARRAY] SAFEARRAY* 型を参照する >>> 240|************************************************************************/ 241|#define Variant_refSAFEARRAY( m ) \ 242| ((m)->parray) 243| 244| 245| 246|/*********************************************************************** 247| 21. <<< [Variant_startAccess] ポインタを使ってアクセスできるようにする >>> 248|【引数】 249| ・VARIANT* m; Variant型 250| ・type; 配列の型(int など) 251| ・type* 返り値; 配列の先頭アドレス 252|【補足】 253|・アクセスが終了したら、Variant_endAccess を呼び出してください。 254|************************************************************************/ 255|#define Variant_startAccess( m, type ) \ 256| ((type*)Variant_startAccess_imp( m )) 257| 258| 259| 260|/*********************************************************************** 261| 22. <<< [Variant_endAccess] ポインタを使ったアクセスを終了する >>> 262|【引数】 263| ・VARIANT* m; Variant型 264|【補足】 265|・参照:Variant_startAccess 266|************************************************************************/ 267|#define Variant_endAccess( m ) \ 268| ( SUCCEEDED( SafeArrayUnaccessData( (m)->parray ) ) ? 0 : error() ) 269| 270| 271| 272| 273|#ifdef __cplusplus 274| } /* extern "C" */ 275|#endif 276| 277|#endif 278| 279|