OSDN Git Service

フォルダ選択ダイアログのヒープエラーの修正、参照カウントの確認
authorseraphy <seraphy@seraphyware.com>
Mon, 17 Aug 2015 18:34:02 +0000 (03:34 +0900)
committerseraphy <seraphy@seraphyware.com>
Mon, 17 Aug 2015 18:34:02 +0000 (03:34 +0900)
26 files changed:
CComEnumDynaVARIANT.h
CommDialog.cpp
Control.cpp
Draw.cpp
Draw.h
Form.cpp
Form.h
Instance.cpp
Instance.h
Layer.cpp
Layer.h
ObjectMap.cpp
ObjectMap.h
ObjectVector.cpp
ObjectVector.h
OverlappedWindow.cpp
OverlappedWindow.h
PrivateProfile.cpp
SeraphyScriptTools.cpp
SeraphyScriptTools.h
Shell.cpp
Shell.h
StdAfx.cpp
StdAfx.h
TreeItem.cpp
TreeItem.h

index 0adda8f..5b6d82e 100644 (file)
@@ -8,7 +8,7 @@ typedef CComEnum<IEnumVARIANT, &IID_IEnumVARIANT, VARIANT, _Copy<VARIANT> > CCom
 
 // \93®\93I\82È\83o\83\8a\83A\83\93\83g\97ñ\8b\93\8c^
 template <class T>
