OSDN Git Service

CLSIDの変更
[seraphyscrtools/SeraphyScriptTools.git] / Instance.cpp
1 // Instance.cpp : CInstance \82Ì\83C\83\93\83v\83\8a\83\81\83\93\83e\81[\83V\83\87\83\93
2
3 #include "stdafx.h"
4 #include "SeraphyScriptTools.h"
5 #include "Instance.h"
6 #include "profilesection.h"
7
8 /////////////////////////////////////////////////////////////////////////////
9 // CInstance
10
11 HRESULT CInstance::FinalConstruct()
12 {
13         HRESULT hr;
14
15         // \83\81\83C\83\93\83E\83B\83\93\83h\83E\82Ì\90\90¬
16         m_pMainWindow = NULL;
17         if (FAILED(hr = CComObject<COverlappedWindow>::CreateInstance(&m_pMainWindow))) {
18                 ATLASSERT(SUCCEEDED(hr));
19                 return hr;
20         }
21         m_pMainWindow->AddRef(); // \83C\83\93\83X\83^\83\93\83X\95Ï\90\94\82É\95Û\8e\9d\82·\82é\8eQ\8fÆ\83J\83E\83\93\83^+1
22
23         // \83R\83\82\83\93\83_\83C\83A\83\8d\83O\83C\83\93\83^\81[\83t\83F\83C\83X\82Ì\90\90¬
24         m_pCommDlg = NULL;
25         if (FAILED(hr = CComObject<CCommDialog>::CreateInstance(&m_pCommDlg))) {
26                 ATLASSERT(SUCCEEDED(hr));
27                 // \83\81\83C\83\93\83E\83B\83\93\83h\83E\82Í\94j\8aü\82·\82é.
28                 m_pMainWindow->Release();
29                 return hr;
30         }
31         m_pCommDlg->AddRef();
32
33         // \83\81\83C\83\93\83E\83B\83\93\83h\83E\82ð\83R\83\82\83\93\83_\83C\83A\83\8d\83O\83C\83\93\83^\81[\83t\83F\83C\83X\82É\90Ú\91±\82·\82é
34         CComPtr<IUnknown> pUnk;
35         if (FAILED(hr = m_pMainWindow->QueryInterface(&pUnk))) {
36                 m_pCommDlg->Release();
37                 m_pMainWindow->Release();
38                 return hr;
39         }
40
41         CComVariant varUnk(pUnk);
42         m_pCommDlg->SetMainWindow(varUnk);
43
44         // \83I\81[\83o\81[\83\89\83b\83v\83E\83B\83\93\83h\83E\83\8a\83X\83g\82É\92Ç\89Á\82·\82é\8eQ\8fÆ\83J\83E\83\93\83^+1
45         m_pMainWindow->AddRef();
46         m_lstOverlappedWnd.push_back(m_pMainWindow);
47
48         // \83E\83F\83C\83g\83J\81[\83\\83\8b\81E\83J\83E\83\93\83g
49         m_dWaitCursor = 0;
50
51         return S_OK;
52 }
53
54 void CInstance::FinalRelease()
55 {
56         ATLTRACE("CInstance::FinalRelease\r\n");
57
58         // \83\81\83C\83\93\83E\83B\83\93\83h\83E\82Ì\89ð\95ú
59         ATLTRACE(_TEXT("*refcount=%d\n"), m_pMainWindow->m_dwRef);
60         if (m_pMainWindow) {
61                 m_pMainWindow->Release();
62                 //m_pMainWindow = NULL;
63         }
64
65         // \83R\83\82\83\93\83_\83C\83A\83\8d\83O\83C\83\93\83^\81[\83t\83F\83C\83X\82Ì\89ð\95ú
66         ATLTRACE(_TEXT("*refcount=%d\n"), m_pMainWindow->m_dwRef);
67         if (m_pCommDlg) {
68                 m_pCommDlg->Release();
69                 m_pCommDlg = NULL;
70         }
71
72         // \83|\83b\83v\83A\83b\83v\83E\83B\83\93\83h\83E\82Ì\89ð\95ú
73         ATLTRACE(_TEXT("*refcount=%d\n"), m_pMainWindow->m_dwRef);
74         std::list<CComObject<COverlappedWindow>*>::iterator p = m_lstOverlappedWnd.begin();
75         while (p != m_lstOverlappedWnd.end()) {
76                 (*p)->Close();
77                 (*p)->Release();
78                 p = m_lstOverlappedWnd.erase(p);
79         }
80 }
81
82 STDMETHODIMP CInstance::get_Dialog(VARIANT *pVal)
83 {
84         if (!pVal) {
85                 return E_POINTER;
86         }
87         // \83R\83\82\83\93\83_\83C\83A\83\8d\83O\83C\83\93\83^\81[\83t\83F\83C\83X\82ð\95Ô\82·
88         ::VariantInit(pVal);
89         if (m_pCommDlg) {
90                 HRESULT hr;
91                 CComPtr<IUnknown> pUnk;
92                 if (FAILED(hr = m_pCommDlg->QueryInterface(&pUnk))) {
93                         return hr;
94                 }
95                 pVal->vt = VT_UNKNOWN;
96                 pVal->punkVal = pUnk.Detach();
97         }
98         return S_OK;
99 }
100
101 void CInstance::PurgeUnusedWindows()
102 {
103         // \8eQ\8fÆ\83J\83E\83\93\83g\82ª1\82Â\82µ\82©\82È\82¢\83E\83B\83\93\83h\83E\82Ì\94j\8aü\82ð\8ds\82¤
104         std::list<CComObject<COverlappedWindow>*>::iterator p = m_lstOverlappedWnd.begin();
105         while (p != m_lstOverlappedWnd.end()) {
106                 if ((*p)->m_dwRef == 1) {
107                         // \8eQ\8fÆ\83J\83E\83\93\83g\82ª1\82µ\82©\82È\82¢ = \82±\82Ì\83N\83\89\83X\82µ\82©\8eg\82Á\82Ä\82¢\82È\82¢ = \95s\97v
108                         BOOL bVisible = false;
109                         HRESULT hr = (*p)->get_Visible(&bVisible);
110                         if (SUCCEEDED(hr) && !bVisible) {
111                                 // \95\\8e¦\82³\82ê\82Ä\82¢\82È\82¯\82ê\82Î\8fÁ\82µ\82Ä\82æ\82µ\81B
112                                 (*p)->Release();
113                                 p = m_lstOverlappedWnd.erase(p);
114                                 continue;
115                         }
116                 }
117                 p++;
118         }
119 }
120
121 STDMETHODIMP CInstance::CreateFrame(VARIANT *pvarUnk)
122 {
123         if (!pvarUnk) {
124                 return E_POINTER;
125         }
126
127         ::VariantInit(pvarUnk);
128
129         // \96¢\8eg\97p\82Ì\83E\83B\83\93\83h\83E\82ð\8dí\8f\9c\82·\82é
130         PurgeUnusedWindows();
131
132         HRESULT hr;
133
134         // \83E\83B\83\93\83h\83E\82Ì\90\90¬
135         CComObject<COverlappedWindow>* pNewWnd = NULL;
136         if (FAILED(hr = CComObject<COverlappedWindow>::CreateInstance(&pNewWnd))) {
137                 return hr;
138         }
139
140         // \83C\83\93\83^\81[\83t\83F\83C\83X\82Ì\8eæ\93¾
141         CComPtr<IUnknown> pUnk;
142         if (FAILED(hr = pNewWnd->QueryInterface(&pUnk))) {
143                 delete pNewWnd;
144                 return hr;
145         }
146
147         // \83E\83F\83C\83g\83J\81[\83\\83\8b\8fó\91Ô\82Ì\90Ý\92è
148         pNewWnd->put_WaitCursor(m_dWaitCursor);
149
150         // \8eQ\8fÆ\83J\83E\83\93\83g\82Ì\92Ç\89Á\82¨\82æ\82Ñ
151         // \8aÇ\97\9d\83E\83B\83\93\83h\83E\83\8a\83X\83g\82Ö\82Ì\95Û\91
152         pNewWnd->AddRef();
153         m_lstOverlappedWnd.push_back(pNewWnd);
154
155         pvarUnk->vt = VT_UNKNOWN;
156         pvarUnk->punkVal = pUnk.Detach();
157         return S_OK;
158 }
159
160 STDMETHODIMP CInstance::WaitEvent(VARIANT varTim, VARIANT *pvarUnk)
161 {
162         if (!pvarUnk) {
163                 return E_POINTER;
164         }
165
166         ::VariantInit(pvarUnk);
167         // \91Ò\8b@\8e\9e\8aÔ\82Ì\8eæ\93¾
168         DWORD sleeptim = 1000;
169         CComVariant tim;
170         if (tim.ChangeType(VT_I4, &varTim) == S_OK) {
171                 sleeptim = (DWORD)tim.lVal;
172         }
173         if (sleeptim == 0) {
174                 sleeptim = INFINITE;
175         }
176         // \82·\82×\82Ä\82Ì\83|\83b\83v\83A\83b\83v\83E\83B\83\93\83h\83E\82Ì\83C\83x\83\93\83g\83n\83\93\83h\83\8b\82ð\8eæ\93¾\82·\82é
177         HANDLE hEvent[MAXIMUM_WAIT_OBJECTS] = {NULL};
178         HWND   hWnd[MAXIMUM_WAIT_OBJECTS] = {NULL};
179
180         CComObject<COverlappedWindow>* pOverlapped[MAXIMUM_WAIT_OBJECTS] = {0};
181
182         int count = 0;
183         int n = 0;
184         std::list<CComObject<COverlappedWindow>*>::iterator p = m_lstOverlappedWnd.begin();
185         while (p != m_lstOverlappedWnd.end()) {
186                 n = count;
187                 (*p)->SetWaitParam(&count, hWnd, hEvent);
188                 for (; n < count; n++) {
189                         pOverlapped[n] = *p;
190                 }
191                 p++;
192         }
193
194         // \83\81\83b\83Z\81[\83W\83\8b\81[\83v
195         if (count > 0) {
196                 DWORD ret = pOverlapped[0]->MessageLoop(sleeptim, count, hWnd, hEvent);
197                 if (ret > 0 && ret <= (DWORD)count) {
198                         if (pOverlapped[ret - 1]) {
199                                 // OVERLAPPEDWINDOW\83I\83u\83W\83F\83N\83g\82Ö\82Ì\83C\83\93\83^\81[\83t\83F\83C\83X\82ð\95Ô\82·
200                                 CComPtr<IUnknown> pUnk;
201                                 if (SUCCEEDED(pOverlapped[ret - 1]->QueryInterface(&pUnk))) {
202                                         pvarUnk->vt = VT_UNKNOWN;
203                                         pvarUnk->punkVal = pUnk.Detach();
204                                 }
205                         }
206                 }
207         }
208         return S_OK;
209 }
210
211 STDMETHODIMP CInstance::get_MainFrame(VARIANT *pVal)
212 {
213         if (!pVal) {
214                 return E_POINTER;
215         }
216
217         ::VariantInit(pVal);
218         if (m_pMainWindow) {
219                 HRESULT hr;
220                 CComPtr<IUnknown> pUnk;
221                 if (FAILED(hr = m_pMainWindow->QueryInterface(&pUnk))) {
222                         return hr;
223                 }
224                 pVal->vt = VT_UNKNOWN;
225                 pVal->punkVal = pUnk.Detach();
226         }
227         return S_OK;
228 }
229
230 STDMETHODIMP CInstance::get_WaitCursor(short *pVal)
231 {
232         if (!pVal) {
233                 return E_POINTER;
234         }
235
236         *pVal = m_dWaitCursor;
237
238         return S_OK;
239 }
240
241 STDMETHODIMP CInstance::put_WaitCursor(short newVal)
242 {
243         m_dWaitCursor = newVal;
244
245         // \82·\82×\82Ä\82Ì\83|\83b\83v\83A\83b\83v\83E\83B\83\93\83h\83E\82É\83E\83F\83C\83g\83J\81[\83\\83\8b\92l\82ð\90Ý\92è\82·\82é
246         std::list<CComObject<COverlappedWindow>*>::iterator p = m_lstOverlappedWnd.begin();
247         while (p != m_lstOverlappedWnd.end()) {
248                 (*p)->put_WaitCursor(newVal);
249                 p++;
250         }
251         return S_OK;
252 }
253
254 STDMETHODIMP CInstance::get_Keyboard(VARIANT vk, BOOL *pVal)
255 {
256         if (!pVal) {
257                 return E_POINTER;
258         }
259
260         HRESULT hr;
261         CComVariant varVk;
262         if (FAILED(hr = varVk.ChangeType(VT_I2, &vk))) {
263                 return hr;
264         }
265         *pVal = (GetAsyncKeyState(varVk.iVal) & 0x8000) ? VB_TRUE : VB_FALSE;
266         return S_OK;
267 }
268
269 STDMETHODIMP CInstance::get_MousePosX(long *pVal)
270 {
271         if (!pVal) {
272                 return E_POINTER;
273         }
274
275         POINT pt;
276         ::GetCursorPos(&pt);
277         *pVal = pt.x;
278
279         return S_OK;
280 }
281
282 STDMETHODIMP CInstance::get_MousePosY(long *pVal)
283 {
284         if (!pVal) {
285                 return E_POINTER;
286         }
287
288         POINT pt;
289         ::GetCursorPos(&pt);
290         *pVal = pt.y;
291
292         return S_OK;
293 }
294
295 STDMETHODIMP CInstance::get_Version(double *pVal)
296 {
297         if (!pVal) {
298                 return E_POINTER;
299         }
300
301         *pVal = 0.93;
302
303         return S_OK;
304 }