OSDN Git Service

Allow NUL and \\.\NUL in paths specified as command line arguments (#2056)
[winmerge-jp/winmerge-jp.git] / Src / MergeAppCOMClass.h
1 #pragma once
2
3 #include <oleauto.h>
4
5 enum
6 {
7         DISPID_Translate = 1,
8         DISPID_GetOption = 2,
9         DISPID_SaveOption = 3,
10 };
11
12
13 template<class T>
14 class MyDispatch : public T, public IDispatch
15 {
16 public:
17         MyDispatch(INTERFACEDATA* idata, void* pThis)
18                 : m_cRef(0), m_pTypeInfo(nullptr)
19         {
20                 ITypeInfo* pTypeInfo = nullptr;
21                 if (SUCCEEDED(CreateDispTypeInfo(idata, LOCALE_SYSTEM_DEFAULT, &pTypeInfo)))
22                         m_pTypeInfo = pTypeInfo;
23         }
24
25         virtual ~MyDispatch()
26         {
27                 if (m_pTypeInfo)
28                         m_pTypeInfo->Release();
29         }
30
31         MyDispatch(const MyDispatch&) = delete;
32         MyDispatch& operator=(const MyDispatch&) = delete;
33
34         HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void** ppvObject) override
35         {
36                 return E_NOTIMPL;
37         }
38
39         ULONG STDMETHODCALLTYPE AddRef(void) override
40         {
41                 return InterlockedIncrement(&m_cRef);
42         }
43
44         ULONG STDMETHODCALLTYPE Release(void) override
45         {
46                 ULONG cRef = InterlockedDecrement(&m_cRef);
47                 if (cRef == 0)
48                         delete this;
49                 return cRef;
50         }
51
52         HRESULT STDMETHODCALLTYPE GetTypeInfoCount(UINT* pctinfo) override
53         {
54                 *pctinfo = 1;
55                 return S_OK;
56         }
57
58         HRESULT STDMETHODCALLTYPE GetTypeInfo(UINT iTInfo, LCID lcid, ITypeInfo** ppTInfo) override
59         {
60                 ppTInfo = &m_pTypeInfo;
61                 return S_OK;
62         }
63
64         HRESULT STDMETHODCALLTYPE GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames, UINT cNames, LCID lcid, DISPID* rgDispId) override
65         {
66                 return m_pTypeInfo->GetIDsOfNames(rgszNames, cNames, rgDispId);
67         }
68
69         HRESULT STDMETHODCALLTYPE Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS* pDispParams, VARIANT* pVarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr) override
70         {
71                 return m_pTypeInfo->Invoke(this, dispIdMember, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
72         }
73 protected:
74         ULONG m_cRef;
75         ITypeInfo* m_pTypeInfo;
76 };
77
78 struct IMergeApp : public IUnknown
79 {
80         virtual BSTR STDMETHODCALLTYPE Translate(BSTR text) = 0;
81         virtual VARIANT STDMETHODCALLTYPE GetOption(BSTR name, const VARIANT& varDefault) = 0;
82         virtual void STDMETHODCALLTYPE SaveOption(BSTR name, const VARIANT& varValue) = 0;
83 };
84
85 class MergeAppCOMClass : public MyDispatch<IMergeApp>
86 {
87 public:
88         MergeAppCOMClass();
89         MergeAppCOMClass(const MergeAppCOMClass&) = delete;
90         virtual ~MergeAppCOMClass();
91         MergeAppCOMClass& operator=(const MergeAppCOMClass&) = delete;
92
93         BSTR STDMETHODCALLTYPE Translate(BSTR text) override;
94         VARIANT STDMETHODCALLTYPE GetOption(BSTR name, const VARIANT& varDefault) override;
95         void STDMETHODCALLTYPE SaveOption(BSTR name, const VARIANT& varValue) override;
96 };
97