-class CComEnumDynaVARIANT :public IEnumVARIANT, public CComObjectRootEx<CComSingleThreadModel>
+class CComEnumDynaVARIANT :public IEnumVARIANT, public CComObjectRootEx < CComSingleThreadModel >
 {
 public:
        BEGIN_COM_MAP(CComEnumDynaVARIANT)
@@ -100,9 +100,11 @@ STDMETHODIMP CComEnumDynaVARIANT<T>::Reset()
 template<class T>
 STDMETHODIMP CComEnumDynaVARIANT<T>::Clone(IEnumVARIANT FAR* FAR* ppenum)
 {
-       CComObject< CComEnumDynaVARIANT<T> >* pClone = NULL;
-       pClone->CreateInstance(&pClone);
+       CComObject<CComEnumDynaVARIANT<T>>* pClone = NULL;
+       HRESULT hr;
+       if (FAILED(hr = CComObject<CComEnumDynaVARIANT<T>>::CreateInstance(&pClone))) {
+               return hr;
+       }
        pClone->Init(m_pObj, m_current);
-       pClone->QueryInterface(IID_IEnumVARIANT, (void**)ppenum);
-       return S_OK;
+       return pClone->QueryInterface(IID_IEnumVARIANT, (void**)ppenum);
 }
index 896a8a9..f83eb85 100644 (file)
@@ -72,7 +72,7 @@ void CCommDialog::CommFileDialog(VARIANT *pvarReturn, VARIANT varPathName, VARIA
        const int MAXBUFSIZ = MAX_PATH * 10;
        LPTSTR pStrFileBuf = strFile.GetBufferSetLength(MAXBUFSIZ + 1);
 
-       OPENFILENAME ofn = {0};
+       OPENFILENAME ofn = { 0 };
        ofn.lStructSize = sizeof(OPENFILENAME);
        ofn.lpstrFilter = szFilter;
        ofn.lpstrFile = pStrFileBuf;
@@ -326,14 +326,10 @@ STDMETHODIMP CCommDialog::BrowseForFolder(VARIANT varCaption, VARIANT varDir, VA
                put_BrowseForFolderCaption(caption.bstrVal);
        }
 
-       BROWSEINFO binfo = {0};
-       binfo.hwndOwner = GetMainWindow();
-
        ATL::CString szTitle;
        {
                if (m_bstr_BrowseForFolderCaption.length() > 0) {
                        szTitle = (LPCWSTR)m_bstr_BrowseForFolderCaption;
-                       binfo.lpszTitle = szTitle;
                }
        }
 
@@ -344,9 +340,18 @@ STDMETHODIMP CCommDialog::BrowseForFolder(VARIANT varCaption, VARIANT varDir, VA
                        // \83t\83@\83C\83\8b\96¼\82Ì\8eæ\82è\8fo\82µ
                        szDirName = path.bstrVal;
                }
-               binfo.pszDisplayName = szDirName.GetBuffer();
        }
 
+       CComBSTR strInitDir(szDirName);
+
+       BROWSEINFO binfo = { 0 };
+       binfo.hwndOwner = GetMainWindow();
+       binfo.pidlRoot = NULL;
+       binfo.lpszTitle = szTitle.IsEmpty() ? NULL : szTitle;
+       binfo.ulFlags = BIF_RETURNONLYFSDIRS | BIF_NEWDIALOGSTYLE | BIF_SHAREABLE;
+       // \95K\82¸MAX_PATH\82Ì\83o\83b\83t\83@\82ð\8am\95Û\82·\82é
+       binfo.pszDisplayName = szDirName.GetBufferSetLength(MAX_PATH);
+
        int mode = 0;
        CComVariant varTmp;
        if (SUCCEEDED(varTmp.ChangeType(VT_I4, &varMode))) {
@@ -355,22 +360,23 @@ STDMETHODIMP CCommDialog::BrowseForFolder(VARIANT varCaption, VARIANT varDir, VA
 
        binfo.ulFlags = 0;//BIF_NEWDIALOGSTYLE; // BIF_USENEWUI
        switch (mode & 0x0f) {
-               case 0:
-               default:
+       case 0:
+       default:
                binfo.ulFlags |= BIF_RETURNONLYFSDIRS | BIF_NEWDIALOGSTYLE;
                binfo.lpfn = BrowseCallbackProc;
-               binfo.lParam = (LPARAM)(LPCTSTR)szDirName;
+               // BFFM_SETSELECTION\82Å\8f\89\8aú\83t\83H\83\8b\83_\82ð\8ew\92è\82·\82é\8fê\8d\87\81A\83p\83\89\83\81\81[\83^\82Í\8fí\82ÉUNICODE\82Å\82 \82é.
+               binfo.lParam = reinterpret_cast<LPARAM>(static_cast<LPCWSTR>(strInitDir));
                break;
 
-               case 1:
+       case 1:
                binfo.ulFlags |= BIF_BROWSEFORCOMPUTER;
                break;
 
-               case 2:
+       case 2:
                binfo.ulFlags |= BIF_BROWSEFORPRINTER;
                break;
 
-               case 3:
+       case 3:
                binfo.ulFlags |= BIF_RETURNFSANCESTORS;
                break;
        }
@@ -385,22 +391,26 @@ STDMETHODIMP CCommDialog::BrowseForFolder(VARIANT varCaption, VARIANT varDir, VA
                binfo.ulFlags |= BIF_DONTGOBELOWDOMAIN;
        }
 
+       // \83V\83F\83\8b\82Ì\83A\83\8d\83P\81[\83^
+       CComPtr<IMalloc> pMalloc(NULL);
+       HRESULT hr;
+       if (FAILED(hr = SHGetMalloc(&pMalloc))) {
+               return hr;
+       }
+
+       // \83t\83H\83\8b\83_\82Ì\83u\83\89\83E\83Y
        LPITEMIDLIST idlst = NULL;
        if ((idlst = SHBrowseForFolder(&binfo)) != NULL) {
-               IMalloc *pMalloc = NULL;
-               HRESULT hr = SHGetMalloc(&pMalloc);
-               if (FAILED(hr)) {
-                       return hr;
-               }
 
+               // \8c\8b\89Ê\83p\83X\82Ì\8eæ\93¾
+               CComVariant tmp(_TEXT("")); // \8eæ\93¾\82Å\82«\82È\82¢\8fê\8d\87\82Í\8bó\95\8e\9a
                ATL::CString ret;
-               LPTSTR pRet = ret.GetBufferSetLength(MAX_PATH);
-               SHGetPathFromIDList(idlst, pRet);
+               TCHAR path[MAX_PATH] = { 0 };
+               if (SHGetPathFromIDList(idlst, path)) {
+                       tmp = path;
+               }
 
                pMalloc->Free(idlst);
-               pMalloc->Release();
-
-               CComVariant tmp(pRet);
                return tmp.Detach(pvarReturn);
        }
        return S_OK;
@@ -410,17 +420,27 @@ STDMETHODIMP CCommDialog::BrowseForFolder(VARIANT varCaption, VARIANT varDir, VA
 int CALLBACK CCommDialog::BrowseCallbackProc(HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lpData)
 {
        switch (uMsg) {
-               case BFFM_INITIALIZED:
-               SendMessage(hwnd, BFFM_SETSELECTION, true, lpData);
+       case BFFM_INITIALIZED:
+               if (lpData) {
+                       SendMessage(hwnd, BFFM_SETSELECTION, true, lpData);
+               }
                break;
-               case BFFM_SELCHANGED:
+
+       case BFFM_SELCHANGED:
                {
-                       TCHAR szBuf[MAX_PATH];
-                       BOOL bResult = SHGetPathFromIDList((LPITEMIDLIST)lParam, szBuf);
-                       SendMessage(hwnd, BFFM_ENABLEOK, 0, bResult);
+                       LPITEMIDLIST pidl = reinterpret_cast<LPITEMIDLIST>(lParam);
+                       BOOL enabled = FALSE;
+                       if (pidl) {
+                               TCHAR tmp[MAX_PATH];
+                               if (SHGetPathFromIDList(pidl, tmp)) {
+                                       enabled = TRUE;
+                               }
+                       }
+                       SendMessage(hwnd, BFFM_ENABLEOK, 0, enabled);
                }
                break;
-               case BFFM_VALIDATEFAILED:
+
+       case BFFM_VALIDATEFAILED:
                break;
        }
        return 0;
@@ -444,10 +464,11 @@ STDMETHODIMP CCommDialog::SetMainWindow(VARIANT varUnk)
        }
        // \83C\83\93\83^\81[\83t\83F\83C\83X\82Ì\8eæ\93¾
        CComVariant tmp;
-       if (SUCCEEDED(tmp.ChangeType(VT_UNKNOWN, &varUnk))) {
-               return tmp.punkVal->QueryInterface(IID_IOverlappedWindow, (void**)&m_pMainWindow);
+       HRESULT hr;
+       if (FAILED(hr = tmp.ChangeType(VT_UNKNOWN, &varUnk))) {
+               return hr;
        }
-       return DISP_E_UNKNOWNINTERFACE;
+       return tmp.punkVal->QueryInterface(&m_pMainWindow);
 }
 
 STDMETHODIMP CCommDialog::MessageBox(VARIANT mes, VARIANT typ, VARIANT icon, VARIANT* pRet)
@@ -468,28 +489,28 @@ STDMETHODIMP CCommDialog::MessageBox(VARIANT mes, VARIANT typ, VARIANT icon, VAR
                }
 
                switch (varType.iVal % 10) {
-                       case 0:
-                       default:
+               case 0:
+               default:
                        mode |= MB_OK;
                        break;
 
-                       case 1:
+               case 1:
                        mode |= MB_OKCANCEL;
                        break;
 
-                       case 2:
+               case 2:
                        mode |= MB_YESNO;
                        break;
 
-                       case 3:
+               case 3:
                        mode |= MB_YESNOCANCEL;
                        break;
 
-                       case 4:
+               case 4:
                        mode |= MB_RETRYCANCEL;
                        break;
 
-                       case 5:
+               case 5:
                        mode |= MB_ABORTRETRYIGNORE;
                        break;
                }
@@ -497,23 +518,23 @@ STDMETHODIMP CCommDialog::MessageBox(VARIANT mes, VARIANT typ, VARIANT icon, VAR
 
        if (SUCCEEDED(varIcon.ChangeType(VT_I2, &icon))) {
                switch (varIcon.iVal) {
-                       case 0:
-                       default:
+               case 0:
+               default:
                        break;
 
-                       case 1:
+               case 1:
                        mode |= MB_ICONERROR;
                        break;
 
-                       case 2:
+               case 2:
                        mode |= MB_ICONWARNING;
                        break;
 
-                       case 3:
+               case 3:
                        mode |= MB_ICONINFORMATION;
                        break;
 
-                       case 4:
+               case 4:
                        mode |= MB_ICONQUESTION;
                        break;
                }
@@ -521,17 +542,17 @@ STDMETHODIMP CCommDialog::MessageBox(VARIANT mes, VARIANT typ, VARIANT icon, VAR
 
        int md = ::MessageBox(GetMainWindow(), msg, GetMainCaption(), mode);
        switch (md) {
-               case IDOK:
-               case IDYES:
-               case IDRETRY:
+       case IDOK:
+       case IDYES:
+       case IDRETRY:
                ret = (short)1;
                break;
-               case IDCANCEL:
-               case IDABORT:
+       case IDCANCEL:
+       case IDABORT:
                ret = (short)-1;
                break;
-               case IDNO:
-               case IDIGNORE:
+       case IDNO:
+       case IDIGNORE:
                ret = (short)0;
                break;
        }
index f49da13..491d9b5 100644 (file)
@@ -8,11 +8,8 @@
 #include "objectmap.h"
 #include "CComEnumDynaVARIANT.h"
 
-#include <list>
 #include <vector>
 
-using namespace std;
-
 /////////////////////////////////////////////////////////////////////////////
 // CControl
 
@@ -492,17 +489,21 @@ STDMETHODIMP CControl::AddString(VARIANT text, VARIANT* pRet)
                ret = (short)SendMessage(m_hWnd, CB_ADDSTRING, 0, (LPARAM)(LPCTSTR)buf);
        }
        else if (!lstrcmp(m_classname, _TEXT("LISTBOX"))) {
+               // \98A\91z\94z\97ñ\83I\83u\83W\83F\83N\83g\82ð\8dì\90¬\82·\82é
+               CComObject<CObjectMap>* pMap = NULL;
+               if (FAILED(hr = CComObject<CObjectMap>::CreateInstance(&pMap))) {
+                       return hr;
+               }
+               IUnknown* pMapUnk = NULL;
+               if (FAILED(hr = pMap->QueryInterface(&pMapUnk))) {
+                       return hr;
+               }
+
                // \83\8a\83X\83g\83{\83b\83N\83X\82É\95\8e\9a\97ñ\82ð\92Ç\89Á\82·\82é
                int nIdx = SendMessage(m_hWnd, LB_ADDSTRING, 0, (LPARAM)(LPCTSTR)buf);
 
-               // \98A\91z\94z\97ñ\83I\83u\83W\83F\83N\83g\82ð\83o\83C\83\93\83h\82·\82é
-               CComObject<CObjectMap>* pMap = NULL;
-               if (SUCCEEDED(CComObject<CObjectMap>::CreateInstance(&pMap))) {
-                       IUnknown* pUnk = NULL;
-                       if (SUCCEEDED(pMap->QueryInterface(IID_IUnknown, (void**)&pUnk))) {
-                               ::SendMessage(m_hWnd, LB_SETITEMDATA, nIdx, (LPARAM)pUnk);
-                       }
-               }
+               // \83\8a\83X\83g\83{\83b\83N\83X\82Ì\83A\83C\83e\83\80\82É\98A\91z\94z\97ñ\82ð\83o\83C\83\93\83h\82·\82é.
+               ::SendMessage(m_hWnd, LB_SETITEMDATA, nIdx, (LPARAM)pMapUnk);
                ret = (short)nIdx;
        }
        else if (!lstrcmp(m_classname, WC_LISTVIEW)) {
@@ -521,11 +522,16 @@ STDMETHODIMP CControl::AddString(VARIANT text, VARIANT* pRet)
 
                // \98A\91z\94z\97ñ\83I\83u\83W\83F\83N\83g\82ð\83o\83C\83\93\83h\82·\82é
                CComObject<CObjectMap>* pMap = NULL;
+               if (FAILED(hr = CComObject<CObjectMap>::CreateInstance(&pMap))) {
+                       return hr;
+               }
+
                IUnknown* pUnk = NULL;
-               if (SUCCEEDED(pMap->CreateInstance(&pMap))) {
-                       pMap->QueryInterface(IID_IUnknown, (void**)&pUnk);
+               if (FAILED(hr = pMap->QueryInterface(IID_IUnknown, (void**)&pUnk))) {
+                       return hr;
                }
-               LVITEM itm = {0};
+
+               LVITEM itm = { 0 };
                itm.iItem = nIdx;
                itm.mask = LVIF_PARAM;
                itm.lParam = (LPARAM)pUnk;
@@ -534,10 +540,13 @@ STDMETHODIMP CControl::AddString(VARIANT text, VARIANT* pRet)
        }
        else if (!lstrcmp(m_classname, WC_TREEVIEW)) {
                // \83c\83\8a\81[\83r\83\85\81[\82Ì\83\8b\81[\83g\82É\83A\83C\83e\83\80\82ð\8dì\90¬\82·\82é
-               IUnknown* pUnk = NULL;
-               CTreeItem::CreateTreeItem(m_hWnd, TVI_ROOT, buf, &pUnk);
+               CComPtr<IUnknown> pUnk;
+               HRESULT hr;
+               if (FAILED(hr = CTreeItem::CreateTreeItem(m_hWnd, TVI_ROOT, buf, &pUnk))) {
+                       return hr;
+               }
                if (pUnk != NULL) {
-                       ret = (IUnknown*)pUnk;
+                       ret = pUnk; // pUnk\82ÍVariant\91ã\93ü\8e\9e\82ÉAddRef\82³\82ê\82é\82Ì\82ÅDetach\82Í\95s\97v.
                }
        }
        else {
@@ -683,9 +692,8 @@ STDMETHODIMP CControl::get_ItemObject(VARIANT idx, VARIANT *pVal)
        }
 
        if (pUnk) {
-               pUnk->AddRef();
-               pVal->vt = VT_UNKNOWN;
-               pVal->punkVal = pUnk;
+               CComVariant tmp(pUnk);
+               return tmp.Detach(pVal);
        }
        return S_OK;
 }
@@ -895,14 +903,20 @@ STDMETHODIMP CControl::get_CurrentSelectedItem(VARIANT *pVal)
                HTREEITEM hItem = TreeView_GetSelection(m_hWnd);
                if (hItem) {
                        CComObject<CTreeItem>* pItem = NULL;
-                       if (SUCCEEDED(pItem->CreateInstance(&pItem))) {
-                               pItem->AddRef();
-                               pItem->SetParam(m_hWnd, hItem);
-                               IUnknown* pUnk = NULL;
-                               if (SUCCEEDED(pItem->QueryInterface(IID_IUnknown, (void**)&pUnk))) {
-                                       ret = pUnk;
-                               }
+                       HRESULT hr;
+                       if (FAILED(hr = CComObject<CTreeItem>::CreateInstance(&pItem))) {
+                               return hr;
                        }
+
+                       IUnknown* pUnk = NULL;
+                       if (FAILED(hr = pItem->QueryInterface(&pUnk))) {
+                               delete pItem;
+                               return hr;
+                       }
+
+                       //FIXME: \95s\97v\82Ì\82Í\82¸ pItem->AddRef();
+                       pItem->SetParam(m_hWnd, hItem);
+                       ret = pUnk;
                }
        }
        else {
@@ -1029,12 +1043,13 @@ STDMETHODIMP CControl::get__NewEnum(IUnknown **pVal)
 
        // \97ñ\8b\93\83C\83\93\83^\81[\83t\83F\83C\83X\82Ì\90\90¬
        CComObject<CComEnumVARIANT>* pCol = NULL;
-       if (SUCCEEDED(CComObject<CComEnumVARIANT>::CreateInstance(&pCol))) {
-               pCol->AddRef();
-               pCol->Init(&varArray[0], &varArray[mx], pCol, AtlFlagCopy);
-               *pVal = pCol;
+       HRESULT hr;
+       if (FAILED(hr = CComObject<CComEnumVARIANT>::CreateInstance(&pCol))) {
+               return hr;
        }
-       return S_OK;
+       pCol->Init(&varArray[0], &varArray[mx], pCol, AtlFlagCopy);
+
+       return pCol->QueryInterface(pVal);
 }
 
 
@@ -1176,17 +1191,22 @@ STDMETHODIMP CControl::get_TreeRoot(VARIANT *pVal)
        }
        ::VariantInit(pVal);
        if (!lstrcmp(m_classname, WC_TREEVIEW)) {
-               HTREEITEM hItem = TreeView_GetRoot(m_hWnd);
                CComObject<CTreeItem>* pItem = NULL;
-               if (SUCCEEDED(pItem->CreateInstance(&pItem))) {
-                       pItem->AddRef();
-                       pItem->SetParam(m_hWnd, hItem);
-                       IUnknown* pUnk = NULL;
-                       if (SUCCEEDED(pItem->QueryInterface(IID_IUnknown, (void**)&pUnk))) {
-                               pVal->vt = VT_UNKNOWN;
-                               pVal->punkVal = pUnk;
-                       }
+               HRESULT hr;
+               if (FAILED(hr = CComObject<CTreeItem>::CreateInstance(&pItem))) {
+                       return hr;
+               }
+
+               HTREEITEM hItem = TreeView_GetRoot(m_hWnd);
+               pItem->SetParam(m_hWnd, hItem);
+
+               IUnknown* pUnk = NULL;
+               if (FAILED(hr = pItem->QueryInterface(IID_IUnknown, (void**)&pUnk))) {
+                       delete pItem;
+                       return hr;
                }
+               pVal->vt = VT_UNKNOWN;
+               pVal->punkVal = pUnk;
        }
        return S_OK;
 }
index 6357d6e..16cd7f1 100644 (file)
--- a/Draw.cpp
+++ b/Draw.cpp
@@ -7,6 +7,31 @@
 /////////////////////////////////////////////////////////////////////////////
 // CCanvas
 
+HRESULT CCanvas::FinalConstruct()
+{
+       // \94h\90\8c³\8aÖ\98A
+       m_hParent = NULL;
+
+       // \88ó\8dü\8aÖ\98A
+       m_pPrinterDeviceMode = NULL;
+       m_marginWidth = 150; // 1.5Cm\82Ì\83}\81[\83W\83\93
+       m_marginHeight = 150;
+
+       // \83\8c\83C\83\84\81[\82Ì\8f\89\8aú\89»
+       for (int i = 0; i < MAXLAYER; i++) {
+               m_pComLayer[i] = NULL;
+       }
+       for (int i = 0; i < MAXLAYER; i++) {
+               HRESULT hr = CComObject<CLayer>::CreateInstance(&m_pComLayer[i]);
+               if (FAILED(hr)) {
+                       return hr;
+               }
+               m_pComLayer[i]->AddRef();
+       }
+
+       return S_OK;
+}
+
 void CCanvas::FinalRelease()
 {
        ATLTRACE("CCanvas::FinalRelease\r\n");
@@ -15,9 +40,9 @@ void CCanvas::FinalRelease()
                delete m_pPrinterDeviceMode;
                m_pPrinterDeviceMode = NULL;
        }
+
        // \83\8c\83C\83\84\81[\83I\83u\83W\83F\83N\83g\82Ì\89ð\95ú
-       int i;
-       for (i = 0; i < MAXLAYER; i++) {
+       for (int i = 0; i < MAXLAYER; i++) {
                if (m_pComLayer[i] != NULL) {
                        m_pComLayer[i]->Release();
                        m_pComLayer[i] = NULL;
@@ -25,19 +50,6 @@ void CCanvas::FinalRelease()
        }
 }
 
-STDMETHODIMP CCanvas::InterfaceSupportsErrorInfo(REFIID riid)
-{
-       static const IID* arr[] =
-       {
-               &IID_ICanvas
-       };
-       for (int i = 0; i < sizeof(arr) / sizeof(arr[0]); i++) {
-               if (IsEqualGUID(*arr[i], riid))
-                       return S_OK;
-       }
-       return S_FALSE;
-}
-
 STDMETHODIMP CCanvas::get_Layer(VARIANT varLay, VARIANT *pVal)
 {
        // \83\8c\83C\83\84\81[\83I\83u\83W\83F\83N\83g\82Ì\8eó\82¯\93n\82µ
diff --git a/Draw.h b/Draw.h
index b73ceae..3ab82a2 100644 (file)
--- a/Draw.h
+++ b/Draw.h
 class ATL_NO_VTABLE CCanvas :
        public CComObjectRootEx<CComSingleThreadModel>,
        public CComCoClass<CCanvas, &CLSID_Canvas>,
-       public ISupportErrorInfo,
+       public ISupportErrorInfoImpl<&IID_ICanvas>,
        public IConnectionPointContainerImpl<CCanvas>,
        public IDispatchImpl<ICanvas, &IID_ICanvas, &LIBID_SERAPHYSCRIPTTOOLSLib>
 {
 public:
-       CCanvas()
-       {
-               // \94h\90\8c³\8aÖ\98A
-               m_hParent = NULL;
-               // \88ó\8dü\8aÖ\98A
-               m_pPrinterDeviceMode = NULL;
-               m_marginWidth = 150; // 1.5Cm\82Ì\83}\81[\83W\83\93
-               m_marginHeight = 150;
-               // \83\8c\83C\83\84\81[\82Ì\8f\89\8aú\89»
-               int i;
-               for (i = 0; i < MAXLAYER; i++) {
-                       if (m_pComLayer[i]->CreateInstance(&m_pComLayer[i]) == S_OK) {
-                               m_pComLayer[i]->AddRef();
-                       }
-                       else {
-                               // \90\90¬\82É\8e¸\94s\81B
-                               m_pComLayer[i] = NULL;
-                       }
-               }
-       }
+       HRESULT FinalConstruct();
+
        void CCanvas::FinalRelease();
 
        DECLARE_REGISTRY_RESOURCEID(IDR_CANVAS)
@@ -54,9 +36,6 @@ public:
        END_CONNECTION_POINT_MAP()
 
 
-       // ISupportsErrorInfo
-       STDMETHOD(InterfaceSupportsErrorInfo)(REFIID riid);
-
        // ICanvas
 public:
        STDMETHOD(LoadPicture)(/*[in]*/VARIANT path,/*[out,retval]*/VARIANT* punkVal);
index bec47d1..e468265 100644 (file)
--- a/Form.cpp
+++ b/Form.cpp
@@ -32,7 +32,7 @@ STDMETHODIMP CForm::get_Control(VARIANT varNum, VARIANT *pVal)
                nID = tmp.iVal;
        }
        if (nID > 0) {
-               list<CComObject<CControl>*>::iterator p = m_lstControl.begin();
+               std::list<CComObject<CControl>*>::iterator p = m_lstControl.begin();
                while (p != m_lstControl.end()) {
                        if ((*p)->GetID() == nID) {
                                // \93¯\88êID\82ð\94­\8c©\82µ\82½\82Ì\82Å\81A\82±\82ê\82ð\95Ô\82·
@@ -82,7 +82,7 @@ STDMETHODIMP CForm::SetControlFont(VARIANT fontname, VARIANT fontsize)
        m_nControlFontSize = siz;
 
        // \8c»\8dÝ\82Ì\83R\83\93\83g\83\8d\81[\83\8b\82·\82×\82Ä\82É\93K\97p\82·\82é(\90\90¬\82³\82ê\82Ä\82¢\82ê\82Î)
-       list<CComObject<CControl>*>::iterator p = m_lstControl.begin();
+       std::list<CComObject<CControl>*>::iterator p = m_lstControl.begin();
        while (p != m_lstControl.end()) {
                (*p)->SetFont(m_hControlFont);
                p++;
@@ -234,7 +234,7 @@ STDMETHODIMP CForm::CheckListView(VARIANT colum, VARIANT width, VARIANT height,
 STDMETHODIMP CForm::ClearControls()
 {
        // \83R\83\93\83g\83\8d\81[\83\8b\82ð\82·\82×\82Ä\94j\8aü\82·\82é
-       list<CComObject<CControl>*>::iterator p = m_lstControl.begin();
+       std::list<CComObject<CControl>*>::iterator p = m_lstControl.begin();
        while (p != m_lstControl.end()) {
                (*p)->Destroy(); // \83E\83B\83\93\83h\83E\82ð\94j\8aü\82µ\8eQ\8fÆ\82ª\8ec\82Á\82Ä\82à\83A\83N\83Z\83X\95s\89Â\82É\82·\82é
                (*p)->Release();
@@ -295,8 +295,9 @@ CControl* CForm::CreateControlCore(VARIANT &text, VARIANT &width, VARIANT &heigh
 
        // \83C\83\93\83X\83^\83\93\83X\82Ì\90\90¬
        CComObject<CControl>* pControl = NULL;
-       HRESULT hRet = pControl->CreateInstance(&pControl);
-       ATLASSERT(hRet == S_OK);
+       HRESULT hRet = CComObject<CControl>::CreateInstance(&pControl);
+       // FIXME: \83G\83\89\81[\82ð\95Ô\82¹\82é\82æ\82¤\82É\82·\82×\82«
+       ATLASSERT(SUCCEEDED(hRet));
 
        // \8eQ\8fÆ\83J\83E\83\93\83g\81A\83|\83C\83\93\83^\82Ì\95Û\91
        pControl->AddRef();
@@ -315,7 +316,7 @@ CControl* CForm::CreateControlCore(VARIANT &text, VARIANT &width, VARIANT &heigh
        // \82±\82Ì\83C\83\93\83^\81[\83t\83F\83C\83X\82ð\96ß\82è\92l\82Æ\82·\82é
        IUnknown* pUnk = NULL;
        hRet = pControl->QueryInterface(IID_IUnknown, (void**)&pUnk);
-       ATLASSERT(hRet == S_OK);
+       ATLASSERT(SUCCEEDED(hRet));
        ::VariantInit(pvarUnk);
        pvarUnk->vt = VT_UNKNOWN;
        pvarUnk->punkVal = pUnk;
@@ -401,7 +402,7 @@ void CForm::AttachOwner(HWND hOwner)
 {
        m_hOwner = hOwner;
        // \8e\96\91O\8dì\90¬\82³\82ê\82Ä\82¢\82½\83R\83\93\83g\83\8d\81[\83\8b\82ð\82·\82×\82Ä\90\90¬\82·\82é
-       list<CComObject<CControl>*>::iterator p = m_lstControl.begin();
+       std::list<CComObject<CControl>*>::iterator p = m_lstControl.begin();
        while (p != m_lstControl.end()) {
                (*p)->Create(hOwner);
                (*p)->SetFont(m_hControlFont);
@@ -455,7 +456,7 @@ void CForm::EnableAllControl(BOOL mode)
                // \83\81\83C\83\93\83E\83B\83\93\83h\83E\82ª\8dì\90¬\82³\82ê\82Ä\82¢\82È\82¯\82ê\82Î\89½\82à\82µ\82È\82¢
                return;
        }
-       list<CComObject<CControl>*>::iterator p = m_lstControl.begin();
+       std::list<CComObject<CControl>*>::iterator p = m_lstControl.begin();
        while (p != m_lstControl.end()) {
                (*p)->put_Enable(mode);
                p++;
@@ -492,7 +493,7 @@ BOOL CForm::FindControlEventName(int eventcode, BSTR *pEventName)
 {
        // pEventName\82Í\8f\89\8aú\89»\82³\82ê\82Ä\82¢\82È\82¢BSTR\82Ö\82Ì\83|\83C\83\93\83^\82ð\93n\82·
        // \8cÄ\82Ñ\8fo\82µ\8c³\82Ítrue\82ª\8bA\82Á\82½\82ç\81A\82±\82ÌBSTR\82ð\89ð\95ú\82·\82é\95K\97v\82ª\82 \82é
-       list<CComObject<CControl>*>::iterator p = m_lstControl.begin();
+       std::list<CComObject<CControl>*>::iterator p = m_lstControl.begin();
        while (p != m_lstControl.end()) {
                if ((*p)->GetID() == eventcode) {
                        (*p)->GetClassEvent(pEventName);
diff --git a/Form.h b/Form.h
index e1c064d..5ac8315 100644 (file)
--- a/Form.h
+++ b/Form.h
@@ -3,7 +3,6 @@
 #pragma once
 
 #include <list>
-using namespace std;
 
 #include "resource.h"       // \83\81\83C\83\93 \83V\83\93\83{\83\8b
 #include "control.h"
index aeb2c10..08845d7 100644 (file)
@@ -8,47 +8,70 @@
 /////////////////////////////////////////////////////////////////////////////
 // CInstance
 
-CInstance::CInstance()
+HRESULT CInstance::FinalConstruct()
 {
+       HRESULT hr;
+
        // \83\81\83C\83\93\83E\83B\83\93\83h\83E\82Ì\90\90¬
        m_pMainWindow = NULL;
-       if (m_pMainWindow->CreateInstance(&m_pMainWindow) == S_OK) {
-               m_pMainWindow->AddRef();
-               // \83I\81[\83o\81[\83\89\83b\83v\83E\83B\83\93\83h\83E\83\8a\83X\83g\82É\92Ç\89Á
-               m_lstOverlappedWnd.push_back(m_pMainWindow);
+       if (FAILED(hr = CComObject<COverlappedWindow>::CreateInstance(&m_pMainWindow))) {
+               ATLASSERT(SUCCEEDED(hr));
+               return hr;
        }
+       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
+
        // \83R\83\82\83\93\83_\83C\83A\83\8d\83O\83C\83\93\83^\81[\83t\83F\83C\83X\82Ì\90\90¬
        m_pCommDlg = NULL;
-       if (m_pCommDlg->CreateInstance(&m_pCommDlg) == S_OK) {
-               m_pCommDlg->AddRef();
-               // \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é
-               if (m_pMainWindow) {
-                       IUnknown* pUnk = NULL;
-                       if (m_pMainWindow->QueryInterface(IID_IUnknown, (void**)&pUnk) == S_OK) {
-                               CComVariant varUnk(pUnk);
-                               m_pCommDlg->SetMainWindow(varUnk);
-                       }
-               }
+       if (FAILED(hr = CComObject<CCommDialog>::CreateInstance(&m_pCommDlg))) {
+               ATLASSERT(SUCCEEDED(hr));
+               // \83\81\83C\83\93\83E\83B\83\93\83h\83E\82Í\94j\8aü\82·\82é.
+               m_pMainWindow->Release();
+               return hr;
        }
+       m_pCommDlg->AddRef();
+
+       // \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é
+       CComPtr<IUnknown> pUnk;
+       if (FAILED(hr = m_pMainWindow->QueryInterface(&pUnk))) {
+               m_pCommDlg->Release();
+               m_pMainWindow->Release();
+               return hr;
+       }
+
+       CComVariant varUnk(pUnk);
+       m_pCommDlg->SetMainWindow(varUnk);
+
+       // \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
+       m_pMainWindow->AddRef();
+       m_lstOverlappedWnd.push_back(m_pMainWindow);
+
        // \83E\83F\83C\83g\83J\81[\83\\83\8b\81E\83J\83E\83\93\83g
        m_dWaitCursor = 0;
+
+       return S_OK;
 }
 
 void CInstance::FinalRelease()
 {
        ATLTRACE("CInstance::FinalRelease\r\n");
+
        // \83\81\83C\83\93\83E\83B\83\93\83h\83E\82Ì\89ð\95ú
+       ATLTRACE(_TEXT("*refcount=%d\n"), m_pMainWindow->m_dwRef);
        if (m_pMainWindow) {
                m_pMainWindow->Release();
-               m_pMainWindow = NULL;
+               //m_pMainWindow = NULL;
        }
+
        // \83R\83\82\83\93\83_\83C\83A\83\8d\83O\83C\83\93\83^\81[\83t\83F\83C\83X\82Ì\89ð\95ú
+       ATLTRACE(_TEXT("*refcount=%d\n"), m_pMainWindow->m_dwRef);
        if (m_pCommDlg) {
                m_pCommDlg->Release();
                m_pCommDlg = NULL;
        }
+
        // \83|\83b\83v\83A\83b\83v\83E\83B\83\93\83h\83E\82Ì\89ð\95ú
-       list<CComObject<COverlappedWindow>*>::iterator p = m_lstOverlappedWnd.begin();
+       ATLTRACE(_TEXT("*refcount=%d\n"), m_pMainWindow->m_dwRef);
+       std::list<CComObject<COverlappedWindow>*>::iterator p = m_lstOverlappedWnd.begin();
        while (p != m_lstOverlappedWnd.end()) {
                (*p)->Close();
                (*p)->Release();
@@ -58,29 +81,33 @@ void CInstance::FinalRelease()
 
 STDMETHODIMP CInstance::get_Dialog(VARIANT *pVal)
 {
+       if (!pVal) {
+               return E_POINTER;
+       }
        // \83R\83\82\83\93\83_\83C\83A\83\8d\83O\83C\83\93\83^\81[\83t\83F\83C\83X\82ð\95Ô\82·
        ::VariantInit(pVal);
        if (m_pCommDlg) {
-               IUnknown *pUnk = NULL;
-               if (m_pCommDlg->QueryInterface(IID_IUnknown, (void**)&pUnk) == S_OK) {
-                       pVal->vt = VT_UNKNOWN;
-                       pVal->punkVal = pUnk;
+               HRESULT hr;
+               CComPtr<IUnknown> pUnk;
+               if (FAILED(hr = m_pCommDlg->QueryInterface(&pUnk))) {
+                       return hr;
                }
+               pVal->vt = VT_UNKNOWN;
+               pVal->punkVal = pUnk.Detach();
        }
        return S_OK;
 }
 
-STDMETHODIMP CInstance::CreateFrame(VARIANT *pvarUnk)
+void CInstance::PurgeUnusedWindows()
 {
-       ::VariantInit(pvarUnk);
        // \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¤
-       list<CComObject<COverlappedWindow>*>::iterator p = m_lstOverlappedWnd.begin();
+       std::list<CComObject<COverlappedWindow>*>::iterator p = m_lstOverlappedWnd.begin();
        while (p != m_lstOverlappedWnd.end()) {
                if ((*p)->m_dwRef == 1) {
                        // \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
                        BOOL bVisible = false;
-                       (*p)->get_Visible(&bVisible);
-                       if (!bVisible) {
+                       HRESULT hr = (*p)->get_Visible(&bVisible);
+                       if (SUCCEEDED(hr) && !bVisible) {
                                // \95\\8e¦\82³\82ê\82Ä\82¢\82È\82¯\82ê\82Î\8fÁ\82µ\82Ä\82æ\82µ\81B
                                (*p)->Release();
                                p = m_lstOverlappedWnd.erase(p);
@@ -89,24 +116,53 @@ STDMETHODIMP CInstance::CreateFrame(VARIANT *pvarUnk)
                }
                p++;
        }
+}
+
+STDMETHODIMP CInstance::CreateFrame(VARIANT *pvarUnk)
+{
+       if (!pvarUnk) {
+               return E_POINTER;
+       }
+
+       ::VariantInit(pvarUnk);
+
+       // \96¢\8eg\97p\82Ì\83E\83B\83\93\83h\83E\82ð\8dí\8f\9c\82·\82é
+       PurgeUnusedWindows();
+
+       HRESULT hr;
+
        // \83E\83B\83\93\83h\83E\82Ì\90\90¬
        CComObject<COverlappedWindow>* pNewWnd = NULL;
-       if (pNewWnd->CreateInstance(&pNewWnd) == S_OK) {
-               pNewWnd->AddRef();
-               pNewWnd->put_WaitCursor(m_dWaitCursor);
-               m_lstOverlappedWnd.push_back(pNewWnd);
-               // \83C\83\93\83^\81[\83t\83F\83C\83X\82Ì\8eæ\93¾
-               IUnknown* pUnk = NULL;
-               if (pNewWnd->QueryInterface(IID_IUnknown, (void**)&pUnk) == S_OK) {
-                       pvarUnk->vt = VT_UNKNOWN;
-                       pvarUnk->punkVal = pUnk;
-               }
+       if (FAILED(hr = CComObject<COverlappedWindow>::CreateInstance(&pNewWnd))) {
+               return hr;
+       }
+
+       // \83C\83\93\83^\81[\83t\83F\83C\83X\82Ì\8eæ\93¾
+       CComPtr<IUnknown> pUnk;
+       if (FAILED(hr = pNewWnd->QueryInterface(&pUnk))) {
+               delete pNewWnd;
+               return hr;
        }
+
+       // \83E\83F\83C\83g\83J\81[\83\\83\8b\8fó\91Ô\82Ì\90Ý\92è
+       pNewWnd->put_WaitCursor(m_dWaitCursor);
+
+       // \8eQ\8fÆ\83J\83E\83\93\83g\82Ì\92Ç\89Á\82¨\82æ\82Ñ
+       // \8aÇ\97\9d\83E\83B\83\93\83h\83E\83\8a\83X\83g\82Ö\82Ì\95Û\91
+       pNewWnd->AddRef();
+       m_lstOverlappedWnd.push_back(pNewWnd);
+
+       pvarUnk->vt = VT_UNKNOWN;
+       pvarUnk->punkVal = pUnk.Detach();
        return S_OK;
 }
 
 STDMETHODIMP CInstance::WaitEvent(VARIANT varTim, VARIANT *pvarUnk)
 {
+       if (!pvarUnk) {
+               return E_POINTER;
+       }
+
        ::VariantInit(pvarUnk);
        // \91Ò\8b@\8e\9e\8aÔ\82Ì\8eæ\93¾
        DWORD sleeptim = 1000;
@@ -120,10 +176,12 @@ STDMETHODIMP CInstance::WaitEvent(VARIANT varTim, VARIANT *pvarUnk)
        // \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é
        HANDLE hEvent[MAXIMUM_WAIT_OBJECTS] = {NULL};
        HWND   hWnd[MAXIMUM_WAIT_OBJECTS] = {NULL};
-       CComObject<COverlappedWindow>* pOverlapped[MAXIMUM_WAIT_OBJECTS] = {NULL};
+
+       CComObject<COverlappedWindow>* pOverlapped[MAXIMUM_WAIT_OBJECTS] = {0};
+
        int count = 0;
        int n = 0;
-       list<CComObject<COverlappedWindow>*>::iterator p = m_lstOverlappedWnd.begin();
+       std::list<CComObject<COverlappedWindow>*>::iterator p = m_lstOverlappedWnd.begin();
        while (p != m_lstOverlappedWnd.end()) {
                n = count;
                (*p)->SetWaitParam(&count, hWnd, hEvent);
@@ -132,16 +190,17 @@ STDMETHODIMP CInstance::WaitEvent(VARIANT varTim, VARIANT *pvarUnk)
                }
                p++;
        }
+
        // \83\81\83b\83Z\81[\83W\83\8b\81[\83v
        if (count > 0) {
                DWORD ret = pOverlapped[0]->MessageLoop(sleeptim, count, hWnd, hEvent);
                if (ret > 0 && ret <= (DWORD)count) {
                        if (pOverlapped[ret - 1]) {
                                // OVERLAPPEDWINDOW\83I\83u\83W\83F\83N\83g\82Ö\82Ì\83C\83\93\83^\81[\83t\83F\83C\83X\82ð\95Ô\82·
-                               IUnknown* pUnk = NULL;
-                               if (pOverlapped[ret - 1]->QueryInterface(IID_IUnknown, (void**)&pUnk) == S_OK) {
+                               CComPtr<IUnknown> pUnk;
+                               if (SUCCEEDED(pOverlapped[ret - 1]->QueryInterface(&pUnk))) {
                                        pvarUnk->vt = VT_UNKNOWN;
-                                       pvarUnk->punkVal = pUnk;
+                                       pvarUnk->punkVal = pUnk.Detach();
                                }
                        }
                }
@@ -151,28 +210,40 @@ STDMETHODIMP CInstance::WaitEvent(VARIANT varTim, VARIANT *pvarUnk)
 
 STDMETHODIMP CInstance::get_MainFrame(VARIANT *pVal)
 {
+       if (!pVal) {
+               return E_POINTER;
+       }
+
        ::VariantInit(pVal);
        if (m_pMainWindow) {
-               IUnknown* pUnk = NULL;
-               if (m_pMainWindow->QueryInterface(IID_IUnknown, (void**)&pUnk) == S_OK) {
-                       pVal->vt = VT_UNKNOWN;
-                       pVal->punkVal = pUnk;
+               HRESULT hr;
+               CComPtr<IUnknown> pUnk;
+               if (FAILED(hr = m_pMainWindow->QueryInterface(&pUnk))) {
+                       return hr;
                }
+               pVal->vt = VT_UNKNOWN;
+               pVal->punkVal = pUnk.Detach();
        }
        return S_OK;
 }
 
 STDMETHODIMP CInstance::get_WaitCursor(short *pVal)
 {
+       if (!pVal) {
+               return E_POINTER;
+       }
+
        *pVal = m_dWaitCursor;
+
        return S_OK;
 }
 
 STDMETHODIMP CInstance::put_WaitCursor(short newVal)
 {
        m_dWaitCursor = newVal;
+
        // \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é
-       list<CComObject<COverlappedWindow>*>::iterator p = m_lstOverlappedWnd.begin();
+       std::list<CComObject<COverlappedWindow>*>::iterator p = m_lstOverlappedWnd.begin();
        while (p != m_lstOverlappedWnd.end()) {
                (*p)->put_WaitCursor(newVal);
                p++;
@@ -182,9 +253,14 @@ STDMETHODIMP CInstance::put_WaitCursor(short newVal)
 
 STDMETHODIMP CInstance::get_Keyboard(VARIANT vk, BOOL *pVal)
 {
+       if (!pVal) {
+               return E_POINTER;
+       }
+
+       HRESULT hr;
        CComVariant varVk;
-       if (varVk.ChangeType(VT_I2, &vk) != S_OK) {
-               return DISP_E_TYPEMISMATCH;
+       if (FAILED(hr = varVk.ChangeType(VT_I2, &vk))) {
+               return hr;
        }
        *pVal = (GetAsyncKeyState(varVk.iVal) & 0x8000) ? VB_TRUE : VB_FALSE;
        return S_OK;
@@ -192,22 +268,37 @@ STDMETHODIMP CInstance::get_Keyboard(VARIANT vk, BOOL *pVal)
 
 STDMETHODIMP CInstance::get_MousePosX(long *pVal)
 {
+       if (!pVal) {
+               return E_POINTER;
+       }
+
        POINT pt;
        ::GetCursorPos(&pt);
        *pVal = pt.x;
+
        return S_OK;
 }
 
 STDMETHODIMP CInstance::get_MousePosY(long *pVal)
 {
+       if (!pVal) {
+               return E_POINTER;
+       }
+
        POINT pt;
        ::GetCursorPos(&pt);
        *pVal = pt.y;
+
        return S_OK;
 }
 
 STDMETHODIMP CInstance::get_Version(double *pVal)
 {
-       *pVal = 0.92;
+       if (!pVal) {
+               return E_POINTER;
+       }
+
+       *pVal = 0.93;
+
        return S_OK;
 }
index 8c50321..f010eaa 100644 (file)
 // CInstance
 class ATL_NO_VTABLE CInstance :
        public CComObjectRootEx<CComSingleThreadModel>,
-       public CStockPropImpl<CInstance, ISeraphyScriptTools_Instance, &IID_ISeraphyScriptTools_Instance, &LIBID_SERAPHYSCRIPTTOOLSLib>,
+       public CComCoClass<CInstance, &CLSID_SeraphyScriptTools_Instance>,
+       public ISupportErrorInfoImpl<&IID_ISeraphyScriptTools_Instance>,
        public CComControl<CInstance>,
+       public CStockPropImpl<CInstance, ISeraphyScriptTools_Instance, &IID_ISeraphyScriptTools_Instance, &LIBID_SERAPHYSCRIPTTOOLSLib>,
        public IPersistStreamInitImpl<CInstance>,
        public IOleControlImpl<CInstance>,
        public IOleObjectImpl<CInstance>,
        public IOleInPlaceActiveObjectImpl<CInstance>,
        public IViewObjectExImpl<CInstance>,
        public IOleInPlaceObjectWindowlessImpl<CInstance>,
-       public ISupportErrorInfo,
        public IConnectionPointContainerImpl<CInstance>,
        public IPersistStorageImpl<CInstance>,
        public ISpecifyPropertyPagesImpl<CInstance>,
        public IQuickActivateImpl<CInstance>,
        public IDataObjectImpl<CInstance>,
        public IProvideClassInfo2Impl<&CLSID_SeraphyScriptTools_Instance, &DIID__ISeraphyScriptTools_InstanceEvents, &LIBID_SERAPHYSCRIPTTOOLSLib>,
-       public IPropertyNotifySinkCP<CInstance>,
-       public CComCoClass<CInstance, &CLSID_SeraphyScriptTools_Instance>
+       public IPropertyNotifySinkCP<CInstance>
 {
 public:
-       CInstance();
+       HRESULT FinalConstruct();
        void FinalRelease();
 
        DECLARE_REGISTRY_RESOURCEID(IDR_INSTANCE)
@@ -84,22 +84,6 @@ public:
        //  LRESULT CommandHandler(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled);
        //  LRESULT NotifyHandler(int idCtrl, LPNMHDR pnmh, BOOL& bHandled);
 
-
-
-       // ISupportsErrorInfo
-       STDMETHOD(InterfaceSupportsErrorInfo)(REFIID riid)
-       {
-               static const IID* arr[] =
-               {
-                       &IID_ISeraphyScriptTools_Instance,
-               };
-               for (int i = 0; i < sizeof(arr) / sizeof(arr[0]); i++) {
-                       if (IsEqualGUID(*arr[i], riid))
-                               return S_OK;
-               }
-               return S_FALSE;
-       }
-
        // IViewObjectEx
        DECLARE_VIEW_STATUS(VIEWSTATUS_SOLIDBKGND | VIEWSTATUS_OPAQUE)
 
@@ -117,6 +101,7 @@ public:
        STDMETHOD(CreateFrame)(/*[out,retval]*/VARIANT* pvarUnk);
        STDMETHOD(get_Dialog)(/*[out, retval]*/ VARIANT *pVal);
 
+protected:
        HRESULT OnDraw(ATL_DRAWINFO& di)
        {
                RECT& rc = *(RECT*)di.prcBounds;
@@ -132,10 +117,14 @@ public:
 
                return S_OK;
        }
-       CComBSTR m_bstrCaption;
+
+public:
+       CComBSTR m_bstrCaption; // FIXME: protected\82É\82·\82é
+
 protected:
-       list<CComObject<COverlappedWindow>*> m_lstOverlappedWnd;
-       CComObject<CCommDialog>* m_pCommDlg;
-       CComObject<COverlappedWindow>* m_pMainWindow;
+       void PurgeUnusedWindows();
+       std::list<CComObject<COverlappedWindow>*> m_lstOverlappedWnd;
+       CComObject<CCommDialog>* m_pCommDlg; //FIXME: CComPtr\82Ö
+       CComObject<COverlappedWindow>* m_pMainWindow; //FIXME: CComPtr\82Ö
        int m_dWaitCursor;
 };
index 15d82c5..1ba01c7 100644 (file)
--- a/Layer.cpp
+++ b/Layer.cpp
@@ -36,7 +36,7 @@ void CLayer::Draw(CDC dc)
                }
                // \95`\89æ\83f\81[\83^
                EnterCriticalSection(&m_objDrawingDataProtection);
-               list<drawdata*>::iterator p = m_lstDraw.begin();
+               std::list<drawdata*>::iterator p = m_lstDraw.begin();
                while (p != m_lstDraw.end()) {
                        (*p)->Draw(dc);
                        p++;
@@ -266,7 +266,7 @@ STDMETHODIMP CLayer::Clear()
 {
        // \83h\83\8d\81[\83C\83\93\83O\83f\81[\83^\81[\82Ì\94j\8aü
        EnterCriticalSection(&m_objDrawingDataProtection);
-       list<drawdata*>::iterator p = m_lstDraw.begin();
+       std::list<drawdata*>::iterator p = m_lstDraw.begin();
        while (p != m_lstDraw.end()) {
                (*p)->Destroy();
                p = m_lstDraw.erase(p);
diff --git a/Layer.h b/Layer.h
index c571410..d7229bc 100644 (file)
--- a/Layer.h
+++ b/Layer.h
@@ -5,7 +5,6 @@
 #include "resource.h"       // \83\81\83C\83\93 \83V\83\93\83{\83\8b
 
 #include <list>
-using namespace std;
 
 
 /////////////////////////////////////////////////////////////////////////////
@@ -596,7 +595,7 @@ public:
        void AddDrawData(drawdata* pDrawData);
 protected:
        CRITICAL_SECTION m_objDrawingDataProtection;
-       list<drawdata*> m_lstDraw;
+       std::list<drawdata*> m_lstDraw;
        DWORD m_dwFillColor;
        DWORD m_dwFontColor;
        DWORD m_dwColor;
index e634fdf..5e1999d 100644 (file)
@@ -5,11 +5,16 @@
 #include "profilesection.h"
 #include "CComEnumDynaVARIANT.h"
 
+#include <vector>
+
 /////////////////////////////////////////////////////////////////////////////
 // CObjectMap
 
 STDMETHODIMP CObjectMap::FindNear(VARIANT key, VARIANT *pVal)
 {
+       if (!pVal) {
+               return E_POINTER;
+       }
        ::VariantInit(pVal);
 
        CComVariant varName;
@@ -23,13 +28,16 @@ STDMETHODIMP CObjectMap::FindNear(VARIANT key, VARIANT *pVal)
                // \94­\8c©\82³\82ê\82½
                CComVariant findkey((LPCWSTR)p->first);
                findkey.ChangeType(VT_BSTR);
-               findkey.Detach(pVal);
+               return findkey.Detach(pVal);
        }
-       return S_OK;
+       return S_FALSE;
 }
 
 STDMETHODIMP CObjectMap::get_NearValue(VARIANT key, VARIANT *pVal)
 {
+       if (!pVal) {
+               return E_POINTER;
+       }
        ::VariantInit(pVal);
 
        CComVariant varName;
@@ -41,13 +49,16 @@ STDMETHODIMP CObjectMap::get_NearValue(VARIANT key, VARIANT *pVal)
        VariantMap::iterator p = m_mapVariant.lower_bound(varName.bstrVal);
        if (p != m_mapVariant.end()) {
                // \94­\8c©\82³\82ê\82½
-               VariantCopy(pVal, &p->second);
+               return VariantCopy(pVal, &p->second);
        }
-       return S_OK;
+       return S_FALSE;
 }
 
 STDMETHODIMP CObjectMap::get_Value(VARIANT key, VARIANT *pVal)
 {
+       if (!pVal) {
+               return E_POINTER;
+       }
        ::VariantInit(pVal);
 
        CComVariant varName;
@@ -59,9 +70,11 @@ STDMETHODIMP CObjectMap::get_Value(VARIANT key, VARIANT *pVal)
        VariantMap::iterator p = m_mapVariant.find(varName.bstrVal);
        if (p != m_mapVariant.end()) {
                // \94­\8c©\82³\82ê\82½
-               VariantCopy(pVal, &p->second);
+               return VariantCopy(pVal, &p->second);
        }
-       return S_OK;
+
+       // \8c©\82Â\82©\82ç\82È\82©\82Á\82½
+       return S_FALSE;
 }
 
 STDMETHODIMP CObjectMap::put_Value(VARIANT key, VARIANT newVal)
@@ -75,20 +88,20 @@ STDMETHODIMP CObjectMap::put_Value(VARIANT key, VARIANT newVal)
        VariantMap::iterator p = m_mapVariant.find(varName.bstrVal);
        if (p != m_mapVariant.end()) {
                // \8aù\91
-               VariantCopy(&p->second, &newVal);
+               p->second = newVal;
        }
        else {
                // \90V\8bK
-               VARIANT tmp;
-               ::VariantInit(&tmp);
-               VariantCopy(&tmp, &newVal);
-               m_mapVariant.insert(pair<_bstr_t, VARIANT>(varName.bstrVal, tmp));
+               m_mapVariant.insert(std::make_pair(varName.bstrVal, newVal));
        }
        return S_OK;
 }
 
 STDMETHODIMP CObjectMap::get_Count(long *pVal)
 {
+       if (!pVal) {
+               return E_POINTER;
+       }
        *pVal = m_mapVariant.size();
        return S_OK;
 }
@@ -98,7 +111,7 @@ STDMETHODIMP CObjectMap::Clear()
        //VARIANT\82Ì\83N\83\8a\83A\82Æ\98A\91z\94z\97ñ\82Ì\89ð\95ú
        VariantMap::iterator p = m_mapVariant.begin();
        while (p != m_mapVariant.end()) {
-               ::VariantClear(&p->second);
+               p->second.Clear();
                p++;
        }
        m_mapVariant.clear();
@@ -108,73 +121,90 @@ STDMETHODIMP CObjectMap::Clear()
 
 STDMETHODIMP CObjectMap::Duplicate(IUnknown** punkVal)
 {
+       if (!punkVal) {
+               return E_POINTER;
+       }
        *punkVal = NULL;
+
        CComObject<CObjectMap>* pMap = NULL;
-       if (pMap->CreateInstance(&pMap) == S_OK) {
-               // \8c»\8dÝ\82Ì\83I\83u\83W\83F\83N\83g\82ð\95¡\90»\82·\82é
-               VariantMap::iterator p = m_mapVariant.begin();
-               while (p != m_mapVariant.end()) {
-                       CComVariant key((LPCWSTR)p->first);
-                       key.ChangeType(VT_BSTR);
-                       pMap->put_Value(key, p->second);
-                       p++;
-               }
-               pMap->QueryInterface(IID_IUnknown, (void**)punkVal);
+       HRESULT hr;
+       if (FAILED(hr = CComObject<CObjectMap>::CreateInstance(&pMap))) {
+               return hr;
        }
-       return S_OK;
+
+       // \8c»\8dÝ\82Ì\83I\83u\83W\83F\83N\83g\82ð\95¡\90»\82·\82é
+       VariantMap::iterator p = m_mapVariant.begin();
+       while (p != m_mapVariant.end()) {
+               CComVariant key(p->first);
+               key.ChangeType(VT_BSTR);
+               pMap->put_Value(key, p->second);
+               p++;
+       }
+
+       return pMap->QueryInterface(punkVal);
 }
 
 STDMETHODIMP CObjectMap::CreateMap(IUnknown** punkVal)
 {
+       if (!punkVal) {
+               return E_POINTER;
+       }
        *punkVal = NULL;
+
        CComObject<CObjectMap>* pMap = NULL;
-       if (SUCCEEDED(pMap->CreateInstance(&pMap))) {
-               return pMap->QueryInterface(IID_IUnknown, (void**)punkVal);
+       HRESULT hr;
+       if (FAILED(hr = CComObject<CObjectMap>::CreateInstance(&pMap))) {
+               return hr;
        }
-       return E_FAIL;
+
+       return pMap->QueryInterface(punkVal);
 }
 
 STDMETHODIMP CObjectMap::get__NewEnum(IUnknown **pVal)
 {
+       if (!pVal) {
+               return E_POINTER;
+       }
+
        int mx = m_mapVariant.size();
-       VARIANT* pvarArray = new VARIANT[mx + 1];
+       std::vector<CComVariant> pvarArray;
+       pvarArray.resize(mx + 1);
+
        // \8ai\94[\82³\82ê\82Ä\82¢\82é\96¼\91O\82Ì\97ñ\8b\93
        VariantMap::iterator p = m_mapVariant.begin();
        int i = 0;
        while (p != m_mapVariant.end()) {
-               ::VariantInit(&pvarArray[i]);
-               pvarArray[i].vt = VT_BSTR;
-               pvarArray[i].bstrVal = SysAllocString(p->first);
+               pvarArray[i] = p->first;
                p++;
                i++;
        }
+
        // \97ñ\8b\93\83C\83\93\83^\81[\83t\83F\83C\83X\82Ì\90\90¬
+       HRESULT hr;
        CComObject<CComEnumVARIANT>* pCol = NULL;
-       if (pCol->CreateInstance(&pCol) == S_OK) {
-               pCol->AddRef();
-               pCol->Init(&pvarArray[0], &pvarArray[mx], pCol, AtlFlagCopy);
-               *pVal = pCol;
-       }
-       // \8am\95Û\82µ\82½\83o\83\8a\83A\83\93\83g\82Ì\94j\8aü(\83\8a\83\8a\81[\83X\82ð\8ds\82¤\95K\97v\82 \82è)
-       i = 0;
-       while (i < mx) {
-               ::VariantClear(&pvarArray[i++]);
+       if (FAILED(hr = CComObject<CComEnumVARIANT>::CreateInstance(&pCol))) {
+               return hr;
        }
-       delete[]pvarArray;
-       return S_OK;
+       pCol->Init(&pvarArray[0], &pvarArray[mx], pCol, AtlFlagCopy);
+
+       return pCol->QueryInterface(pVal);
 }
 
 STDMETHODIMP CObjectMap::ExpandVariables(VARIANT text, VARIANT env, VARIANT *pVal)
 {
        CComVariant varText, varEnv, varResult;
-       if (varText.ChangeType(VT_BSTR, &text) != S_OK) {
-               return DISP_E_TYPEMISMATCH;
+
+       HRESULT hr;
+       if (FAILED(hr = varText.ChangeType(VT_BSTR, &text))) {
+               return hr;
        }
+
        // \8aÂ\8b«\95Ï\90\94\82ð\93W\8aJ\82·\82é\82©?
        BOOL bEnv = false;
-       if (varEnv.ChangeType(VT_I2, &env) == S_OK) {
+       if (SUCCEEDED(varEnv.ChangeType(VT_I2, &env))) {
                bEnv = varEnv.iVal;
        }
+
        // \83t\83F\81[\83Y1 : \8aÜ\82Ü\82ê\82é\95Ï\90\94\82ð\92²\8d¸\82µ\82Ä\95K\97v\82È\83o\83b\83t\83@\83T\83C\83Y\82ð\8b\81\82ß\82é
        // \83t\83F\81[\83Y2 ; \8eÀ\8dÛ\82É\93W\8aJ\82·\82é
        DWORD expandsize = 0;
@@ -213,7 +243,7 @@ STDMETHODIMP CObjectMap::ExpandVariables(VARIANT text, VARIANT env, VARIANT *pVa
                                if (p != m_mapVariant.end()) {
                                        // \94­\8c©\82³\82ê\82½
                                        CComVariant tmp;
-                                       if (tmp.ChangeType(VT_BSTR, &p->second) == S_OK) {
+                                       if (SUCCEEDED(tmp.ChangeType(VT_BSTR, &p->second))) {
                                                if (phase == 0) {
                                                        // \83t\83F\81[\83Y1\82Í\83T\83C\83Y\82ð\83J\83E\83\93\83g\82·\82é\82¾\82¯
                                                        expandsize += SysStringLen(tmp.bstrVal);
@@ -221,8 +251,7 @@ STDMETHODIMP CObjectMap::ExpandVariables(VARIANT text, VARIANT env, VARIANT *pVa
                                                else {
                                                        // \83t\83F\81[\83Y2\82Í\8c»\8dÝ\88Ê\92u\82É\95Ï\90\94\82ð\93W\8aJ\82·\82é
                                                        UINT len = SysStringLen(tmp.bstrVal);
-                                                       UINT i;
-                                                       for (i = 0; i < len; i++) {
+                                                       for (UINT i = 0; i < len; i++) {
                                                                pExpandBuffer[writeidx++] = tmp.bstrVal[i];
                                                        }
                                                }
@@ -268,7 +297,7 @@ STDMETHODIMP CObjectMap::ExpandVariables(VARIANT text, VARIANT env, VARIANT *pVa
                        // \83t\83F\81[\83Y2\82ª\8fI\97¹\82µ\82½\82Ì\82Å\92u\8a·\82ª\8a®\97¹\82µ\82½
                        pExpandBuffer[writeidx] = 0;
                        varResult = (LPCWSTR)pExpandBuffer;
-                       delete[]pExpandBuffer;
+                       delete[] pExpandBuffer;
                }
        }
        varResult.Detach(pVal);
@@ -338,7 +367,7 @@ STDMETHODIMP CObjectMap::LoadProfile(IUnknown *punkVal)
        while (idx <= mx) {
                CComVariant varKey, varVal;
                if (SafeArrayGetElement(varArray.parray, &idx, &varKey) == S_OK) {
-                       if (pSection->get_Value(varKey, &varVal) == S_OK) {
+                       if (SUCCEEDED(pSection->get_Value(varKey, &varVal))) {
                                put_Value(varKey, varVal);
                        }
                }
index 76363a1..f95a93c 100644 (file)
@@ -5,9 +5,8 @@
 #include "resource.h"       // \83\81\83C\83\93 \83V\83\93\83{\83\8b
 #include <map>
 #include <string>
-using namespace std;
 
-typedef map<_bstr_t, VARIANT> VariantMap;
+typedef std::map<CComBSTR, CComVariant> VariantMap;
 
 /////////////////////////////////////////////////////////////////////////////
 // CObjectMap
@@ -18,9 +17,8 @@ class ATL_NO_VTABLE CObjectMap :
        public IDispatchImpl<IObjectMap, &IID_IObjectMap, &LIBID_SERAPHYSCRIPTTOOLSLib>
 {
 public:
-       CObjectMap()
-       {
-       }
+       CObjectMap() {}
+
        void FinalRelease()
        {
                Clear();
index 36931cc..e40c083 100644 (file)
 
 STDMETHODIMP CObjectVector::CreateVector(IUnknown **punkVal)
 {
+       if (!punkVal) {
+               return E_POINTER;
+       }
        *punkVal = NULL;
+
        CComObject<CObjectVector>* pVct = NULL;
-       if (SUCCEEDED(pVct->CreateInstance(&pVct))) {
-               pVct->QueryInterface(IID_IUnknown, (void**)punkVal);
+       HRESULT hr;
+       if (FAILED(hr = CComObject<CObjectVector>::CreateInstance(&pVct))) {
+               return hr;
        }
-       return S_OK;
+
+       return pVct->QueryInterface(punkVal);
 }
 
 STDMETHODIMP CObjectVector::Duplicate(VARIANT idx, VARIANT count, IUnknown **punkVal)
 {
+       if (!punkVal) {
+               return E_POINTER;
+       }
        *punkVal = NULL;
+
        CComObject<CObjectVector>* pVct = NULL;
-       if (SUCCEEDED(pVct->CreateInstance(&pVct))) {
-               pVct->QueryInterface(IID_IUnknown, (void**)punkVal);
+       HRESULT hr;
+       if (FAILED(hr = CComObject<CObjectVector>::CreateInstance(&pVct))) {
+               return hr;
+       }
+       if (FAILED(hr = pVct->QueryInterface(punkVal))) {
+               return hr;
        }
 
        if (!m_vctVariant.empty()) {
@@ -49,12 +63,8 @@ STDMETHODIMP CObjectVector::Duplicate(VARIANT idx, VARIANT count, IUnknown **pun
                }
 
                if (nIdx < mx) {
-                       long i;
-                       for (i = 0; i < nCount; i++) {
-                               VARIANT tmp;
-                               ::VariantInit(&tmp);
-                               ::VariantCopy(&tmp, &m_vctVariant.at(nIdx + i));
-                               pVct->m_vctVariant.push_back(tmp);
+                       for (long i = 0; i < nCount; i++) {
+                               pVct->m_vctVariant.push_back(m_vctVariant[nIdx + i]);
                        }
                }
        }
@@ -66,7 +76,7 @@ STDMETHODIMP CObjectVector::Clear()
        //VARIANT\82Ì\83N\83\8a\83A\82Æ\98A\91z\94z\97ñ\82Ì\89ð\95ú
        VariantVector::iterator p = m_vctVariant.begin();
        while (p != m_vctVariant.end()) {
-               ::VariantClear(&*p);
+               p->Clear();
                p++;
        }
        m_vctVariant.clear();
@@ -102,10 +112,7 @@ STDMETHODIMP CObjectVector::Erase(VARIANT idx, VARIANT count)
 STDMETHODIMP CObjectVector::Push(VARIANT newVal)
 {
        // \96\96\94ö\82É\92Ç\89Á
-       VARIANT tmp;
-       ::VariantInit(&tmp);
-       ::VariantCopy(&tmp, &newVal);
-       m_vctVariant.push_back(tmp);
+       m_vctVariant.push_back(newVal);
        return S_OK;
 }
 
@@ -116,7 +123,7 @@ STDMETHODIMP CObjectVector::Pop(VARIANT *pVal)
        if (!m_vctVariant.empty()) {
                long mx = m_vctVariant.size();
                ::VariantInit(pVal);
-               ::VariantCopy(pVal, &m_vctVariant.at(mx - 1));
+               ::VariantCopy(pVal, &m_vctVariant[mx - 1]);
                m_vctVariant.pop_back();
        }
        return S_OK;
@@ -136,10 +143,7 @@ STDMETHODIMP CObjectVector::Insert(VARIANT idx, VARIANT newVal)
                return DISP_E_BADINDEX;
        }
 
-       VARIANT tmp;
-       ::VariantInit(&tmp);
-       ::VariantCopy(&tmp, &newVal);
-       m_vctVariant.insert(m_vctVariant.begin() + nIdx, tmp);
+       m_vctVariant.insert(m_vctVariant.begin() + nIdx, newVal);
        return S_OK;
 }
 
@@ -160,7 +164,7 @@ STDMETHODIMP CObjectVector::get_Value(VARIANT idx, VARIANT *pVal)
        long mx = m_vctVariant.size();
        if (nIdx < mx) {
                // \83x\83N\83^\81[\82Ì\94Í\88Í\93à\82È\82ç\92l\82ð\8eæ\93¾\82·\82é
-               ::VariantCopy(pVal, &m_vctVariant.at(nIdx));
+               ::VariantCopy(pVal, &m_vctVariant[nIdx]);
        }
        return S_OK;
 }
@@ -202,11 +206,12 @@ STDMETHODIMP CObjectVector::get__NewEnum(IUnknown **pVal)
 {
        typedef CComEnumDynaVARIANT<CObjectVector> CComEnumDynaVector;
        CComObject<CComEnumDynaVector>* pDyna = NULL;
-       if (SUCCEEDED(pDyna->CreateInstance(&pDyna))) {
-               pDyna->Init(this, 0);
-               pDyna->QueryInterface(IID_IEnumVARIANT, (void**)pVal);
+       HRESULT hr;
+       if (FAILED(hr = CComObject<CComEnumDynaVector>::CreateInstance(&pDyna))) {
+               return hr;
        }
-       return S_OK;
+       pDyna->Init(this, 0);
+       return pDyna->QueryInterface(IID_IEnumVARIANT, (void**)pVal);
 }
 
 STDMETHODIMP CObjectVector::Merge(VARIANT unkVal)
index 9af8b09..4573e7b 100644 (file)
@@ -4,9 +4,8 @@
 
 #include "resource.h"       // \83\81\83C\83\93 \83V\83\93\83{\83\8b
 #include <vector>
-using namespace std;
 
-typedef vector<VARIANT> VariantVector;
+typedef std::vector<CComVariant> VariantVector;
 
 /////////////////////////////////////////////////////////////////////////////
 // CObjectVector
index 4f8e5b0..1cfc247 100644 (file)
@@ -14,7 +14,7 @@
 // COverlappedWindow
 
 
-COverlappedWindow::COverlappedWindow()
+HRESULT COverlappedWindow::FinalConstruct()
 {
        m_pUnkMarshaler = NULL;
 
@@ -54,29 +54,38 @@ COverlappedWindow::COverlappedWindow()
        m_bDefaultAction = true; // \83f\83B\83t\83H\83\8b\83g\82ÌOK/CANCEL\83A\83N\83V\83\87\83\93\82Å\95Â\82\82é
 
        // \83t\83H\81[\83\80\83C\83\93\83^\81[\83t\83F\83C\83X\82Ì\8dì\90¬
-       m_pForm = NULL;
        m_hLastFocusControl = NULL;
-       if (m_pForm->CreateInstance(&m_pForm) == S_OK) {
-               m_pForm->AddRef();
-               m_pForm->SetWindowSize(windowParam.width, windowParam.height,
-                       windowParam.GetStyle(), windowParam.exstyle);
+
+
+       HRESULT hr;
+
+       // \83t\83H\81[\83\80\83I\83u\83W\83F\83N\83g\82Ì\90\90¬
+       m_pForm = NULL;
+       if (FAILED(hr = CComObject<CForm>::CreateInstance(&m_pForm))) {
+               return hr;
        }
-       // \95`\89æ\83C\83\93\83^\81[\83t\83F\83C\83X\82Ì\90\90¬
+       m_pForm->AddRef();
+       m_pForm->SetWindowSize(windowParam.width, windowParam.height,
+               windowParam.GetStyle(), windowParam.exstyle);
+
+       // \95`\89æ\83I\83u\83W\83F\83N\83g\82Ì\90\90¬
        m_pCanvas = NULL;
-       if (m_pCanvas->CreateInstance(&m_pCanvas) == S_OK) {
-               m_pCanvas->AddRef();
+       if (FAILED(hr = CComObject<CCanvas>::CreateInstance(&m_pCanvas))) {
+               return hr;
        }
-       // \83\86\81[\83U\81[\92è\8b`\98A\91z\94z\97ñ\83C\83\93\83^\81[\83t\83F\83C\83X\82Ì\90\90¬
+       m_pCanvas->AddRef();
+
+       // \83\86\81[\83U\81[\92è\8b`\98A\91z\94z\97ñ\83I\83u\83W\83F\83N\83g\82Ì\90\90¬
        m_pObject = NULL;
-       if (m_pObject->CreateInstance(&m_pObject) == S_OK) {
-               m_pObject->AddRef();
+       if (FAILED(hr = CComObject<CObjectMap>::CreateInstance(&m_pObject))) {
+               return hr;
        }
+       m_pObject->AddRef();
+
        // \83E\83F\83C\83g\83J\81[\83\\83\8b\82Ì\8f\89\8aú\89»
        m_dWaitCursor = 0;
-}
 
-HRESULT COverlappedWindow::FinalConstruct()
-{
+       // \8fW\96ñ\82Ì\82½\82ß\82Ì\83t\83\8a\81[\83X\83\8c\83b\83h\83}\81[\83V\83\83\83\89\82Ì\90Ý\92è
        return CoCreateFreeThreadedMarshaler(
                GetControllingUnknown(), &m_pUnkMarshaler.p);
 }
@@ -98,7 +107,7 @@ void COverlappedWindow::FinalRelease()
                ::DestroyIcon(m_hIcon);
        }
        // \83`\83\83\83C\83\8b\83h\83|\83b\83v\83A\83b\83v\82Ì\94j\8aü
-       list<CComObject<COverlappedWindow>*>::iterator pWnd = m_lstChild.begin();
+       std::list<CComObject<COverlappedWindow>*>::iterator pWnd = m_lstChild.begin();
        while (pWnd != m_lstChild.end()) {
                (*pWnd)->Close();
                (*pWnd)->Release();
@@ -135,7 +144,7 @@ void COverlappedWindow::FinalRelease()
 
        EnterCriticalSection(&m_objEventDataProtection);
        // \83C\83x\83\93\83g\83f\81[\83^\82Ì\89ð\95ú
-       list<CComObject<CEvent>*>::iterator pEv = m_lstEvent.begin();
+       std::list<CComObject<CEvent>*>::iterator pEv = m_lstEvent.begin();
        while (pEv != m_lstEvent.end()) {
                (*pEv)->Release();
                pEv = m_lstEvent.erase(pEv);
@@ -654,9 +663,14 @@ STDMETHODIMP COverlappedWindow::DoEvent(VARIANT *varResult)
                        }
                        m_pEvent = pEv;
                        m_pEvent->AddRef();
+
                        // \82±\82Ì\83I\83u\83W\83F\83N\83g\82ð\88ø\90\94\82Æ\82µ\82Ä\93n\82·\82½\82ß\82É\83C\83\93\83^\81[\83t\83F\83C\83X\82ð\90\90¬\82·\82é
-                       IUnknown* pUnk = NULL;
-                       QueryInterface(IID_IUnknown, (void**)&pUnk);
+                       CComPtr<IUnknown> pUnk;
+                       HRESULT hr;
+                       if (FAILED(hr = QueryInterface(IID_IUnknown, (void**) &pUnk))) {
+                               return hr;
+                       }
+
                        // \83C\83x\83\93\83g\82É\91Î\82·\82é\83\89\83C\83Y
                        switch (pEv->GetMessage()) {
                                case WM_KEYDOWN:
@@ -789,7 +803,7 @@ STDMETHODIMP COverlappedWindow::DoEvent(VARIANT *varResult)
                                        }
                                        // \83\81\83j\83\85\81[\82Ì\8c\9f\8dõ
                                        if (m_hMenu && nID >= 100) {
-                                               map<int, CComBSTR>::iterator p = m_cMenuMap.find(nID);
+                                               std::map<int, CComBSTR>::iterator p = m_cMenuMap.find(nID);
                                                if (p != m_cMenuMap.end()) {
                                                        // \94­\8c©\82³\82ê\82½
                                                        ClassObjectInvoke(p->second);
@@ -823,7 +837,7 @@ STDMETHODIMP COverlappedWindow::DoEvent(VARIANT *varResult)
                        }
                        // \82±\82Ì\88ø\90\94\82Æ\82µ\82Ä\93n\82µ\82½\83C\83\93\83^\81[\83t\83F\83C\83X\82ð\89ð\95ú\82·\82é
                        if (pUnk) {
-                               pUnk->Release();
+                               pUnk.Release();
                        }
                }
                // \8f\88\97\9d\82³\82ê\82½\83C\83x\83\93\83g\82Í\89ð\95ú\82·\82é
@@ -847,7 +861,7 @@ void COverlappedWindow::AddEventSingle(int message, WPARAM wParam, LPARAM lParam
        // \83C\83x\83\93\83g\83o\83b\83t\83@\82É\96¢\8f\88\97\9d\82Ì\83C\83x\83\93\83g\82ª\82 \82ê\82Î\83C\83x\83\93\83g\82ð\94­\8ds\82µ\82È\82¢\81B
        BOOL bFind = false;
        EnterCriticalSection(&m_objEventDataProtection);
-       list<CComObject<CEvent>*>::iterator p = m_lstEvent.begin();
+       std::list<CComObject<CEvent>*>::iterator p = m_lstEvent.begin();
        while (p != m_lstEvent.end()) {
                if ((*p)->GetMessage() == message && (*p)->GetParam() == wParam) {
                        bFind = true;
@@ -889,12 +903,15 @@ void COverlappedWindow::AddEvent(int message, WPARAM wParam, LPARAM lParam)
 
        // \83C\83x\83\93\83g\82Ì\90Ï\82Ý\8fã\82°
        EnterCriticalSection(&m_objEventDataProtection);
-       CComObject<CEvent>* pEvent;
-       if (pEvent->CreateInstance(&pEvent) == S_OK) {
+       CComObject<CEvent>* pEvent = NULL;
+       HRESULT hr;
+       if (SUCCEEDED(hr = CComObject<CEvent>::CreateInstance(&pEvent))) {
                pEvent->AddRef();
                pEvent->SetData(message, wParam, lParam, pt, lp);
                m_lstEvent.push_back(pEvent);
        }
+       ATLASSERT(SUCCEEDED(hr));
+
        LeaveCriticalSection(&m_objEventDataProtection);
 
        // \83C\83x\83\93\83g\83n\83\93\83h\83\8b\82ð\83V\83O\83i\83\8b\82É\82·\82é
@@ -944,7 +961,7 @@ STDMETHODIMP COverlappedWindow::Open(VARIANT caption, VARIANT* pvarUnk)
 STDMETHODIMP COverlappedWindow::Close()
 {
        // \83`\83\83\83C\83\8b\83h\82ð\8e\9d\82Á\82Ä\82¢\82é\8fê\8d\87\82Í\81A\83`\83\83\83C\83\8b\83h\82à\83N\83\8d\81[\83Y\82·\82é
-       list<CComObject<COverlappedWindow>*>::iterator pWnd = m_lstChild.begin();
+       std::list<CComObject<COverlappedWindow>*>::iterator pWnd = m_lstChild.begin();
        while (pWnd != m_lstChild.end()) {
                (*pWnd)->Close();
                pWnd++;
@@ -1310,24 +1327,27 @@ STDMETHODIMP COverlappedWindow::SetMenu(VARIANT fmt)
                                                while (*p && *p != ',' && *p != '/' && *p != ':') {
                                                        p = CharNext(p);
                                                }
+
                                                ZeroMemory(menuname, MAX_PATH);
                                                int menunameLen = p - st;
                                                if (menunameLen > 0) {
                                                        _tcsncpy_s(menuname, MAX_PATH, st, menunameLen);
                                                }
+
                                                // \83R\83}\83\93\83h\83Z\83p\83\8c\81[\83^\81[\82ð\8c\9f\8d¸\82·\82é
                                                CComBSTR eventname;
                                                LPTSTR findcmd = _tcschr(menuname, _TEXT('@'));
                                                if (findcmd) {
                                                        *findcmd = 0;
                                                        eventname = findcmd + 1;
-                                               }
-                                               else {
+
+                                               else {
                                                        TCHAR tmp[64];
                                                        wsprintf(tmp, _TEXT("OnMenu%d"), lv1 * 100 + cmd);
                                                        eventname = tmp;
                                                }
-                                               m_cMenuMap.insert(std::pair<int, CComBSTR>(lv1 * 100 + cmd, eventname));
+                                               m_cMenuMap.insert(std::make_pair(lv1 * 100 + cmd, eventname));
+
                                                // \83\81\83j\83\85\81[\82Ì\8dì\90¬
                                                MENUITEMINFO inf = {0};
                                                inf.cbSize = sizeof(MENUITEMINFO);
@@ -1338,11 +1358,12 @@ STDMETHODIMP COverlappedWindow::SetMenu(VARIANT fmt)
                                                InsertMenuItem(hPopupMenu, lv2, true, &inf);
                                                lv2++;
                                                cmd++;
+
                                                // \83Z\83p\83\8c\81[\83^\81[\82Ì\8ew\92è\82©?
                                                if (*p == ',') {
                                                        p++;
-                                               }
-                                               else if (*p == ':') {
+
+                                               else if (*p == ':') {
                                                        MENUITEMINFO inf = {0};
                                                        inf.cbSize = sizeof(MENUITEMINFO);
                                                        inf.fMask = MIIM_TYPE;
@@ -1412,22 +1433,25 @@ STDMETHODIMP COverlappedWindow::TrackPopupMenu(VARIANT text, VARIANT cmd, VARIAN
                        inf.cbSize = sizeof(MENUITEMINFO);
                        inf.fMask = MIIM_TYPE | MIIM_ID;
                        inf.fType = MFT_STRING;
+
                        if (nCommand != 0) {
                                inf.wID = nCommand + cmd;
-                       }
-                       else {
+
+                       else {
                                // \83R\83}\83\93\83h\83x\81[\83X\82ª0\82È\82ç\82Î\83R\83}\83\93\83h\83C\83x\83\93\83g\82Í\94­\90\82³\82¹\82È\82¢\81B
                                // TrackPopupMenu\82Í\83R\83}\83\93\83h\82ð\91I\91ð\82µ\82È\82©\82Á\82½\8fê\8d\87\82Í0\82ð\95Ô\82·\82½\82ß\81A0\82æ\82è\82à\91å\82«\82È\92l\82É\82·\82é\95K\97v\82ª\82 \82é\81B
                                inf.wID = nCommand + cmd + 1;
                        }
+
                        inf.dwTypeData = menuname;
                        InsertMenuItem(hPopupMenu, lv, true, &inf);
                        lv++;
                        cmd++;
+
                        if (*p == ',' || *p == '/') {
                                p++;
-                       }
-                       else if (*p == ':') {
+
+                       else if (*p == ':') {
                                inf.fMask = MIIM_TYPE;
                                inf.fType = MFT_SEPARATOR;
                                InsertMenuItem(hPopupMenu, lv, true, &inf);
@@ -1446,6 +1470,7 @@ STDMETHODIMP COverlappedWindow::TrackPopupMenu(VARIANT text, VARIANT cmd, VARIAN
                        HIWORD(pos),
                        m_hPopupWnd,
                        NULL);
+
                DestroyMenu(hPopupMenu);
        }
        varRet.Detach(pRet);
@@ -1460,28 +1485,43 @@ STDMETHODIMP COverlappedWindow::get_HWND(long *pVal)
 
 STDMETHODIMP COverlappedWindow::GetSysColor(VARIANT typ, VARIANT *col)
 {
+       if (!col) {
+               return E_POINTER;
+       }
+       VariantInit(col);
+
        // \83V\83X\83e\83\80\83J\83\89\81[\82Ì\8eæ\93¾
+       HRESULT hr;
+
        CComVariant varType;
+       if (FAILED(hr = varType.ChangeType(VT_I2, &typ))) {
+               return hr;
+       }
+
        CComVariant varRet;
-       varType.ChangeType(VT_I2, &typ);
        varRet = (long)::GetSysColor(varType.iVal);
-       varRet.Detach(col);
-       return S_OK;
+       return varRet.Detach(col);
 }
 
 STDMETHODIMP COverlappedWindow::SetTimer(VARIANT tim, BOOL* pVal)
 {
+       if (!pVal) {
+               return E_POINTER;
+       }
+
        SafeCreateWnd();
 
-       CComVariant varTim;
        long timer = 0;
-       if (varTim.ChangeType(VT_I4, &tim) == S_OK) {
+
+       CComVariant varTim;
+       if (SUCCEEDED(varTim.ChangeType(VT_I4, &tim))) {
                timer = varTim.lVal;
        }
+
        if (timer) {
                *pVal = ::SetTimer(m_hPopupWnd, 1, timer, NULL) ? VB_TRUE : VB_FALSE;
-       }
-       else {
+
+       else {
                *pVal = ::KillTimer(m_hPopupWnd, 1) ? VB_TRUE : VB_FALSE;
        }
        return S_OK;
@@ -1494,15 +1534,19 @@ STDMETHODIMP COverlappedWindow::CheckMenu(VARIANT cmd, VARIANT mode)
        if (!m_hMenu) {
                return Error(IDS_ERR_NOCREATEMENU);
        }
+
        int nCmd = 0;
-       int nMode = 0;
-       CComVariant varCmd, varMode;
-       if (varCmd.ChangeType(VT_I2, &cmd) == S_OK) {
+       CComVariant varCmd;
+       if (SUCCEEDED(varCmd.ChangeType(VT_I2, &cmd))) {
                nCmd = varCmd.iVal;
        }
-       if (varMode.ChangeType(VT_I2, &mode) == S_OK) {
+
+       int nMode = 0;
+       CComVariant varMode;
+       if (SUCCEEDED(varMode.ChangeType(VT_I2, &mode))) {
                nMode = varMode.iVal;
        }
+
        if (nCmd >= 100) {
                // \83\81\83j\83\85\81[\83R\83}\83\93\83h\82Í100\88È\8fã\82Å\82 \82é\82Ì\82Å\81B
                MENUITEMINFO inf = {0};
@@ -1511,6 +1555,7 @@ STDMETHODIMP COverlappedWindow::CheckMenu(VARIANT cmd, VARIANT mode)
                inf.fState = nMode ? MFS_CHECKED : MFS_UNCHECKED;
                ::SetMenuItemInfo(m_hMenu, nCmd, false, &inf);
        }
+
        return S_OK;
 }
 
@@ -1520,15 +1565,19 @@ STDMETHODIMP COverlappedWindow::EnableMenu(VARIANT cmd, VARIANT mode)
        if (!m_hMenu) {
                return Error(IDS_ERR_NOCREATEMENU);
        }
+
        int nCmd = 0;
-       int nMode = 0;
-       CComVariant varCmd, varMode;
-       if (varCmd.ChangeType(VT_I2, &cmd) == S_OK) {
+       CComVariant varCmd;
+       if (SUCCEEDED(varCmd.ChangeType(VT_I2, &cmd))) {
                nCmd = varCmd.iVal;
        }
-       if (varMode.ChangeType(VT_I2, &mode) == S_OK) {
+
+       int nMode = 0;
+       CComVariant varMode;
+       if (SUCCEEDED(varMode.ChangeType(VT_I2, &mode))) {
                nMode = varMode.iVal;
        }
+
        if (nCmd >= 100) {
                // \83\81\83j\83\85\81[\83R\83}\83\93\83h\82Í100\88È\8fã\82Å\82 \82é\82Ì\82Å\81B
                MENUITEMINFO inf = {0};
@@ -1542,8 +1591,13 @@ STDMETHODIMP COverlappedWindow::EnableMenu(VARIANT cmd, VARIANT mode)
 
 STDMETHODIMP COverlappedWindow::get_CreateNoCloseWindow(BOOL *pVal)
 {
+       if (!pVal) {
+               return E_POINTER;
+       }
+
        // \83N\83\8d\81[\83Y\8bÖ\8e~\83E\83B\83\93\83h\83E?
        *pVal = windowParam.noclose ? VB_TRUE : VB_FALSE;
+
        return S_OK;
 }
 
@@ -1559,40 +1613,67 @@ STDMETHODIMP COverlappedWindow::put_CreateNoCloseWindow(BOOL newVal)
 
 STDMETHODIMP COverlappedWindow::get_Canvas(VARIANT *pVal)
 {
+       if (!pVal) {
+               return E_POINTER;
+       }
+
        // \83h\83\8d\81[\83C\83\93\83O\83C\83\93\83^\81[\83t\83F\83C\83X\82ð\93n\82·
        ::VariantInit(pVal);
-       IUnknown* pUnk = NULL;
-       if (m_pCanvas &&
-               m_pCanvas->QueryInterface(IID_IUnknown, (void**)&pUnk) == S_OK) {
+
+       if (m_pCanvas) {
+               HRESULT hr;
+               CComPtr<IUnknown> pUnk;
+               if (FAILED(hr = m_pCanvas->QueryInterface(&pUnk))) {
+                       return hr;
+               }
                pVal->vt = VT_UNKNOWN;
-               pVal->punkVal = pUnk;
+               pVal->punkVal = pUnk.Detach();
        }
+
        return S_OK;
 }
 
 STDMETHODIMP COverlappedWindow::get_Event(VARIANT *pVal)
 {
+       if (!pVal) {
+               return E_POINTER;
+       }
+
        ::VariantInit(pVal);
+
        if (m_pEvent) {
                // \83C\83x\83\93\83g\83C\83\93\83^\81[\83t\83F\83C\83X\82Ì\8eæ\93¾
-               IUnknown* pUnk = NULL;
-               if (m_pEvent->QueryInterface(IID_IUnknown, (void**)&pUnk) == S_OK) {
-                       pVal->vt = VT_UNKNOWN;
-                       pVal->punkVal = pUnk;
+               HRESULT hr;
+               CComPtr<IUnknown> pUnk;
+               if (FAILED(hr = m_pEvent->QueryInterface(&pUnk))) {
+                       return hr;
                }
+               pVal->vt = VT_UNKNOWN;
+               pVal->punkVal = pUnk.Detach();
        }
+
        return S_OK;
 }
 
 STDMETHODIMP COverlappedWindow::get_DropFiles(VARIANT *pVal)
 {
+       if (!pVal) {
+               return E_POINTER;
+       }
+
        m_dropfiles.GetPathArray(pVal);
+
        return S_OK;
 }
 
 STDMETHODIMP COverlappedWindow::get_Quit(BOOL *pVal)
 {
+       if (!pVal) {
+               return E_POINTER;
+       }
+
        *pVal = m_bQuit ? VB_TRUE : VB_FALSE;
+
        return S_OK;
 }
 
@@ -1608,24 +1689,37 @@ STDMETHODIMP COverlappedWindow::put_Quit(BOOL newVal)
 
 STDMETHODIMP COverlappedWindow::get_Form(VARIANT *pVal)
 {
+       if (!pVal) {
+               return E_POINTER;
+       }
+
        // \83t\83H\81[\83\80\82Ì\8cö\8aJ
        ::VariantInit(pVal);
+
        if (m_pForm) {
-               IUnknown* pUnk = NULL;
-               if (m_pForm->QueryInterface(IID_IUnknown, (void**)&pUnk) == S_OK) {
-                       pVal->vt = VT_UNKNOWN;
-                       pVal->punkVal = pUnk;
+               HRESULT hr;
+               CComPtr<IUnknown> pUnk;
+               if (FAILED(hr = m_pForm->QueryInterface(&pUnk))) {
+                       return hr;
                }
+               pVal->vt = VT_UNKNOWN;
+               pVal->punkVal = pUnk.Detach();
        }
        return S_OK;
 }
 
 STDMETHODIMP COverlappedWindow::get_Style(long *pVal)
 {
+       if (!pVal) {
+               return E_POINTER;
+       }
+
        if (m_hPopupWnd) {
                windowParam.style = ::GetWindowLong(m_hPopupWnd, GWL_STYLE);
        }
+
        *pVal = (long)windowParam.style;
+
        return S_OK;
 }
 
@@ -1658,6 +1752,10 @@ STDMETHODIMP COverlappedWindow::put_Exstyle(long newVal)
 
 STDMETHODIMP COverlappedWindow::get_WindowClassName(BSTR *pVal)
 {
+       if (!pVal) {
+               return E_POINTER;
+       }
+
        CComBSTR tmp(windowParam.szClassName);
        *pVal = tmp.Detach();
        return S_OK;
@@ -1720,13 +1818,17 @@ STDMETHODIMP COverlappedWindow::SetPlacement(VARIANT x, VARIANT y, VARIANT w, VA
 
 void COverlappedWindow::CreateThisInterface(VARIANT* pvarUnk)
 {
+       ATLASSERT(pvarUnk != NULL);
+
        // \82±\82Ì\83C\83\93\83^\81[\83t\83F\83C\83X\82ð\95Ô\82·
        ::VariantInit(pvarUnk);
-       IUnknown* pUnk = NULL;
-       if (QueryInterface(IID_IUnknown, (void**)&pUnk) == S_OK) {
-               pvarUnk->vt = VT_UNKNOWN;
-               pvarUnk->punkVal = pUnk;
-       }
+
+       CComPtr<IUnknown> pUnk;
+       HRESULT hr = QueryInterface(IID_IUnknown, (void**)&pUnk);
+       ATLASSERT(SUCCEEDED(hr));
+
+       pvarUnk->vt = VT_UNKNOWN;
+       pvarUnk->punkVal = pUnk.Detach();
 }
 
 STDMETHODIMP COverlappedWindow::SetWindowStyle(VARIANT frametype, VARIANT caption_system, VARIANT maxmin, VARIANT *pvarUnk)
@@ -1754,12 +1856,10 @@ STDMETHODIMP COverlappedWindow::SetWindowStyle(VARIANT frametype, VARIANT captio
        return S_OK;
 }
 
-STDMETHODIMP COverlappedWindow::CreateChild(VARIANT *pvarUnk)
+void COverlappedWindow::PurgeUnusedWindows()
 {
-       SafeCreateWnd();
-       ::VariantInit(pvarUnk);
        // \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¤
-       list<CComObject<COverlappedWindow>*>::iterator p = m_lstChild.begin();
+       std::list<CComObject<COverlappedWindow>*>::iterator p = m_lstChild.begin();
        while (p != m_lstChild.end()) {
                DWORD refCount = (*p)->m_dwRef;
                if ((*p)->m_dwRef == 1) {
@@ -1775,20 +1875,45 @@ STDMETHODIMP COverlappedWindow::CreateChild(VARIANT *pvarUnk)
                }
                p++;
        }
-       //
+}
+
+
+STDMETHODIMP COverlappedWindow::CreateChild(VARIANT *pvarUnk)
+{
+       if (!pvarUnk) {
+               return E_POINTER;
+       }
+
+       SafeCreateWnd();
+       ::VariantInit(pvarUnk);
+
+       // \96¢\8eg\97p\82Ì\83E\83B\83\93\83h\83E\82ð\8dí\8f\9c\82·\82é
+       PurgeUnusedWindows();
+
+       // \83I\83u\83W\83F\83N\83g\82Ì\8dì\90¬
        CComObject<COverlappedWindow>* pChild = NULL;
-       if (pChild->CreateInstance(&pChild) == S_OK) {
-               pChild->AddRef();
-               pChild->SetParent(m_hPopupWnd);
-               pChild->put_WaitCursor(m_dWaitCursor);
-               m_lstChild.push_back(pChild);
-               // \83C\83\93\83^\81[\83t\83F\83C\83X\82ð\95Ô\82·
-               IUnknown* pUnk = NULL;
-               if (pChild->QueryInterface(IID_IUnknown, (void**)&pUnk) == S_OK) {
-                       pvarUnk->vt = VT_UNKNOWN;
-                       pvarUnk->punkVal = pUnk;
-               }
+       HRESULT hr;
+       if (FAILED(hr = CComObject<COverlappedWindow>::CreateInstance(&pChild))) {
+               return hr;
        }
+
+       // \95Ô\8bp\97p\83C\83\93\83^\81[\83t\83F\83C\83X\82Ì\8eæ\93¾
+       CComPtr<IUnknown> pUnk;
+       if (FAILED(hr = pChild->QueryInterface(&pUnk))) {
+               delete pChild;
+               return hr;
+       }
+
+       pChild->SetParent(m_hPopupWnd);
+       pChild->put_WaitCursor(m_dWaitCursor);
+
+       // \83\8a\83X\83g\82É\95Û\91\82·\82é\82½\82ß\8eQ\8fÆ\83J\83E\83\93\83g+1\82·\82é.
+       pChild->AddRef();
+       m_lstChild.push_back(pChild);
+
+       // \83C\83\93\83^\81[\83t\83F\83C\83X\82ð\95Ô\82·
+       pvarUnk->vt = VT_UNKNOWN;
+       pvarUnk->punkVal = pUnk.Detach();
        return S_OK;
 }
 
@@ -1811,7 +1936,7 @@ void COverlappedWindow::SetWaitParam(int *count, HWND *hWnd, HANDLE *hEvent)
                hWnd[*count] = m_hPopupWnd;
                (*count)++;
                // \83`\83\83\83C\83\8b\83h\82ð\93o\98^
-               list<CComObject<COverlappedWindow>*>::iterator p = m_lstChild.begin();
+               std::list<CComObject<COverlappedWindow>*>::iterator p = m_lstChild.begin();
                while ((p != m_lstChild.end()) && (*count < MAXIMUM_WAIT_OBJECTS)) {
                        // \83`\83\83\83C\83\8b\83h\82ª\8f\8a\97L\82·\82é\83`\83\83\83C\83\8b\83h\82ð\8dÄ\8bN\93I\82É\8cÄ\82Ñ\8fo\82·
                        (*p)->SetWaitParam(count, hWnd, hEvent);
@@ -1936,7 +2061,7 @@ STDMETHODIMP COverlappedWindow::put_AutoClose(BOOL newVal)
        return S_OK;
 }
 
-void COverlappedWindow::CreateWindowList(list<HWND>& lstWnd, BOOL bSearchRoot)
+void COverlappedWindow::CreateWindowList(std::list<HWND>& lstWnd, BOOL bSearchRoot)
 {
        HWND* hWnds = NULL;
        if (m_hParentWnd && bSearchRoot) {
@@ -1948,7 +2073,7 @@ void COverlappedWindow::CreateWindowList(list<HWND>& lstWnd, BOOL bSearchRoot)
        }
        else {
                // \82±\82±\82ª\8dª\8c³\82Å\82 \82é
-               list<CComObject<COverlappedWindow>*>::iterator p = m_lstChild.begin();
+               std::list<CComObject<COverlappedWindow>*>::iterator p = m_lstChild.begin();
                DWORD stl = ::GetWindowLong(m_hPopupWnd, GWL_STYLE);
                if (stl & WS_VISIBLE) {
                        // \95\\8e¦\82³\82ê\82Ä\82¢\82é\83E\83B\83\93\83h\83E\82Ì\82Ý\82ð\93o\98^\82·\82é
@@ -1969,11 +2094,11 @@ void COverlappedWindow::CreateWindowList(list<HWND>& lstWnd, BOOL bSearchRoot)
 void COverlappedWindow::MoveNextOverlapped()
 {
        // \8f\87\8f\98\83\8a\83X\83g\82Ì\90\90¬\82ð\88Ë\97\8a\82·\82é
-       list<HWND>lstWnd;
+       std::list<HWND>lstWnd;
        CreateWindowList(lstWnd, true);
        // \8c»\8dÝ\88Ê\92u\82ð\94c\88¬\82·\82é
        HWND hActiveWnd = ::GetActiveWindow();
-       list<HWND>::iterator p = lstWnd.begin();
+       std::list<HWND>::iterator p = lstWnd.begin();
        while (p != lstWnd.end()) {
                // \97ñ\8b\93
                if (hActiveWnd == *p) {
@@ -2026,7 +2151,7 @@ STDMETHODIMP COverlappedWindow::put_WaitCursor(short newVal)
                ::SendMessage(m_hPopupWnd, WM_SETCURSOR, (WPARAM)m_hPopupWnd, 0);
        }
        // \83`\83\83\83C\83\8b\83h\82ð\8e\9d\82Á\82Ä\82¢\82é\8fê\8d\87\82Í\81A\83`\83\83\83C\83\8b\83h\82É\82à\83E\83F\83C\83g\83J\81[\83\\83\8b\82ð\93K\97p\82·\82é
-       list<CComObject<COverlappedWindow>*>::iterator pWnd = m_lstChild.begin();
+       std::list<CComObject<COverlappedWindow>*>::iterator pWnd = m_lstChild.begin();
        while (pWnd != m_lstChild.end()) {
                (*pWnd)->put_WaitCursor(newVal);
                pWnd++;
@@ -2064,14 +2189,15 @@ STDMETHODIMP COverlappedWindow::CenterWindow()
        if (m_hParentWnd) {
                // \90e\83E\83B\83\93\83h\83E\82ª\82 \82ê\82Î\81A\82»\82Ì\92\86\89\9b\82É\88Ê\92u\82 \82í\82¹\82·\82é
                ::GetWindowRect(m_hParentWnd, &rct);
-       }
-       else {
+
+       else {
                HWND hwnd = ::GetDesktopWindow();
                if (!hwnd) {
                        return S_OK;
                }
                ::GetWindowRect(hwnd, &rct);
        }
+
        int x = rct.left + (rct.right - rct.left) / 2 - windowParam.width / 2;
        int y = rct.top + (rct.bottom - rct.top) / 2 - windowParam.height / 2;
        WINDOWPLACEMENT pls = {0};
@@ -2081,16 +2207,20 @@ STDMETHODIMP COverlappedWindow::CenterWindow()
        pls.rcNormalPosition.bottom = y + windowParam.height;
        pls.rcNormalPosition.right = x + windowParam.width;
        ::SetWindowPlacement(m_hPopupWnd, &pls);
+
        return S_OK;
 }
 
 STDMETHODIMP COverlappedWindow::get_ClassObject(VARIANT* pVal)
 {
+       if (!pVal) {
+               return E_POINTER;
+       }
+
        ::VariantInit(pVal);
        if (m_pClassDisp) {
-               m_pClassDisp->AddRef();
-               pVal->pdispVal = m_pClassDisp;
-               pVal->vt = VT_UNKNOWN;
+               CComVariant tmp(m_pClassDisp);
+               return tmp.Detach(pVal);
        }
        return S_OK;
 }
@@ -2099,7 +2229,9 @@ STDMETHODIMP COverlappedWindow::put_ClassObject(VARIANT newVal)
 {
        if (m_pClassDisp) {
                m_pClassDisp->Release();
+               m_pClassDisp = NULL;
        }
+
        if (newVal.vt == VT_DISPATCH) {
                m_pClassDisp = newVal.pdispVal;
                m_pClassDisp->AddRef();
@@ -2160,6 +2292,10 @@ STDMETHODIMP COverlappedWindow::get_innerWidth(double *pVal)
 
 STDMETHODIMP COverlappedWindow::get_innerHeight(double *pVal)
 {
+       if (!pVal) {
+               return E_POINTER;
+       }
+
        SafeCreateWnd();
        RECT rct;
        ::GetClientRect(m_hPopupWnd, &rct);
@@ -2170,13 +2306,20 @@ STDMETHODIMP COverlappedWindow::get_innerHeight(double *pVal)
        ::DPtoLP(hdc, &pt, 1);
        ::SetMapMode(hdc, md);
        ::ReleaseDC(m_hPopupWnd, hdc);
+
        *pVal = pt.y / 10.;
+
        return S_OK;
 }
 
 STDMETHODIMP COverlappedWindow::get_AutoReleaseClassObject(BOOL *pVal)
 {
+       if (!pVal) {
+               return E_POINTER;
+       }
+
        *pVal = m_bAutoReleaseClassObject ? VB_TRUE : VB_FALSE;
+
        return S_OK;
 }
 
@@ -2188,7 +2331,12 @@ STDMETHODIMP COverlappedWindow::put_AutoReleaseClassObject(BOOL newVal)
 
 STDMETHODIMP COverlappedWindow::get_DefaultAction(BOOL *pVal)
 {
+       if (!pVal) {
+               return E_POINTER;
+       }
+
        *pVal = m_bDefaultAction ? VB_TRUE : VB_FALSE;
+
        return S_OK;
 }
 
@@ -2225,7 +2373,7 @@ STDMETHODIMP COverlappedWindow::GetClipboardText(VARIANT *pVarText)
                        // UNICODE\95\8e\9a\97ñ\82ª\82 \82ê\82Î\81A\82»\82¿\82ç\82ð\97D\90æ\82µ\82Ä\8eæ\93¾\82·\82é
                        HGLOBAL hGlobal = ::GetClipboardData(CF_UNICODETEXT);
                        if (hGlobal) {
-                               LPWSTR p = (LPWSTR)GlobalLock(hGlobal);
+                               LPCWSTR p = (LPCWSTR)GlobalLock(hGlobal);
                                if (p) {
                                        CComBSTR wstr(p);
                                        GlobalUnlock(hGlobal);
@@ -2233,12 +2381,12 @@ STDMETHODIMP COverlappedWindow::GetClipboardText(VARIANT *pVarText)
                                        pVarText->vt = VT_BSTR;
                                }
                        }
-               }
-               else if (IsClipboardFormatAvailable(CF_TEXT)) {
+
+               else if (IsClipboardFormatAvailable(CF_TEXT)) {
                        // UNICODE\95\8e\9a\97ñ\82ª\82È\82¢\8fê\8d\87
                        HGLOBAL hGlobal = ::GetClipboardData(CF_TEXT);
                        if (hGlobal) {
-                               LPCSTR p = (LPSTR)GlobalLock(hGlobal);
+                               LPCSTR p = (LPCSTR)GlobalLock(hGlobal);
                                if (p) {
                                        CComBSTR wstr(p);
                                        GlobalUnlock(hGlobal);
index 1288894..a7b99ce 100644 (file)
@@ -34,9 +34,9 @@ public:
        }
        void Clear()
        {
-               list<LPTSTR>::iterator p = m_lstPath.begin();
+               std::list<LPTSTR>::iterator p = m_lstPath.begin();
                while (p != m_lstPath.end()) {
-                       delete[] * p;
+                       delete[] *p;
                        p = m_lstPath.erase(p);
                }
        }
@@ -44,8 +44,7 @@ public:
        {
                Clear();
                int count = ::DragQueryFile(hDrop, -1, NULL, 0);
-               int i;
-               for (i = 0; i < count; i++) {
+               for (int i = 0; i < count; i++) {
                        DWORD sz = ::DragQueryFile(hDrop, i, NULL, 0);
                        LPTSTR pBuf = new TCHAR[sz + 1];
                        ::DragQueryFile(hDrop, i, pBuf, MAX_PATH);
@@ -63,7 +62,7 @@ public:
                VARIANT* pvars;
                if (SafeArrayAccessData(pArray, (void**)&pvars) == S_OK) {
                        int i = 0;
-                       list<LPTSTR>::iterator p = m_lstPath.begin();
+                       std::list<LPTSTR>::iterator p = m_lstPath.begin();
                        while (p != m_lstPath.end()) {
                                CComVariant wbuf(*p);
                                wbuf.Detach(&pvars[i]);
@@ -76,8 +75,9 @@ public:
                pvarPathName->vt = VT_ARRAY | VT_VARIANT;
                pvarPathName->parray = pArray;
        }
+
 protected:
-       list<LPTSTR> m_lstPath;
+       std::list<LPTSTR> m_lstPath;
 };
 
 /////////////////////////////////////////////////////////////////////////////
@@ -164,7 +164,7 @@ class ATL_NO_VTABLE COverlappedWindow :
        public CProxy_IOverlappedWindowEvents< COverlappedWindow >
 {
 public:
-       COverlappedWindow();
+       COverlappedWindow() {};
 
        DECLARE_GET_CONTROLLING_UNKNOWN()
        DECLARE_REGISTRY_RESOURCEID(IDR_OVERLAPPEDWINDOW)
@@ -231,6 +231,21 @@ public:
 protected:
        HRESULT ClassObjectInvoke(LPCWSTR handler);
 
+public:
+       ULONG InternalAddRef()
+       {
+               ULONG ref = CComObjectRootEx<CComSingleThreadModel>::InternalAddRef();
+               ATLTRACE(_TEXT("*addref=%d\n"), ref);
+               return ref;
+       }
+
+       ULONG InternalRelease()
+       {
+               ULONG ref = CComObjectRootEx<CComSingleThreadModel>::InternalRelease();
+               ATLTRACE(_TEXT("*release=%d\n"), ref);
+               return ref;
+       }
+
        // IOverlappedWindow
 public:
        STDMETHOD(GetClipboardText)(/*[out]*/VARIANT* pVarText);
@@ -253,7 +268,7 @@ public:
        STDMETHOD(put_ExitCode)(/*[in]*/ short newVal);
        STDMETHOD(get_Object)(/*[in,optional]*/VARIANT idx, /*[out, retval]*/ VARIANT *pVal);
        void MoveNextOverlapped();
-       void CreateWindowList(list<HWND>& lstWnd, BOOL bSearchRoot);
+       void CreateWindowList(std::list<HWND>& lstWnd, BOOL bSearchRoot);
        STDMETHOD(get_AutoClose)(/*[out, retval]*/ BOOL *pVal);
        STDMETHOD(put_AutoClose)(/*[in]*/ BOOL newVal);
        STDMETHOD(DoModal)(/*[out,retval]*/VARIANT* retcode);
@@ -346,19 +361,22 @@ protected:
        CComObject<CForm>* m_pForm;
        CComObject<CEvent>* m_pEvent;
        CComObject<CObjectMap>* m_pObject;
-       list<CComObject<CEvent>*> m_lstEvent;
-       list<CComObject<COverlappedWindow>*> m_lstChild;
-       vector<CComVariant> m_vectorObject;
+       std::list<CComObject<CEvent>*> m_lstEvent;
+       std::list<CComObject<COverlappedWindow>*> m_lstChild;
+       std::vector<CComVariant> m_vectorObject;
        dropfiledata m_dropfiles;
        CRITICAL_SECTION m_objEventDataProtection;
        BOOL m_bAutoReleaseClassObject;
        BOOL m_bDefaultAction;
+
 protected:
        static LRESULT  CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
        void AddEvent(int message, WPARAM wParam, LPARAM lParam);
        void AddEventSingle(int message, WPARAM wParam, LPARAM lParam);
        void CreateThisInterface(VARIANT* pvarUnk);
        void SetTitle();
+       void PurgeUnusedWindows();
+
 protected:
        IDispatch* m_pClassDisp;
        int m_dWaitCursor;
@@ -373,5 +391,5 @@ protected:
        HWND m_hPopupWnd;
        HWND m_hParentWnd;
        HICON m_hIcon;
-       map<int, CComBSTR> m_cMenuMap;
+       std::map<int, CComBSTR> m_cMenuMap;
 };
index 4e1ba03..05fd7eb 100644 (file)
@@ -39,16 +39,17 @@ STDMETHODIMP CPrivateProfile::OpenSection(VARIANT text, VARIANT* pVal)
        }
        ATLASSERT(pSection);
 
-       pSection->m_szProfilePath = m_bstr_profilepath;
-       pSection->m_szSectionName = varText.bstrVal;
-
-       IUnknown* pUnk = NULL;
-       if (FAILED(hr = pSection->QueryInterface(IID_IUnknown, (void**)&pUnk))) {
+       CComPtr<IUnknown> pUnk = NULL;
+       if (FAILED(hr = pSection->QueryInterface(&pUnk))) {
+               delete pSection;
                return hr;
        }
        ATLASSERT(pUnk);
 
+       pSection->m_szProfilePath = m_bstr_profilepath;
+       pSection->m_szSectionName = varText.bstrVal;
+
        pVal->vt = VT_UNKNOWN;
-       pVal->punkVal = pUnk;
+       pVal->punkVal = pUnk.Detach();
        return S_OK;
 }
index 3d08a04..cdef714 100644 (file)
@@ -61,9 +61,22 @@ BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID /*lpReserved*/)
                //
                _Module.Init(ObjectMap, hInstance, &LIBID_SERAPHYSCRIPTTOOLSLib);
                DisableThreadLibraryCalls(hInstance);
-       }
-       else if (dwReason == DLL_PROCESS_DETACH)
+
+#ifdef _DEBUG
+               //_CrtSetReportMode(_CRT_ERROR, _CRTDBG_MODE_FILE);
+               //_CrtSetReportFile(_CRT_ERROR, _CRTDBG_FILE_STDERR);
+               _CrtSetDbgFlag(_CRTDBG_LEAK_CHECK_DF | _CRTDBG_ALLOC_MEM_DF | _CRTDBG_CHECK_EVERY_128_DF);
+               //_CrtSetBreakAlloc(898);
+#endif
+
+       } else if (dwReason == DLL_PROCESS_DETACH) {
                _Module.Term();
+
+#ifdef _DEBUG
+               _CrtDumpMemoryLeaks();
+#endif
+       }
+
        return TRUE;    // ok
 }
 
index 1917926..c4b7db2 100644 (file)
@@ -4,7 +4,7 @@
 
 
  /* File created by MIDL compiler version 8.00.0603 */
-/* at Sun Aug 16 18:41:49 2015
+/* at Tue Aug 18 01:30:13 2015
  */
 /* Compiler settings for SeraphyScriptTools.idl:
     Oicf, W1, Zp8, env=Win64 (32b run), target_arch=AMD64 8.00.0603 
index 074edf4..074b7d1 100644 (file)
--- a/Shell.cpp
+++ b/Shell.cpp
@@ -1,11 +1,12 @@
 // Shell.cpp : CShell \82Ì\83C\83\93\83v\83\8a\83\81\83\93\83e\81[\83V\83\87\83\93
 #include "stdafx.h"
+
 #include "SeraphyScriptTools.h"
 #include "Shell.h"
 #include "generic.h"
+
 #include <list>
 #include <vector>
-using namespace std;
 
 #pragma comment(lib, "Version.lib")
 
@@ -71,14 +72,20 @@ STDMETHODIMP CShell::ShellExecute(VARIANT path, VARIANT param, VARIANT initdir,
        info.nShow = nShow;
        if (ShellExecuteEx(&info)) {
                // ShellExecObj\82Ì\90\90¬
+               HRESULT hr;
                CComObject<CShellExecObj>* pExec = NULL;
-               if (pExec->CreateInstance(&pExec) == S_OK) {
-                       pExec->m_hProcess = info.hProcess;
-                       IUnknown* pUnk = NULL;
-                       pExec->QueryInterface(IID_IUnknown, (void**)&pUnk);
-                       punkVal->vt = VT_UNKNOWN;
-                       punkVal->punkVal = pUnk;
+               if (FAILED(hr = CComObject<CShellExecObj>::CreateInstance(&pExec))) {
+                       return hr;
+               }
+               pExec->m_hProcess = info.hProcess;
+               
+               IUnknown* pUnk = NULL;
+               if (FAILED(hr = pExec->QueryInterface(&pUnk))) {
+                       delete pExec;
+                       return hr;
                }
+               punkVal->vt = VT_UNKNOWN;
+               punkVal->punkVal = pUnk;
        }
        return S_OK;
 }
@@ -321,38 +328,45 @@ STDMETHODIMP CShell::ParseName(VARIANT text, VARIANT *pVal)
 {
        ::VariantInit(pVal);
 
+       HRESULT hr;
        CComVariant varText;
-       if (varText.ChangeType(VT_BSTR, &text) == S_OK) {
-               CComObject<CParseName>* pParse = NULL;
-               if (pParse->CreateInstance(&pParse) == S_OK) {
-                       pParse->m_bstr_path = (LPCWSTR)varText.bstrVal;
-                       IUnknown* pUnk = NULL;
-                       if (pParse->QueryInterface(IID_IUnknown, (void**)&pUnk) == S_OK) {
-                               pVal->vt = VT_UNKNOWN;
-                               pVal->punkVal = pUnk;
-                       }
-               }
+       if (FAILED(hr = varText.ChangeType(VT_BSTR, &text))) {
+               return hr;
        }
-       return S_OK;
-}
 
-/////////////////////////////////////////////////////////////////////////////
-// CParseName
+       // COM\83I\83u\83W\83F\83N\83g\82Ì\8dì\90¬
+       CComObject<CParseName>* pParse = NULL;
+       if (FAILED(hr = CComObject<CParseName>::CreateInstance(&pParse))) {
+               return hr;
+       }
 
-STDMETHODIMP CParseName::InterfaceSupportsErrorInfo(REFIID riid)
-{
-       static const IID* arr[] = {
-               &IID_ISeraphyScriptTool_ParseName
-       };
+       // COM\83X\83}\81[\83g\83|\83C\83\93\83^\82É\95Û\8e\9d\82·\82é.(\8e©\93®\83\8a\83\8a\81[\83X)
+       CComPtr<ISeraphyScriptTool_ParseName> pIntf;
+       if (FAILED(hr = pParse->QueryInterface(
+               IID_ISeraphyScriptTool_ParseName, reinterpret_cast<void**>(&pIntf)))) {
+               delete pParse;
+               return hr;
+       }
 
-       for (int i = 0; i < sizeof(arr) / sizeof(arr[0]); i++) {
-               if (IsEqualGUID(*arr[i], riid)) {
-                       return S_OK;
-               }
+       // \83p\83X\82ð\90Ý\92è\82·\82é.
+       if (FAILED(hr = pIntf->put_PathName(varText.bstrVal))) {
+               return hr;
+       }
+
+       // IUnknown\82É\95Ï\8a·\82·\82é
+       IUnknown* pUnk = NULL;
+       if (FAILED(hr = pIntf->QueryInterface(IID_IUnknown, (void**)&pUnk))) {
+               return hr;
        }
-       return S_FALSE;
+
+       pVal->vt = VT_UNKNOWN;
+       pVal->punkVal = pUnk;
+       return S_OK;
 }
 
+/////////////////////////////////////////////////////////////////////////////
+// CParseName
+
 STDMETHODIMP CParseName::get_PathName(BSTR *pVal)
 {
        return m_bstr_path.CopyTo(pVal);
diff --git a/Shell.h b/Shell.h
index 5d5b381..66b8c78 100644 (file)
--- a/Shell.h
+++ b/Shell.h
@@ -19,18 +19,17 @@ public:
        {
                m_bConfirm = true;
                m_bSilent = false;
-               //
                m_pMainWindow = NULL;
-               m_pMalloc = NULL;
-               SHGetMalloc(&m_pMalloc);
+       }
+       
+       HRESULT FinalConstruct()
+       {
+               return SHGetMalloc(&m_pMalloc);
        }
 
        void FinalRelease()
        {
-               if (m_pMalloc) {
-                       m_pMalloc->Release();
-                       m_pMalloc = NULL;
-               }
+               m_pMalloc.Release();
        }
 
        HWND GetMainWindow()
@@ -76,7 +75,7 @@ public:
 protected:
        BOOL m_bSilent;
        BOOL m_bConfirm;
-       IMalloc* m_pMalloc;
+       CComPtr<IMalloc> m_pMalloc;
        IOverlappedWindow* m_pMainWindow;
 
        HRESULT FileOperationCore(UINT wFunc, FILEOP_FLAGS flag, VARIANT* from, VARIANT* to, VARIANT* pResult);
@@ -90,7 +89,7 @@ protected:
 // CShellExecObj
 class ATL_NO_VTABLE CShellExecObj :
        public CComObjectRootEx<CComSingleThreadModel>,
-       //      public CComCoClass<CShellExecObj, &CLSID_ShellExecObj>,
+       public CComCoClass<CShellExecObj, &CLSID_ShellExecObj>,
        public IDispatchImpl<IShellExecObj, &IID_IShellExecObj, &LIBID_SERAPHYSCRIPTTOOLSLib>
 {
 public:
@@ -98,6 +97,7 @@ public:
        {
                m_hProcess = NULL;
        }
+
        void FinalRelease()
        {
                if (m_hProcess) {
@@ -105,7 +105,8 @@ public:
                        m_hProcess = NULL;
                }
        }
-       DECLARE_REGISTRY_RESOURCEID(IDR_SHELLEXECOBJ)
+
+       //DECLARE_REGISTRY_RESOURCEID(IDR_SHELLEXECOBJ)
 
        DECLARE_PROTECT_FINAL_CONSTRUCT()
 
@@ -118,7 +119,11 @@ public:
 public:
        STDMETHOD(get_ExitCode)(/*[out, retval]*/ long *pVal);
        STDMETHOD(Wait)(/*[in,optional]*/VARIANT tim,/*[out,retval]*/VARIANT* pVal);
+
+protected:
        HANDLE m_hProcess;
+
+       friend class CShell;
 };
 
 // shell.h : CParseName \82Ì\90é\8c¾
@@ -129,7 +134,7 @@ public:
 class ATL_NO_VTABLE CParseName :
        public CComObjectRootEx<CComSingleThreadModel>,
        public CComCoClass<CParseName, &CLSID_ParseName>,
-       public ISupportErrorInfo,
+       public ISupportErrorInfoImpl<&IID_ISeraphyScriptTool_ParseName>,
        public IDispatchImpl<ISeraphyScriptTool_ParseName, &IID_ISeraphyScriptTool_ParseName, &LIBID_SERAPHYSCRIPTTOOLSLib>
 {
 public:
@@ -147,9 +152,6 @@ public:
                COM_INTERFACE_ENTRY(ISupportErrorInfo)
        END_COM_MAP()
 
-       // ISupportsErrorInfo
-       STDMETHOD(InterfaceSupportsErrorInfo)(REFIID riid);
-
        // ISeraphyScriptTool_ParseName
 public:
        STDMETHOD(get_Directory)(/*[out, retval]*/ BSTR *pVal);
@@ -163,5 +165,7 @@ public:
        STDMETHOD(put_FileName)(/*[in]*/ BSTR newVal);
        STDMETHOD(get_PathName)(/*[out, retval]*/ BSTR *pVal);
        STDMETHOD(put_PathName)(/*[in]*/ BSTR newVal);
+
+protected:
        CComBSTR m_bstr_path;
 };
index f34e8f0..23de5ac 100644 (file)
@@ -8,5 +8,3 @@
 #include <statreg.h>
 #include <statreg.cpp>
 #endif
-
-// FIXME: #include <atlimpl.cpp>
index 5b830dd..775a642 100644 (file)
--- a/StdAfx.h
+++ b/StdAfx.h
 #endif
 #endif 
 
+// \83f\83o\83b\83O\83q\81[\83v
+#ifdef _DEBUG
+#define CRTDBG_MAP_ALLOC
+#include <crtdbg.h>
+#endif
+
 #include <atlbase.h>
 
 // CComModule \83N\83\89\83X\82©\82ç\94h\90\82µ\82½\83N\83\89\83X\82ð\8eg\97p\82µ\82Ä\81A\83I\81[\83o\81[\83\89\83C\83h\82·\82é\8fê\8d\87
index 5b6c707..53614fc 100644 (file)
@@ -3,8 +3,8 @@
 #include "SeraphyScriptTools.h"
 #include "TreeItem.h"
 #include "objectmap.h"
+
 #include <list>
-using namespace std;
 
 
 /////////////////////////////////////////////////////////////////////////////
@@ -13,7 +13,7 @@ using namespace std;
 BOOL CTreeItem::DeleteTreeItemWithData(HWND hWnd, HTREEITEM hItem)
 {
        HTREEITEM hRoot = hItem;
-       list<HTREEITEM> lst;
+       std::list<HTREEITEM> lst;
        lst.push_back(hItem);
        while (!lst.empty()) {
                hItem = lst.front();
@@ -48,14 +48,31 @@ BOOL CTreeItem::DeleteTreeItemWithData(HWND hWnd, HTREEITEM hItem)
        return true;
 }
 
-void CTreeItem::CreateTreeItem(HWND hWnd, HTREEITEM hParent, LPCTSTR text, IUnknown **punkVal)
+/**
+ * \83c\83\8a\81[\83A\83C\83e\83\80\82ð\95Û\8e\9d\82·\82é\83I\83u\83W\83F\83N\83g\82ð\90\90¬\82µ\82Ä\95Ô\82·.
+ * IUnknown\82Í\8eQ\8fÆ\83J\83E\83\93\83g1\82É\90Ý\92è\82³\82ê\82Ä\82¢\82é\82½\82ß\81A\8cÄ\82Ñ\8fo\82µ\91¤\82ÅRelease\82ª\95K\97v.
+ */
+HRESULT CTreeItem::CreateTreeItem(HWND hWnd, HTREEITEM hParent, LPCTSTR text, IUnknown **punkVal)
 {
+       if (!punkVal) {
+               return E_POINTER;
+       }
+       *punkVal = NULL;
+
        // \83A\83C\83e\83\80\82ª\95Û\97L\82·\82é\98A\91z\94z\97ñ\82ð\90\90¬\82·\82é
-       IUnknown* pUnk = NULL;
+
+       HRESULT hr;
+
        CComObject<CObjectMap>* pMap = NULL;
-       if (SUCCEEDED(pMap->CreateInstance(&pMap))) {
-               pMap->QueryInterface(IID_IUnknown, (void**)&pUnk);
+       if (FAILED(hr = CComObject<CObjectMap>::CreateInstance(&pMap))) {
+               return hr;
        }
+       CComPtr<IUnknown> pMapUnk;
+       if (FAILED(hr = pMap->QueryInterface(&pMapUnk))) {
+               delete pMap;
+               return hr;
+       }
+
        // \91}\93ü\82·\82é\83A\83C\83e\83\80\82Ì\92è\8b`
        ATL::CString tmp(text);
        TVINSERTSTRUCT is = {0};
@@ -64,21 +81,319 @@ void CTreeItem::CreateTreeItem(HWND hWnd, HTREEITEM hParent, LPCTSTR text, IUnkn
        is.item.mask = TVIF_TEXT | TVIF_PARAM;
        is.item.pszText = tmp.GetBuffer();
        is.item.cchTextMax = tmp.GetLength();
+
+       IUnknown* pUnk = NULL;
+       if (FAILED(hr = pMapUnk.CopyTo(&pUnk))) {
+               return hr;
+       }
        is.item.lParam = (LPARAM)pUnk;
 
        HTREEITEM hNewItem = TreeView_InsertItem(hWnd, &is);
-       if (hNewItem) {
-               // \83A\83C\83e\83\80\82Ö\82Ì\83I\83u\83W\83F\83N\83g\82ð\8dì\90¬\82·\82é
-               CComObject<CTreeItem>* pItem = NULL;
-               if (SUCCEEDED(pItem->CreateInstance(&pItem))) {
-                       pItem->SetParam(hWnd, hNewItem);
-                       pItem->QueryInterface(IID_IUnknown, (void**)punkVal);
-               }
+       if (!hNewItem) {
+               // \93o\98^\82³\82ê\82È\82©\82Á\82½\8fê\8d\87\82Í\83^\83O\83A\83C\83e\83\80\82É\8aÖ\98A\82Ã\82¯\82½pUnk\82ð\89ð\95ú\82·\82é
+               pUnk->Release();
+               return E_FAIL; // \95s\96¾\82È\83G\83\89\81[
+       }
+
+       // \83A\83C\83e\83\80\82Ö\82Ì\83I\83u\83W\83F\83N\83g\82ð\8dì\90¬\82·\82é
+       CComObject<CTreeItem>* pItem = NULL;
+       if (FAILED(hr = CComObject<CTreeItem>::CreateInstance(&pItem))) {
+               return hr;
+       }
+       pItem->SetParam(hWnd, hNewItem);
+
+       if (FAILED(hr = pItem->QueryInterface(punkVal))) {
+               delete pItem;
+               return hr;
        }
+       return S_OK;
 }
 
 STDMETHODIMP CTreeItem::IsValid(BOOL *pResult)
 {
+       if (!pResult) {
+               return E_FAIL;
+       }
+
        *pResult = (m_hItem != NULL) ? VB_TRUE : VB_FALSE;
+
+       return S_OK;
+}
+
+STDMETHODIMP CTreeItem::Sort()
+{
+       HRESULT ret = InitialCheck();
+       if (ret == S_OK) {
+               if (m_hItem) {
+                       TreeView_SortChildren(m_hWnd, m_hItem, 0);
+               }
+               else {
+                       // \95s\90³\82È\83A\83C\83e\83\80\82ð\8eQ\8fÆ\82µ\82Ä\82¢\82é
+                       ret = DISP_E_EXCEPTION;
+               }
+       }
+       return ret;
+}
+
+STDMETHODIMP CTreeItem::Expand()
+{
+       HRESULT ret = InitialCheck();
+       if (ret == S_OK) {
+               if (m_hItem) {
+                       TreeView_Expand(m_hWnd, m_hItem, TVE_EXPAND);
+               }
+               else {
+                       // \95s\90³\82È\83A\83C\83e\83\80\82ð\8eQ\8fÆ\82µ\82Ä\82¢\82é
+                       ret = DISP_E_EXCEPTION;
+               }
+       }
+       return ret;
+}
+
+STDMETHODIMP CTreeItem::Select()
+{
+       HRESULT ret = InitialCheck();
+       if (ret == S_OK) {
+               if (m_hItem) {
+                       TreeView_SelectItem(m_hWnd, m_hItem);
+               }
+               else {
+                       // \95s\90³\82È\83A\83C\83e\83\80\82ð\8eQ\8fÆ\82µ\82Ä\82¢\82é
+                       ret = DISP_E_EXCEPTION;
+               }
+       }
+       return ret;
+}
+
+STDMETHODIMP CTreeItem::Erase()
+{
+       HRESULT ret = InitialCheck();
+       if (ret == S_OK) {
+               if (m_hItem) {
+                       if (DeleteTreeItemWithData(m_hWnd, m_hItem)) {
+                               // \8dí\8f\9c\82É\90¬\8c÷\82µ\82½\82ç\81A\82±\82Ì\83n\83\93\83h\83\8b\82ð\96³\8cø\82É\82·\82é
+                               m_hWnd = NULL;
+                               m_hItem = NULL;
+                       }
+               }
+               else {
+                       // \95s\90³\82È\83A\83C\83e\83\80\82ð\8eQ\8fÆ\82µ\82Ä\82¢\82é
+                       ret = DISP_E_EXCEPTION;
+               }
+       }
+       return ret;
+}
+
+STDMETHODIMP CTreeItem::Create(/*[in]*/VARIANT text,/*[out,retval]*/IUnknown** punkVal)
+{
+       // \83A\83C\83e\83\80\82Ì\8dì\90¬
+       *punkVal = NULL;
+       HRESULT ret = InitialCheck();
+       if (FAILED(ret)) {
+               return ret;
+       }
+
+       if (m_hItem) {
+               CComVariant str;
+               ATL::CString mes(_TEXT(""));
+               if (str.ChangeType(VT_BSTR, &text) == S_OK) {
+                       mes = str.bstrVal;
+               }
+               CreateTreeItem(m_hWnd, m_hItem, mes, punkVal);
+               return S_OK;
+       }
+       // \95s\90³\82È\83A\83C\83e\83\80\82ð\8eQ\8fÆ\82µ\82Ä\82¢\82é
+       return DISP_E_EXCEPTION;
+}
+
+STDMETHODIMP CTreeItem::get_Object(/*[in,optional]*/VARIANT idx, /*[out, retval]*/ VARIANT *pVal)
+{
+       // \83A\83C\83e\83\80\82É\8aÖ\98A\95t\82¯\82ç\82ê\82½\98A\91z\94z\97ñ\83I\83u\83W\83F\83N\83g\82ð\8eæ\93¾\82·\82é
+       ::VariantInit(pVal);
+       HRESULT ret = InitialCheck();
+       if (!m_hItem) {
+               ret = DISP_E_EXCEPTION;
+       }
+       if (ret == S_OK) {
+               TVITEM itm = {0};
+               itm.mask = TVIF_PARAM;
+               itm.hItem = m_hItem;
+               if (TreeView_GetItem(m_hWnd, &itm)) {
+                       IUnknown* pUnk = (IUnknown*)itm.lParam;
+                       if (pUnk) {
+                               pUnk->AddRef();
+                               pVal->vt = VT_UNKNOWN;
+                               pVal->punkVal = pUnk;
+                       }
+               }
+       }
+       return ret;
+}
+
+HRESULT CTreeItem::InitialCheck()
+{
+       // \83E\83B\83\93\83h\83E\82ª\97L\8cø\82©\8c\9f\8d¸\82·\82é
+       if (m_hWnd && ::IsWindow(m_hWnd)) {
+               return S_OK;
+       }
+       return Error(IDS_ERR_TREEERROR);
+}
+
+STDMETHODIMP CTreeItem::get_Text(/*[out, retval]*/ BSTR *pVal)
+{
+       // \83e\83L\83X\83g\82Ì\8eæ\93¾
+       HRESULT hr;
+       if (FAILED(hr = InitialCheck())) {
+               return hr;
+       }
+       if (!m_hItem) {
+               // \95s\90³\82È\83A\83C\83e\83\80\82ð\8eQ\8fÆ\82µ\82Ä\82¢\82é
+               return DISP_E_EXCEPTION;
+       }
+
+       TCHAR text[MAX_PATH] = {0};
+       TVITEM itm = {0};
+       itm.mask = TVIF_TEXT;
+       itm.hItem = m_hItem;
+       itm.pszText = text;
+       itm.cchTextMax = MAX_PATH;
+       if (TreeView_GetItem(m_hWnd, &itm)) {
+               CComBSTR ret(text);
+               *pVal = ret.Detach();
+       }
        return S_OK;
 }
+
+STDMETHODIMP CTreeItem::put_Text(/*[in]*/ BSTR newVal)
+{
+       // \83e\83L\83X\83g\82Ì\8f\91\82«\8a·\82¦
+       HRESULT hr;
+       if (FAILED(hr = InitialCheck())) {
+               return hr;
+       }
+       if (!m_hItem) {
+               // \95s\90³\82È\83A\83C\83e\83\80\82ð\8eQ\8fÆ\82µ\82Ä\82¢\82é
+               return DISP_E_EXCEPTION;
+       }
+
+       ATL::CString tmp(newVal);
+       TVITEM itm = {0};
+       itm.mask = TVIF_TEXT;
+       itm.hItem = m_hItem;
+       itm.pszText = tmp.GetBuffer();
+       itm.cchTextMax = tmp.GetLength(); // Set\82Ì\8fê\8d\87\82Í\96³\8e\8b\82³\82ê\82é
+       TreeView_SetItem(m_hWnd, &itm);
+       return S_OK;
+}
+
+STDMETHODIMP CTreeItem::get_PrevItem(/*[out, retval]*/ IUnknown* *pVal)
+{
+       // \91O\82Ì\83A\83C\83e\83\80
+       *pVal = NULL;
+
+       HRESULT hr;
+       if (FAILED(hr = InitialCheck())) {
+               return hr;
+       }
+
+       if (!m_hItem) {
+               // \95s\90³\82È\83A\83C\83e\83\80\82ð\8eQ\8fÆ\82µ\82Ä\82¢\82é
+               return DISP_E_EXCEPTION;
+       }
+
+       CComObject<CTreeItem>* pItem = NULL;
+       if (FAILED(hr = CComObject<CTreeItem>::CreateInstance(&pItem))) {
+               return hr;
+       }
+
+       HTREEITEM hNewItem = TreeView_GetPrevSibling(m_hWnd, m_hItem);
+       pItem->SetParam(m_hWnd, hNewItem);
+
+       return pItem->QueryInterface(IID_IUnknown, (void**)pVal);
+}
+
+STDMETHODIMP CTreeItem::get_NextItem(/*[out, retval]*/ IUnknown* *pVal)
+{
+       // \8e\9f\82Ì\83A\83C\83e\83\80
+       *pVal = NULL;
+
+       HRESULT hr;
+       if (FAILED(hr = InitialCheck())) {
+               return hr;
+       }
+
+       if (!m_hItem) {
+               // \95s\90³\82È\83A\83C\83e\83\80\82ð\8eQ\8fÆ\82µ\82Ä\82¢\82é
+               return DISP_E_EXCEPTION;
+       }
+
+       CComObject<CTreeItem>* pItem = NULL;
+       if (FAILED(hr = CComObject<CTreeItem>::CreateInstance(&pItem))) {
+               return hr;
+       }
+
+       HTREEITEM hNewItem = TreeView_GetNextSibling(m_hWnd, m_hItem);
+       pItem->SetParam(m_hWnd, hNewItem);
+
+       return pItem->QueryInterface(IID_IUnknown, (void**)pVal);
+}
+
+STDMETHODIMP CTreeItem::get_ChildItem(/*[out, retval]*/ IUnknown* *pVal)
+{
+       // \8eq\83A\83C\83e\83\80
+       *pVal = NULL;
+
+       HRESULT hr;
+       if (FAILED(hr = InitialCheck())) {
+               return hr;
+       }
+
+       if (!m_hItem) {
+               // \95s\90³\82È\83A\83C\83e\83\80\82ð\8eQ\8fÆ\82µ\82Ä\82¢\82é
+               return DISP_E_EXCEPTION;
+       }
+
+       CComObject<CTreeItem>* pItem = NULL;
+       if (FAILED(hr = CComObject<CTreeItem>::CreateInstance(&pItem))) {
+               return hr;
+       }
+
+       HTREEITEM hNewItem = TreeView_GetChild(m_hWnd, m_hItem);
+       pItem->SetParam(m_hWnd, hNewItem);
+
+       return pItem->QueryInterface(IID_IUnknown, (void**)pVal);
+}
+
+STDMETHODIMP CTreeItem::get_Parent(/*[out, retval]*/ IUnknown* *pVal)
+{
+       // \90e\83A\83C\83e\83\80
+       *pVal = NULL;
+
+       HRESULT hr;
+       if (FAILED(hr = InitialCheck())) {
+               return hr;
+       }
+
+       if (!m_hItem) {
+               // \95s\90³\82È\83A\83C\83e\83\80\82ð\8eQ\8fÆ\82µ\82Ä\82¢\82é
+               return DISP_E_EXCEPTION;
+       }
+
+       CComObject<CTreeItem>* pItem = NULL;
+       if (FAILED(hr = CComObject<CTreeItem>::CreateInstance(&pItem))) {
+               return hr;
+       }
+
+       HTREEITEM hNewItem = TreeView_GetParent(m_hWnd, m_hItem);
+       pItem->SetParam(m_hWnd, hNewItem);
+
+       return pItem->QueryInterface(IID_IUnknown, (void**)pVal);
+}
+
+//
+void CTreeItem::SetParam(HWND hWnd, HTREEITEM hItem)
+{
+       m_hWnd = hWnd;
+       m_hItem = hItem;
+}
+
index 1e0877d..46861ef 100644 (file)
@@ -15,11 +15,11 @@ class ATL_NO_VTABLE CTreeItem :
 {
 public:
        CTreeItem()
+               : m_hWnd(NULL)
+               , m_hItem(NULL)
        {
-               m_hWnd = NULL;
-               m_hItem = NULL;
        }
-       static BOOL DeleteTreeItemWithData(HWND hWnd, HTREEITEM hItem);
+
        //DECLARE_REGISTRY_RESOURCEID(IDR_TREEITEM)
 
        DECLARE_PROTECT_FINAL_CONSTRUCT()
@@ -33,247 +33,25 @@ public:
        // ITreeItem
 public:
        STDMETHOD(IsValid)(/*[out,retval]*/BOOL* pResult);
-       static void CreateTreeItem(HWND hWnd, HTREEITEM hParent, LPCTSTR text, IUnknown** punkVal);
-       STDMETHOD(Sort)()
-       {
-               HRESULT ret = InitialCheck();
-               if (ret == S_OK) {
-                       if (m_hItem) {
-                               TreeView_SortChildren(m_hWnd, m_hItem, 0);
-                       }
-                       else {
-                               // \95s\90³\82È\83A\83C\83e\83\80\82ð\8eQ\8fÆ\82µ\82Ä\82¢\82é
-                               ret = DISP_E_EXCEPTION;
-                       }
-               }
-               return ret;
-       }
-       STDMETHOD(Expand)()
-       {
-               HRESULT ret = InitialCheck();
-               if (ret == S_OK) {
-                       if (m_hItem) {
-                               TreeView_Expand(m_hWnd, m_hItem, TVE_EXPAND);
-                       }
-                       else {
-                               // \95s\90³\82È\83A\83C\83e\83\80\82ð\8eQ\8fÆ\82µ\82Ä\82¢\82é
-                               ret = DISP_E_EXCEPTION;
-                       }
-               }
-               return ret;
-       }
-       STDMETHOD(Select)()
-       {
-               HRESULT ret = InitialCheck();
-               if (ret == S_OK) {
-                       if (m_hItem) {
-                               TreeView_SelectItem(m_hWnd, m_hItem);
-                       }
-                       else {
-                               // \95s\90³\82È\83A\83C\83e\83\80\82ð\8eQ\8fÆ\82µ\82Ä\82¢\82é
-                               ret = DISP_E_EXCEPTION;
-                       }
-               }
-               return ret;
-       }
-       STDMETHOD(Erase)()
-       {
-               HRESULT ret = InitialCheck();
-               if (ret == S_OK) {
-                       if (m_hItem) {
-                               if (DeleteTreeItemWithData(m_hWnd, m_hItem)) {
-                                       // \8dí\8f\9c\82É\90¬\8c÷\82µ\82½\82ç\81A\82±\82Ì\83n\83\93\83h\83\8b\82ð\96³\8cø\82É\82·\82é
-                                       m_hWnd = NULL;
-                                       m_hItem = NULL;
-                               }
-                       }
-                       else {
-                               // \95s\90³\82È\83A\83C\83e\83\80\82ð\8eQ\8fÆ\82µ\82Ä\82¢\82é
-                               ret = DISP_E_EXCEPTION;
-                       }
-               }
-               return ret;
-       }
-       STDMETHOD(Create)(/*[in]*/VARIANT text,/*[out,retval]*/IUnknown** punkVal)
-       {
-               // \83A\83C\83e\83\80\82Ì\8dì\90¬
-               *punkVal = NULL;
-               HRESULT ret = InitialCheck();
-               if (FAILED(ret)) {
-                       return ret;
-               }
-
-               if (m_hItem) {
-                       CComVariant str;
-                       ATL::CString mes(_TEXT(""));
-                       if (str.ChangeType(VT_BSTR, &text) == S_OK) {
-                               mes = str.bstrVal;
-                       }
-                       CreateTreeItem(m_hWnd, m_hItem, mes, punkVal);
-                       return S_OK;
-               }
-               // \95s\90³\82È\83A\83C\83e\83\80\82ð\8eQ\8fÆ\82µ\82Ä\82¢\82é
-               return DISP_E_EXCEPTION;
-       }
+       STDMETHOD(Sort)();
+       STDMETHOD(Expand)();
+       STDMETHOD(Select)();
+       STDMETHOD(Erase)();
+       STDMETHOD(Create)(/*[in]*/VARIANT text,/*[out,retval]*/IUnknown** punkVal);
+       STDMETHOD(get_Object)(/*[in,optional]*/VARIANT idx, /*[out, retval]*/ VARIANT *pVal);
+       STDMETHOD(get_Text)(/*[out, retval]*/ BSTR *pVal);
+       STDMETHOD(put_Text)(/*[in]*/ BSTR newVal);
+       STDMETHOD(get_PrevItem)(/*[out, retval]*/ IUnknown* *pVal);
+       STDMETHOD(get_NextItem)(/*[out, retval]*/ IUnknown* *pVal);
+       STDMETHOD(get_ChildItem)(/*[out, retval]*/ IUnknown* *pVal);
+       STDMETHOD(get_Parent)(/*[out, retval]*/ IUnknown* *pVal);
 
-       STDMETHOD(get_Object)(/*[in,optional]*/VARIANT idx, /*[out, retval]*/ VARIANT *pVal)
-       {
-               // \83A\83C\83e\83\80\82É\8aÖ\98A\95t\82¯\82ç\82ê\82½\98A\91z\94z\97ñ\83I\83u\83W\83F\83N\83g\82ð\8eæ\93¾\82·\82é
-               ::VariantInit(pVal);
-               HRESULT ret = InitialCheck();
-               if (!m_hItem) {
-                       ret = DISP_E_EXCEPTION;
-               }
-               if (ret == S_OK) {
-                       TVITEM itm = {0};
-                       itm.mask = TVIF_PARAM;
-                       itm.hItem = m_hItem;
-                       if (TreeView_GetItem(m_hWnd, &itm)) {
-                               IUnknown* pUnk = (IUnknown*)itm.lParam;
-                               if (pUnk) {
-                                       pUnk->AddRef();
-                                       pVal->vt = VT_UNKNOWN;
-                                       pVal->punkVal = pUnk;
-                               }
-                       }
-               }
-               return ret;
-       }
-       HRESULT InitialCheck()
-       {
-               // \83E\83B\83\93\83h\83E\82ª\97L\8cø\82©\8c\9f\8d¸\82·\82é
-               if (m_hWnd && ::IsWindow(m_hWnd)) {
-                       return S_OK;
-               }
-               return Error(IDS_ERR_TREEERROR);
-       }
-
-       STDMETHOD(get_Text)(/*[out, retval]*/ BSTR *pVal)
-       {
-               // \83e\83L\83X\83g\82Ì\8eæ\93¾
-               HRESULT ret = InitialCheck();
-               if (!m_hItem) {
-                       // \95s\90³\82È\83A\83C\83e\83\80\82ð\8eQ\8fÆ\82µ\82Ä\82¢\82é
-                       ret = DISP_E_EXCEPTION;
-               }
-
-               if (ret == S_OK) {
-                       TCHAR text[MAX_PATH] = {0};
-                       TVITEM itm = {0};
-                       itm.mask = TVIF_TEXT;
-                       itm.hItem = m_hItem;
-                       itm.pszText = text;
-                       itm.cchTextMax = MAX_PATH;
-                       if (TreeView_GetItem(m_hWnd, &itm)) {
-                               CComBSTR ret(text);
-                               *pVal = ret.Detach();
-                       }
-               }
-               return ret;
-       }
-
-       STDMETHOD(put_Text)(/*[in]*/ BSTR newVal)
-       {
-               // \83e\83L\83X\83g\82Ì\8f\91\82«\8a·\82¦
-               HRESULT ret = InitialCheck();
-               if (!m_hItem) {
-                       // \95s\90³\82È\83A\83C\83e\83\80\82ð\8eQ\8fÆ\82µ\82Ä\82¢\82é
-                       ret = DISP_E_EXCEPTION;
-               }
-               if (ret == S_OK) {
-                       ATL::CString tmp(newVal);
-                       TVITEM itm = {0};
-                       itm.mask = TVIF_TEXT;
-                       itm.hItem = m_hItem;
-                       itm.pszText = tmp.GetBuffer();
-                       itm.cchTextMax = tmp.GetLength(); // Set\82Ì\8fê\8d\87\82Í\96³\8e\8b\82³\82ê\82é
-                       TreeView_SetItem(m_hWnd, &itm);
-               }
-               return ret;
-       }
-
-       STDMETHOD(get_PrevItem)(/*[out, retval]*/ IUnknown* *pVal)
-       {
-               // \91O\82Ì\83A\83C\83e\83\80
-               *pVal = NULL;
-               HRESULT ret = InitialCheck();
-               if (!m_hItem) {
-                       // \95s\90³\82È\83A\83C\83e\83\80\82ð\8eQ\8fÆ\82µ\82Ä\82¢\82é
-                       ret = DISP_E_EXCEPTION;
-               }
-               if (ret == S_OK) {
-                       HTREEITEM hNewItem = TreeView_GetPrevSibling(m_hWnd, m_hItem);
-                       CComObject<CTreeItem>* pItem = NULL;
-                       if (pItem->CreateInstance(&pItem) == S_OK) {
-                               pItem->SetParam(m_hWnd, hNewItem);
-                               ret = pItem->QueryInterface(IID_IUnknown, (void**)pVal);
-                       }
-               }
-               return ret;
-       }
-       STDMETHOD(get_NextItem)(/*[out, retval]*/ IUnknown* *pVal)
-       {
-               // \8e\9f\82Ì\83A\83C\83e\83\80
-               *pVal = NULL;
-               HRESULT ret = InitialCheck();
-               if (!m_hItem) {
-                       // \95s\90³\82È\83A\83C\83e\83\80\82ð\8eQ\8fÆ\82µ\82Ä\82¢\82é
-                       ret = DISP_E_EXCEPTION;
-               }
-               if (ret == S_OK) {
-                       HTREEITEM hNewItem = TreeView_GetNextSibling(m_hWnd, m_hItem);
-                       CComObject<CTreeItem>* pItem = NULL;
-                       if (pItem->CreateInstance(&pItem) == S_OK) {
-                               pItem->SetParam(m_hWnd, hNewItem);
-                               ret = pItem->QueryInterface(IID_IUnknown, (void**)pVal);
-                       }
-               }
-               return ret;
-       }
-       STDMETHOD(get_ChildItem)(/*[out, retval]*/ IUnknown* *pVal)
-       {
-               // \8eq\83A\83C\83e\83\80
-               *pVal = NULL;
-               HRESULT ret = InitialCheck();
-               if (!m_hItem) {
-                       // \95s\90³\82È\83A\83C\83e\83\80\82ð\8eQ\8fÆ\82µ\82Ä\82¢\82é
-                       ret = DISP_E_EXCEPTION;
-               }
-               if (ret == S_OK) {
-                       HTREEITEM hNewItem = TreeView_GetChild(m_hWnd, m_hItem);
-                       CComObject<CTreeItem>* pItem = NULL;
-                       if (pItem->CreateInstance(&pItem) == S_OK) {
-                               pItem->SetParam(m_hWnd, hNewItem);
-                               ret = pItem->QueryInterface(IID_IUnknown, (void**)pVal);
-                       }
-               }
-               return S_OK;
-       }
-       STDMETHOD(get_Parent)(/*[out, retval]*/ IUnknown* *pVal)
-       {
-               // \90e\83A\83C\83e\83\80
-               *pVal = NULL;
-               HRESULT ret = InitialCheck();
-               if (!m_hItem) {
-                       // \95s\90³\82È\83A\83C\83e\83\80\82ð\8eQ\8fÆ\82µ\82Ä\82¢\82é
-                       ret = DISP_E_EXCEPTION;
-               }
-               if (ret == S_OK) {
-                       HTREEITEM hNewItem = TreeView_GetParent(m_hWnd, m_hItem);
-                       CComObject<CTreeItem>* pItem = NULL;
-                       if (pItem->CreateInstance(&pItem) == S_OK) {
-                               pItem->SetParam(m_hWnd, hNewItem);
-                               ret = pItem->QueryInterface(IID_IUnknown, (void**)pVal);
-                       }
-               }
-               return S_OK;
-       }
        //
-       void SetParam(HWND hWnd, HTREEITEM hItem)
-       {
-               m_hWnd = hWnd;
-               m_hItem = hItem;
-       }
+       static BOOL DeleteTreeItemWithData(HWND hWnd, HTREEITEM hItem);
+       static HRESULT CreateTreeItem(HWND hWnd, HTREEITEM hParent, LPCTSTR text, IUnknown** punkVal);
+       HRESULT InitialCheck();
+       void SetParam(HWND hWnd, HTREEITEM hItem);
+
 protected:
        HWND m_hWnd;
        HTREEITEM m_hItem;