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: }