List 2-21 CDictionary.cpp全ソースリスト

  1: // CDictionaryCOM.cpp : コンソール アプリケーション用のエントリ ポイントの定義
  2: //
  3: // Programmed by TANAKA,Shozo,1999/09/30
  4: 
  5: #include "stdafx.h"
  6: 
  7: #define HRESULT long
  8: #defineULONGunsigned long
  9: #define PLONGunsigned long*
 10: #define DWORDunsigned long
 11: #define WORDunsigned short
 12: #define BYTEunsigned char
 13: #define BOOLlong
 14: 
 15: typedef struct  _GUID
 16: {
 17:     DWORDData1;
 18:     WORDData2;
 19:     WORDData3;
 20:     BYTEData4[8];
 21: }GUID;
 22: 
 23: typedef GUID CLSID;
 24: typedef GUID IID;
 25: #define REFCLSIDconst CLSID &
 26: #define REFIIDconst IID &
 27: 
 28: // Unknownインターフェースの定義
 29: // IID_IUnknown {00000000-0000-0000-C000-000000000046}
 30: static const IID IID_IUnknown = 
 31: { 0x00000000, 0x0000, 0x0000, { 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46 } };
 32: 
 33: // IUnknownインターフェースの定義
 34: class IUnknown
 35: {
 36: public:
 37:     virtual HRESULT  __stdcallQueryInterface(REFIID riid, void** ppvObj) = 0;
 38:     virtual ULONG __stdcallAddRef() = 0;
 39:     virtual ULONG __stdcallRelease() = 0;
 40: };
 41: 
 42: // GUIDGEN.EXEを使ってIDictionaryインターフェース用のIIDを生成する
 43: // IID_IDictionary {48CAC0E1-58D2-11d3-B169-000021C38DD8}
 44: static const IID IID_IDictionary = 
 45: { 0x48cac0e1, 0x58d2, 0x11d3, { 0xb1, 0x69, 0x0, 0x0, 0x21, 0xc3, 0x8d, 0xd8 } };
 46: 
 47: // GUIDGEN.EXEを使ってCDictionaryクラス用のCLSIDを生成する
 48: // CLSID_Dictionary {48CAC0E1-58D2-11d3-B169-000021C38DD9}
 49: static const CLSID CLSID_CDictionary = 
 50: { 0x48cac0e1, 0x58d2, 0x11d3, { 0xb1, 0x69, 0x0, 0x0, 0x21, 0xc3, 0x8d, 0xd9 } };
 51: 
 52: 
 53: // IDictionaryインターフェースの定義
 54: class IDictionary  : public IUnknown
 55: {
 56: public:
 57: virtual HRESULT__stdcall LookupWord(char* lpszEword, char* lpszJword, BOOL* pbResult) = 0;
 58: };
 59: 
 60: struct EJ_Dictionary {
 61: char Eword_dic[10];// 英単語
 62: char Jword_dic[10]; // 和単語
 63: } dic[] = {{"pen","ペン"}, {"pencil","鉛筆"},{"book","本"}};
 64: 
 65: // CDictionaryクラスの定義
 66: class CDictionary : public IDictionary
 67: {
 68: private:
 69: ULONGm_dwRef;// 参照カウント
 70: intm_nWord;// 単語数
 71: public:
 72: HRESULT __stdcallQueryInterface(REFIID iid, void** ppvObj);
 73:     ULONG__stdcallAddRef();
 74:     ULONG__stdcallRelease();
 75: HRESULT__stdcallLookupWord(char* lpszEword, char* lpszJword, BOOL* pbResult);
 76: CDictionary() : m_dwRef(0) { 
 77: // 辞書の単語の個数を算出する
 78: m_nWord = sizeof(dic)/sizeof(EJ_Dictionary);
 79: }
 80: ~CDictionary() { }
 81: };
 82: 
 83: #include "string.h"
 84: #defineTRUE1
 85: #defineFALSE0
 86: #defineS_OK0
 87: #define S_FALSE1
 88: #define FOUNDTRUE
 89: #define NotFOUNDFALSE
 90: #define E_NOINTERFACE0x80000004L
 91: #define REFGUIDconst GUID &
 92: #define IsEqualIID(riid1, riid2) IsEqualGUID(riid1, riid2)
 93: 
 94: BOOL  IsEqualGUID(REFGUID rguid1, REFGUID rguid2)
 95: {
 96:    return (
 97:       ((PLONG) &rguid1)[0] == ((PLONG) &rguid2)[0] &&
 98:       ((PLONG) &rguid1)[1] == ((PLONG) &rguid2)[1] &&
 99:       ((PLONG) &rguid1)[2] == ((PLONG) &rguid2)[2] &&
100:       ((PLONG) &rguid1)[3] == ((PLONG) &rguid2)[3]);
101: }
102: 
103: 
104: HRESULT __stdcall CDictionary::QueryInterface(REFIID riid, void** ppvObj) 
105: { 
106: if (IsEqualIID(riid ,IID_IUnknown)) // if (!memcmp(&riid ,&IID_IUnknown,sizeof(GUID)))
107: // Unknownインターフェースのアドレスを*ppvObjに設定する
108:         *ppvObj = static_cast(this);
109: // *ppvObj = (IUnknown*)this;
110: else if(IsEqualIID(riid ,IID_IDictionary))
111: // IDictionaryインターフェースのアドレスを*ppvObjに設定する
112: *ppvObj = this;
113: else
114: {
115: // インターフェースが見つからない場合
116: *ppvObj = NULL;
117: return E_NOINTERFACE;
118:     }
119: // インターフェースが見つかったときには参照カウントを増やす
120: AddRef();
121: return S_OK;
122: }
123: 
124: ULONG CDictionary::AddRef() 
125: {
126: // 参照カウントを増やす
127: m_dwRef++;
128:     return m_dwRef; 
129: }
130: 
131: ULONG CDictionary::Release() 
132: {
133: // 参照カウントを減らす
134: m_dwRef--;
135:     if (m_dwRef == 0) 
136:     {
137: // 参照カウントが0の場合はCDictionaryオブジェクトを破棄する
138:         delete this; 
139:         return 0;
140:     }
141:     return m_dwRef;
142: }
143: 
144: 
145: HRESULT __stdcall CDictionary::LookupWord(char* lpszEword, char* lpszJword, BOOL* pbResult)
146: {
147: for(int i=0; i(this);
189: // *ppvObj = (IClassFactory*)this;と同じ
190: else
191: {
192: // インターフェースが見つからない場合
193: *ppvObj = NULL;
194: return E_NOINTERFACE;
195:     }
196: // インターフェースが見つかったときには参照カウントを増やす
197: AddRef();
198: return S_OK;
199: }
200: 
201: ULONG __stdcall CClassFactory::AddRef() 
202: {
203: // 参照カウントを増やす
204:     m_dwRef++;
205: return m_dwRef;
206: }
207: 
208: ULONG __stdcall CClassFactory::Release() 
209: {
210: // 参照カウントを減らす
211: m_dwRef--;
212:     if (m_dwRef == 0) 
213:     {
214: // 参照カウントが0の場合はClassFactoryオブジェクトを破棄する
215:         delete this; 
216:         return 0;
217:     }
218:     return m_dwRef;
219: }
220: 
221: #define E_OUTOFMEMORY0x8007000EL
222: 
223: HRESULT __stdcall CClassFactory::CreateInstance(IUnknown* pUnknownOuter, REFIID riid, void** ppvObj)
224: {
225: HRESULT hr;// メソッドの実行結果を保持する
226: 
227: // CDictionaryオブジェクトを生成する
228: CDictionary *pCDictionary = new CDictionary;
229: if ( pCDictionary == NULL)
230: return E_OUTOFMEMORY;
231: // インターフェースを取得する
232: hr = pCDictionary->QueryInterface(riid,ppvObj);
233: // インターフェースを取得できない場合はCDictionaryオブジェクトを解放する
234: if( hr != S_OK)
235: pCDictionary->Release();
236: return hr;
237: }
238: 
239: // プロトタイプを宣言する
240: HRESULT GetClassObject(REFCLSID clsid, REFIID riid, void** ppvObj);
241: 
242: HRESULT  GetClassObject(REFCLSID clsid, REFIID riid, void** ppvObj)
243: {
244: HRESULT hr;// メソッドの実行結果を保持する
245: 
246: // ClassFactoryオブジェクトを生成する
247: CClassFactory *pClassFactory = new CClassFactory;
248: if( pClassFactory == NULL)
249: return E_OUTOFMEMORY;
250: // インターフェースのアドレスを取得する
251: hr = pClassFactory->QueryInterface(riid,ppvObj);
252: // インターフェースを取得できない場合はClassFactoryオブジェクトを解放する
253: if( hr != S_OK)
254: pClassFactory->Release();
255: return hr;
256: }
257: 
258: void  main(int argc, char* argv[])
259: {
260: HRESULT hr;// メソッドの実行結果を保持する
261: BOOL bResult;// 辞書の検索結果を保持する
262: 
263: IUnknown* pIUnknown;// IUnknownインターフェースへのポインタ
264: IClassFactory* pIClassFactory;// IClassFactoryインターフェースへのポインタ
265: IDictionary* pIDictionary;// IDictionaryインターフェースへのポインタ
266: 
267: char lpszEword[] = "pencil";// 検索する英単語
268: char lpszJword[10];// 和単語
269: 
270: // IClassFactoryインターフェースへのポインタを取得する
271: GetClassObject(CLSID_CDictionary,IID_IClassFactory,(void**)&pIClassFactory);
272: 
273: // IUnknownインターフェースへのポインタを取得する
274: hr = pIClassFactory->CreateInstance(NULL,IID_IUnknown,(void**)&pIUnknown);
275: 
276: // IDictionaryインターフェースへのポインタを取得する
277: hr = pIUnknown->QueryInterface(IID_IDictionary,(void**)&pIDictionary);
278: 
279: // LookupWordメソッドを呼び出す
280: pIDictionary->LookupWord(lpszEword,lpszJword,&bResult);
281: if( bResult == FOUND )
282: printf("%s は %s です。\n",lpszEword,lpszJword);
283: else
284: printf("%s は見つかりません。\n",lpszEword);
285: 
286: // IDictionaryインターフェースを解放する
287: pIDictionary->Release();
288: 
289: // IUnknownインターフェースを解放する
290: pIUnknown->Release();
291: 
292: // IClassFactoryインターフェースを解放する
293: pIClassFactory->Release();
294: }