1 // Shell.cpp : CShell
\82Ì
\83C
\83\93\83v
\83\8a\83\81\83\93\83e
\81[
\83V
\83\87\83\93
3 #include "SeraphyScriptTools.h"
9 /////////////////////////////////////////////////////////////////////////////
12 STDMETHODIMP CShell::InterfaceSupportsErrorInfo(REFIID riid)
14 static const IID* arr[] =
16 &IID_ISeraphyScriptTools_Shell
18 for (int i=0; i < sizeof(arr) / sizeof(arr[0]); i++)
20 if (IsEqualGUID(*arr[i],riid))
26 STDMETHODIMP CShell::ShellExecute(VARIANT path, VARIANT param, VARIANT initdir, VARIANT show, VARIANT *punkVal)
28 CComVariant varPath,varParam,varInitDir,varMode;
29 CHAR szPath[MAX_PATH] = { 0 };
30 CHAR szInitDir[MAX_PATH] = { 0 };
31 int nShow = SW_SHOWNORMAL;
33 if(varPath.ChangeType(VT_BSTR,&path) == S_OK){
34 WideCharToMultiByte(GetACP(),0,varPath.bstrVal,-1,szPath,MAX_PATH,NULL,NULL);
36 if(varParam.ChangeType(VT_BSTR,¶m) == S_OK){
37 int needsize = WideCharToMultiByte(GetACP(),0,varParam.bstrVal,-1,NULL,0,NULL,NULL);
38 pBuf = new CHAR[needsize+1];
39 WideCharToMultiByte(GetACP(),0,varParam.bstrVal,-1,pBuf,needsize,NULL,NULL);
41 if(varInitDir.ChangeType(VT_BSTR,&initdir) == S_OK){
42 WideCharToMultiByte(GetACP(),0,varInitDir.bstrVal,-1,szInitDir,MAX_PATH,NULL,NULL);
44 if(varMode.ChangeType(VT_I2,&show) == S_OK){
52 nShow = SW_SHOWNORMAL;
55 nShow = SW_SHOWMAXIMIZED;
58 nShow = SW_SHOWMINIMIZED;
61 nShow = SW_SHOWMINNOACTIVE;
66 SHELLEXECUTEINFO info = {0};
67 info.cbSize = sizeof(SHELLEXECUTEINFO);
68 info.fMask = SEE_MASK_DOENVSUBST | SEE_MASK_NOCLOSEPROCESS;
69 info.hwnd = GetMainWindow();
72 info.lpParameters = pBuf;
73 info.lpDirectory = szInitDir;
75 if(ShellExecuteEx(&info)){
76 // ShellExecObj
\82Ì
\90¶
\90¬
77 CComObject<CShellExecObj>* pExec = NULL;
78 if(pExec->CreateInstance(&pExec) == S_OK){
79 pExec->m_hProcess = info.hProcess;
80 IUnknown* pUnk = NULL;
81 pExec->QueryInterface(IID_IUnknown,(void**)&pUnk);
82 punkVal->vt = VT_UNKNOWN;
83 punkVal->punkVal = pUnk;
92 /////////////////////////////////////////////////////////////////////////////
96 STDMETHODIMP CShellExecObj::Wait(VARIANT tim, VARIANT *pVal)
102 DWORD dwWaitTime = 0;
103 if(varTim.ChangeType(VT_I4,&tim) == S_OK){
106 dwWaitTime = INFINITE;
109 dwWaitTime = (DWORD)varTim.lVal;
112 DWORD ret = WaitForSingleObject(m_hProcess,dwWaitTime);
113 if(ret == WAIT_TIMEOUT){
114 //
\83v
\83\8d\83Z
\83X
\82Í
\8fI
\97¹
\82µ
\82Ä
\82¢
\82È
\82¢
119 pVal->boolVal = bExit?VB_TRUE:VB_FALSE;
123 STDMETHODIMP CShellExecObj::get_ExitCode(long *pVal)
126 GetExitCodeProcess(m_hProcess,(DWORD*)pVal);
131 class SPECIALFOLDERPAIR
134 SPECIALFOLDERPAIR(LPCSTR arg_name,int arg_id){
142 STDMETHODIMP CShell::GetSpecialFolderLocations(IUnknown *punkVal)
147 IObjectMap* pMap = NULL;
148 if(punkVal->QueryInterface(IID_IObjectMap,(void**)&pMap) != S_OK){
149 return DISP_E_TYPEMISMATCH;
151 //
\83V
\83X
\83e
\83\80\83o
\81[
\83W
\83\87\83\93\83`
\83F
\83b
\83N
153 get_IsWindowNT(&bWinNT);
154 // NT
\8cn
\82Ì
\8fê
\8d\87\82Æ9x
\8cn
\82Ì
\8fê
\8d\87\82Æ
\82Í
\8eæ
\93¾
\82Å
\82«
\82é
\83t
\83H
\83\8b\83_
\82Ì
\8eí
\97Þ
\82ª
\82¿
\82ª
\82¤
\82Ì
\82Å
\95ª
\82¯
\82Ä
\82¨
\82
155 list<SPECIALFOLDERPAIR> lst;
158 lst.push_back(SPECIALFOLDERPAIR("ADMINTOOLS",CSIDL_ADMINTOOLS));
159 lst.push_back(SPECIALFOLDERPAIR("ALTSTARTUP",CSIDL_ALTSTARTUP));
160 lst.push_back(SPECIALFOLDERPAIR("APPDATA",CSIDL_APPDATA));
161 lst.push_back(SPECIALFOLDERPAIR("COMMON_ADMINTOOLS",CSIDL_COMMON_ADMINTOOLS));
162 lst.push_back(SPECIALFOLDERPAIR("COMMON_ALTSTARTUP",CSIDL_COMMON_ALTSTARTUP));
163 lst.push_back(SPECIALFOLDERPAIR("COMMON_APPDATA",CSIDL_COMMON_APPDATA));
164 lst.push_back(SPECIALFOLDERPAIR("COMMON_DESKTOPDIRECTORY",CSIDL_COMMON_DESKTOPDIRECTORY));
165 lst.push_back(SPECIALFOLDERPAIR("COMMON_DOCUMENTS",CSIDL_COMMON_DOCUMENTS));
166 lst.push_back(SPECIALFOLDERPAIR("COMMON_FAVORITES",CSIDL_COMMON_FAVORITES));
167 lst.push_back(SPECIALFOLDERPAIR("COMMON_PROGRAMS",CSIDL_COMMON_PROGRAMS));
168 lst.push_back(SPECIALFOLDERPAIR("COMMON_STARTMENU",CSIDL_COMMON_STARTMENU));
169 lst.push_back(SPECIALFOLDERPAIR("COMMON_STARTUP",CSIDL_COMMON_STARTUP));
170 lst.push_back(SPECIALFOLDERPAIR("COMMON_TEMPLATES",CSIDL_COMMON_TEMPLATES));
171 lst.push_back(SPECIALFOLDERPAIR("COOKIES",CSIDL_COOKIES));
172 lst.push_back(SPECIALFOLDERPAIR("DESKTOPDIRECTORY",CSIDL_DESKTOPDIRECTORY));
173 lst.push_back(SPECIALFOLDERPAIR("FAVORITES",CSIDL_FAVORITES));
174 lst.push_back(SPECIALFOLDERPAIR("FONTS",CSIDL_FONTS ));
175 lst.push_back(SPECIALFOLDERPAIR("HISTORY",CSIDL_HISTORY));
176 lst.push_back(SPECIALFOLDERPAIR("INTERNET_CACHE ",CSIDL_INTERNET_CACHE ));
177 lst.push_back(SPECIALFOLDERPAIR("LOCAL_APPDATA ",CSIDL_LOCAL_APPDATA ));
178 lst.push_back(SPECIALFOLDERPAIR("MYPICTURES",CSIDL_MYPICTURES));
179 lst.push_back(SPECIALFOLDERPAIR("NETHOOD",CSIDL_NETHOOD));
180 lst.push_back(SPECIALFOLDERPAIR("PERSONAL",CSIDL_PERSONAL));
181 lst.push_back(SPECIALFOLDERPAIR("PRINTHOOD",CSIDL_PRINTHOOD));
182 lst.push_back(SPECIALFOLDERPAIR("PROFILE ",CSIDL_PROFILE ));
183 lst.push_back(SPECIALFOLDERPAIR("PROGRAM_FILES",CSIDL_PROGRAM_FILES));
184 lst.push_back(SPECIALFOLDERPAIR("PROGRAM_FILES_COMMON",CSIDL_PROGRAM_FILES_COMMON));
185 lst.push_back(SPECIALFOLDERPAIR("PROGRAMS",CSIDL_PROGRAMS));
186 lst.push_back(SPECIALFOLDERPAIR("RECENT",CSIDL_RECENT ));
187 lst.push_back(SPECIALFOLDERPAIR("SENDTO",CSIDL_SENDTO ));
188 lst.push_back(SPECIALFOLDERPAIR("STARTMENU",CSIDL_STARTMENU));
189 lst.push_back(SPECIALFOLDERPAIR("STARTUP",CSIDL_STARTUP));
190 lst.push_back(SPECIALFOLDERPAIR("SYSTEM",CSIDL_SYSTEM));
191 lst.push_back(SPECIALFOLDERPAIR("TEMPLATES",CSIDL_TEMPLATES));
192 lst.push_back(SPECIALFOLDERPAIR("WINDOWS",CSIDL_WINDOWS));
196 lst.push_back(SPECIALFOLDERPAIR("ADMINTOOLS",CSIDL_ADMINTOOLS));
197 lst.push_back(SPECIALFOLDERPAIR("ALTSTARTUP",CSIDL_ALTSTARTUP));
198 lst.push_back(SPECIALFOLDERPAIR("APPDATA",CSIDL_APPDATA));
199 lst.push_back(SPECIALFOLDERPAIR("COMMON_ADMINTOOLS",CSIDL_ADMINTOOLS));
200 lst.push_back(SPECIALFOLDERPAIR("COMMON_ALTSTARTUP",CSIDL_ALTSTARTUP));
201 lst.push_back(SPECIALFOLDERPAIR("COMMON_APPDATA",CSIDL_APPDATA));
202 lst.push_back(SPECIALFOLDERPAIR("COMMON_DESKTOPDIRECTORY",CSIDL_DESKTOPDIRECTORY));
203 lst.push_back(SPECIALFOLDERPAIR("COMMON_DOCUMENTS",CSIDL_COMMON_DOCUMENTS));
204 lst.push_back(SPECIALFOLDERPAIR("COMMON_FAVORITES",CSIDL_FAVORITES));
205 lst.push_back(SPECIALFOLDERPAIR("COMMON_PROGRAMS",CSIDL_PROGRAMS));
206 lst.push_back(SPECIALFOLDERPAIR("COMMON_STARTMENU",CSIDL_STARTMENU));
207 lst.push_back(SPECIALFOLDERPAIR("COMMON_STARTUP",CSIDL_STARTUP));
208 lst.push_back(SPECIALFOLDERPAIR("COMMON_TEMPLATES",CSIDL_TEMPLATES));
209 lst.push_back(SPECIALFOLDERPAIR("COOKIES",CSIDL_COOKIES));
210 lst.push_back(SPECIALFOLDERPAIR("DESKTOPDIRECTORY",CSIDL_DESKTOPDIRECTORY));
211 lst.push_back(SPECIALFOLDERPAIR("FAVORITES",CSIDL_FAVORITES));
212 lst.push_back(SPECIALFOLDERPAIR("FONTS",CSIDL_FONTS ));
213 lst.push_back(SPECIALFOLDERPAIR("HISTORY",CSIDL_HISTORY));
214 lst.push_back(SPECIALFOLDERPAIR("INTERNET_CACHE ",CSIDL_INTERNET_CACHE ));
215 lst.push_back(SPECIALFOLDERPAIR("LOCAL_APPDATA ",CSIDL_LOCAL_APPDATA ));
216 lst.push_back(SPECIALFOLDERPAIR("MYPICTURES",CSIDL_MYPICTURES));
217 lst.push_back(SPECIALFOLDERPAIR("NETHOOD",CSIDL_NETHOOD));
218 lst.push_back(SPECIALFOLDERPAIR("PERSONAL",CSIDL_PERSONAL));
219 lst.push_back(SPECIALFOLDERPAIR("PRINTHOOD",CSIDL_PRINTHOOD));
220 lst.push_back(SPECIALFOLDERPAIR("PROFILE ",CSIDL_PROFILE ));
221 lst.push_back(SPECIALFOLDERPAIR("PROGRAM_FILES",CSIDL_PROGRAM_FILES));
222 lst.push_back(SPECIALFOLDERPAIR("PROGRAM_FILES_COMMON",CSIDL_PROGRAM_FILES));
223 lst.push_back(SPECIALFOLDERPAIR("PROGRAMS",CSIDL_PROGRAMS));
224 lst.push_back(SPECIALFOLDERPAIR("RECENT",CSIDL_RECENT ));
225 lst.push_back(SPECIALFOLDERPAIR("SENDTO",CSIDL_SENDTO ));
226 lst.push_back(SPECIALFOLDERPAIR("STARTMENU",CSIDL_STARTMENU));
227 lst.push_back(SPECIALFOLDERPAIR("STARTUP",CSIDL_STARTUP));
228 lst.push_back(SPECIALFOLDERPAIR("SYSTEM",CSIDL_SYSTEM));
229 lst.push_back(SPECIALFOLDERPAIR("TEMPLATES",CSIDL_TEMPLATES));
230 lst.push_back(SPECIALFOLDERPAIR("WINDOWS",CSIDL_WINDOWS));
232 list<SPECIALFOLDERPAIR>::iterator p = lst.begin();
233 while(p != lst.end()){
234 LPITEMIDLIST pid = NULL;
235 if(SHGetSpecialFolderLocation(NULL,(*p).id,&pid) == NOERROR){
236 CHAR buf[MAX_PATH] = {0};
237 if(SHGetPathFromIDList(pid,buf)){
238 CComVariant key((LPCSTR)(*p).name);
239 CComVariant value((LPCSTR)buf);
240 pMap->put_Value(key,value);
242 m_pMalloc->Free(pid);
250 STDMETHODIMP CShell::get_IsWindowNT(BOOL *pVal)
252 OSVERSIONINFO vinfo = {0};
253 vinfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
254 GetVersionEx(&vinfo);
255 *pVal = (vinfo.dwPlatformId == VER_PLATFORM_WIN32_NT);
260 STDMETHODIMP CShell::get_WindowsVersion(long *pVal)
262 // win9x
\82Í0
\81ANT
\82Í
\83o
\81[
\83W
\83\87\83\93\82ð
\95Ô
\82·
264 OSVERSIONINFO vinfo = {0};
265 vinfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
266 GetVersionEx(&vinfo);
267 if(vinfo.dwPlatformId == VER_PLATFORM_WIN32_NT){
268 *pVal = (long)vinfo.dwMajorVersion;
273 STDMETHODIMP CShell::GetDLLVersion(VARIANT text,VARIANT min, VARIANT *pVal)
275 CComVariant varText,varMin;
276 CHAR lpszDllName[MAX_PATH] = { 0 };
277 if(varText.ChangeType(VT_BSTR,&text) == S_OK){
278 WideCharToMultiByte(GetACP(),0,varText.bstrVal,-1,lpszDllName,MAX_PATH,NULL,NULL);
281 if(varMin.ChangeType(VT_I2,&min) == S_OK){
285 DWORD siz = GetFileVersionInfoSize(lpszDllName,0);
287 LPBYTE pBuf = new BYTE[siz+1];
288 if(GetFileVersionInfo(lpszDllName,0,siz,pBuf)){
289 //
\83o
\81[
\83W
\83\87\83\93\8fî
\95ñ
\82ð
\8eæ
\93¾
\82·
\82é
290 VS_FIXEDFILEINFO* pverInfo;
292 if(VerQueryValue(pBuf,"\\",(void**)&pverInfo,&sz)){
293 //
\83o
\81[
\83W
\83\87\83\93\82ð
\8am
\94F
\89Â
\94\
\82Å
\82 \82é
297 wsprintf(mes,"%d.%d.%d.%d"
298 ,HIWORD(pverInfo->dwFileVersionMS),LOWORD(pverInfo->dwFileVersionMS)
299 ,HIWORD(pverInfo->dwFileVersionLS),LOWORD(pverInfo->dwFileVersionLS));
304 ,HIWORD(pverInfo->dwFileVersionMS),LOWORD(pverInfo->dwFileVersionMS));
315 STDMETHODIMP CShell::ParseName(VARIANT text, VARIANT *pVal)
319 if(varText.ChangeType(VT_BSTR,&text) == S_OK){
320 CComObject<CParseName>* pParse = NULL;
321 if(pParse->CreateInstance(&pParse) == S_OK){
322 pParse->m_bstr_path = (LPCWSTR)varText.bstrVal;
323 IUnknown* pUnk = NULL;
324 if(pParse->QueryInterface(IID_IUnknown,(void**)&pUnk) == S_OK){
325 pVal->vt = VT_UNKNOWN;
326 pVal->punkVal = pUnk;
333 /////////////////////////////////////////////////////////////////////////////
336 STDMETHODIMP CParseName::InterfaceSupportsErrorInfo(REFIID riid)
338 static const IID* arr[] =
340 &IID_ISeraphyScriptTool_ParseName
342 for (int i=0; i < sizeof(arr) / sizeof(arr[0]); i++)
344 if (IsEqualGUID(*arr[i],riid))
350 STDMETHODIMP CParseName::get_PathName(BSTR *pVal)
352 *pVal = m_bstr_path.copy();
356 STDMETHODIMP CParseName::put_PathName(BSTR newVal)
358 m_bstr_path = newVal;
362 STDMETHODIMP CParseName::get_FileName(BSTR *pVal)
364 LPWSTR p = m_bstr_path;
366 while(p > (LPCWSTR)m_bstr_path){
367 if(*p == '\\' || *p == '/'){
368 //
\96\96\94ö
\82©
\82ç
\8dÅ
\8f\89\82É
\94
\8c©
\82³
\82ê
\82½
\83t
\83H
\83\8b\83_
\83v
\83\8c\81[
\83X
\82Å
\8e~
\82Ü
\82é
374 *pVal = SysAllocString(p);
378 STDMETHODIMP CParseName::put_FileName(BSTR newVal)
381 lstrcpyW(buf,m_bstr_path);
385 if(*p == '\\' || *p == '/'){
386 //
\96\96\94ö
\82©
\82ç
\8dÅ
\8f\89\82É
\94
\8c©
\82³
\82ê
\82½
\83t
\83H
\83\8b\83_
\83v
\83\8c\81[
\83X
\82Å
\8e~
\82Ü
\82é
397 STDMETHODIMP CParseName::get_Extention(BSTR *pVal)
400 LPWSTR p = m_bstr_path;
402 while(p > (LPCWSTR)m_bstr_path){
408 if(*p == '\\' || *p == '/'){
409 //
\83t
\83H
\83\8b\83_
\83v
\83\8c\81[
\83X
\82Å
\92\86\8e~
\82·
\82é
417 *pVal = SysAllocString(p);
421 STDMETHODIMP CParseName::put_Extention(BSTR newVal)
424 lstrcpyW(buf,m_bstr_path);
434 if(*p == '\\' || *p == '/'){
435 //
\83t
\83H
\83\8b\83_
\83v
\83\8c\81[
\83X
\82Å
\92\86\8e~
\82·
\82é
441 //
\89½
\82à
\82È
\82¯
\82ê
\82Î
\96\96\94ö
\82É
\92Ç
\89Á
\82·
\82é
450 STDMETHODIMP CParseName::get_Name(BSTR *pVal)
453 lstrcpyW(buf,m_bstr_path);
457 if(*p == '\\' || *p == '/'){
471 *pVal = SysAllocString(p);
475 STDMETHODIMP CParseName::put_Name(BSTR newVal)
478 WCHAR ext[MAX_PATH] = { 0 };
479 lstrcpyW(buf,m_bstr_path);
483 if(*p == '\\' || *p == '/'){
506 STDMETHODIMP CParseName::get_Drive(BSTR *pVal)
509 lstrcpyW(buf,m_bstr_path);
513 //
\83h
\83\89\83C
\83u
\8bæ
\90Ø
\82è
\81A
\82Ü
\82½
\82Í
\83v
\83\8d\83g
\83R
\83\8b\82ð
\94
\8c©
\82µ
\82½
520 *pVal = SysAllocString(p);
524 STDMETHODIMP CParseName::put_Drive(BSTR newVal)
527 lstrcpyW(buf,newVal);
530 LPWSTR p = m_bstr_path;
534 //
\83h
\83\89\83C
\83u
\8bæ
\90Ø
\82è
\81A
\82Ü
\82½
\82Í
\83v
\83\8d\83g
\83R
\83\8b\82ð
\94
\8c©
\82µ
\82½
549 STDMETHODIMP CParseName::get_Directory(BSTR *pVal)
552 LPWSTR p = m_bstr_path;
556 //
\83h
\83\89\83C
\83u
\8bæ
\90Ø
\82è
\81A
\82Ü
\82½
\82Í
\83v
\83\8d\83g
\83R
\83\8b\82ð
\94
\8c©
\82µ
\82½
570 if(*p == '\\' || *p== '/'){
571 //
\83t
\83H
\83\8b\83_
\83v
\83\8c\83C
\83X
\82ð
\94
\8c©
\82µ
\82½
572 if(p-1 > buf && (*(p-1) == '\\' || *(p-1) == '/')){
573 //
\83l
\83b
\83g
\83\8f\81[
\83N
\83p
\83X
\82É
\93\9e\92B
\82µ
\82½
\8fê
\8d\87\82Í
\96³
\8e\8b\82·
\82é
582 *pVal = SysAllocString(buf);
586 ///////////////////////////////////////////////////
588 STDMETHODIMP CShell::get_Confirm(BOOL *pVal)
590 *pVal = (m_bConfirm)?VB_TRUE:VB_FALSE;
594 STDMETHODIMP CShell::put_Confirm(BOOL newVal)
600 STDMETHODIMP CShell::get_Silent(BOOL *pVal)
602 *pVal = (m_bSilent)?VB_TRUE:VB_FALSE;
606 STDMETHODIMP CShell::put_Silent(BOOL newVal)
612 STDMETHODIMP CShell::Copy(VARIANT from, VARIANT to, VARIANT *pVal)
614 return FileOperationCore(FO_COPY, 0, &from, &to, pVal);
617 STDMETHODIMP CShell::CopyRenameOnCollision(VARIANT from, VARIANT to, VARIANT *pVal)
619 return FileOperationCore(FO_COPY, FOF_RENAMEONCOLLISION, &from, &to, pVal);
622 STDMETHODIMP CShell::Move(VARIANT from, VARIANT to, VARIANT *pVal)
624 return FileOperationCore(FO_MOVE, 0, &from, &to, pVal);
627 STDMETHODIMP CShell::Delete(VARIANT from,VARIANT *pVal)
629 return FileOperationCore(FO_DELETE, 0, &from, NULL, pVal);
632 HRESULT CShell::FileOperationCore(UINT wFunc, FILEOP_FLAGS flag, VARIANT *from, VARIANT *to, VARIANT *pResult)
634 ::VariantInit(pResult);
636 CHAR szDest[MAX_PATH+2] = { 0 }; // double null
639 if(to->vt != VT_NULL && to->vt != VT_ERROR || to->vt == VT_EMPTY
640 || varTo.ChangeType(VT_BSTR,to) != S_OK){
641 return DISP_E_TYPEMISMATCH;
643 WideCharToMultiByte(GetACP(),0,varTo.bstrVal,-1,szDest,MAX_PATH,NULL,NULL);
645 LPSTR pFrom = CreateDNStringFromVariant(*from);
647 return DISP_E_TYPEMISMATCH;
649 SHFILEOPSTRUCT info = {0};
650 info.fFlags = flag | FOF_ALLOWUNDO | (m_bSilent?FOF_SILENT:0) | (m_bConfirm?0:(FOF_NOCONFIRMMKDIR|FOF_NOCONFIRMATION));
651 info.hwnd = GetMainWindow();
655 int ret = SHFileOperation(&info);
657 result = (bool)(!ret && !info.fAnyOperationsAborted);
658 result.Detach(pResult);
662 LPSTR CShell::CreateDNStringFromVariant(VARIANT &from)
666 if(varFrom.ChangeType(VT_BSTR,&from) == S_OK){
667 // BSTR
\82É
\95Ï
\8a·
\89Â
\94\
\82©?
668 int needsize = WideCharToMultiByte(GetACP(),0,varFrom.bstrVal,-1,NULL,0,NULL,NULL);
669 pBuf = new CHAR[needsize+2];
670 WideCharToMultiByte(GetACP(),0,varFrom.bstrVal,-1,pBuf,needsize,NULL,NULL);
672 pBuf[needsize+1] = 0; // double null
675 else if(varFrom.ChangeType(VT_UNKNOWN,&from) == S_OK){
676 // Unknown
\82É
\95Ï
\8a·
\89Â
\94\
\82©?
677 IObjectVector* pVector = NULL;
678 if(varFrom.punkVal->QueryInterface(IID_IObjectVector,(void**)&pVector) != S_OK){
679 // IObjectVector
\82Å
\82Í
\82È
\82¢
\82È
\82ç
\83G
\83\89\81[
682 //
\94z
\97ñ
\82ð
\8eæ
\93¾
\82·
\82é
684 pVector->get_Count(&mx);
686 //
\94z
\97ñ
\91S
\91Ì
\82Ì
\83T
\83C
\83Y
\82ð
\8b\81\82ß
\82é
688 for(cnt = 0 ; cnt < mx ; cnt++){
690 CComVariant idx((long)cnt);
691 pVector->get_Value(idx,&tmp);
692 if(tmp.ChangeType(VT_BSTR) != S_OK){
693 //
\95¶
\8e\9a\97ñ
\82É
\95Ï
\8a·
\95s
\89Â
\94\
696 needsize += WideCharToMultiByte(GetACP(),0,tmp.bstrVal,-1,NULL,0,NULL,NULL) + 1;
698 needsize += 1; // dobulenull
699 //
\94z
\97ñ
\82ð
\83_
\83u
\83\8b\83k
\83\8b\82É
\93W
\8aJ
\82·
\82é
700 pBuf = new CHAR[needsize];
702 for(cnt = 0 ; cnt < mx ; cnt++){
704 CComVariant idx((long)cnt);
705 pVector->get_Value(idx,&tmp);
706 if(tmp.ChangeType(VT_BSTR) == S_OK){
707 int sz = WideCharToMultiByte(GetACP(),0,tmp.bstrVal,-1,p,MAX_PATH,NULL,NULL);
712 *p = 0; // dobule null
718 VARTYPE vt = VT_EMPTY;
719 SAFEARRAY* pArray = GetArrayFromVariant(from,&vt);
720 if(!pArray || vt != VT_VARIANT){
721 // SafeArray
\82Å
\82È
\82¢
\82©
\81A
\8c^
\82ª
\82¿
\82ª
\82¤
726 int dm = SafeArrayGetDim(pArray);
727 SafeArrayGetLBound(pArray,1,&lb); //
\8d¶
\91¤
\82Ì
\93Y
\82¦
\8e\9a
728 SafeArrayGetUBound(pArray,1,&ub);
729 if(dm != 1 || lb != 0){
730 // 1
\8e\9f\8c³
\94z
\97ñ
\82Å
\82È
\82¢
\82©
\81A0
\83x
\81[
\83X
\82Å
\82È
\82¢
736 //
\83o
\83b
\83t
\83@
\82É
\95K
\97v
\82È
\83T
\83C
\83Y
\82ð
\8b\81\82ß
\82é
737 for(cnt = 0 ; cnt <= ub ; cnt++){
740 SafeArrayGetElement(pArray,dim,&tmp);
741 if(tmp.ChangeType(VT_BSTR) != S_OK){
742 //
\95¶
\8e\9a\97ñ
\82É
\95Ï
\8a·
\95s
\89Â
\94\
745 needsize += WideCharToMultiByte(GetACP(),0,tmp.bstrVal,-1,NULL,0,NULL,NULL) + 1;
747 //
\83o
\83b
\83t
\83@
\82ð
\8am
\95Û
\82µ
\93W
\8aJ
\82·
\82é
748 pBuf = new CHAR[needsize];
750 for(cnt = 0 ; cnt <= ub ; cnt++){
753 SafeArrayGetElement(pArray,dim,&tmp);
754 if(tmp.ChangeType(VT_BSTR) != S_OK){
755 //
\95¶
\8e\9a\97ñ
\82É
\95Ï
\8a·
\95s
\89Â
\94\
758 int sz = WideCharToMultiByte(GetACP(),0,tmp.bstrVal,-1,p,MAX_PATH,NULL,NULL);
768 STDMETHODIMP CShell::EmptyRecycleBin(VARIANT dir)
771 LPCSTR pTarget = NULL;
772 CHAR szPath[MAX_PATH];
773 if(dir.vt == VT_NULL || dir.vt == VT_ERROR || dir.vt == VT_EMPTY){
774 //
\82·
\82×
\82Ä
\91Î
\8fÛ
\82Æ
\82·
\82é
777 if(varDir.ChangeType(VT_BSTR,&dir) == S_OK){
778 //
\93Á
\92è
\82Ì
\83h
\83\89\83C
\83u
\82ð
\83^
\81[
\83Q
\83b
\83g
\82·
\82é
779 WideCharToMultiByte(GetACP(),0,varDir.bstrVal,-1,szPath,MAX_PATH,NULL,NULL);
784 return DISP_E_TYPEMISMATCH;
786 SHEmptyRecycleBin(NULL,pTarget,(m_bConfirm?0:SHERB_NOCONFIRMATION) | (m_bSilent?(SHERB_NOPROGRESSUI|SHERB_NOSOUND ):0));
790 STDMETHODIMP CShell::RecentDocs(VARIANT text)
793 LPCSTR pTarget = NULL;
794 CHAR szPath[MAX_PATH];
795 if(text.vt == VT_NULL || text.vt == VT_ERROR || text.vt == VT_EMPTY){
796 //
\97\9a\97ð
\82ð
\83N
\83\8a\83A
\82·
\82é
799 if(varText.ChangeType(VT_BSTR,&text) == S_OK){
800 //
\93Á
\92è
\82Ì
\83t
\83@
\83C
\83\8b\82ð
\92Ç
\89Á
\82·
\82é
801 WideCharToMultiByte(GetACP(),0,varText.bstrVal,-1,szPath,MAX_PATH,NULL,NULL);
806 return DISP_E_TYPEMISMATCH;
808 SHAddToRecentDocs(SHARD_PATH,pTarget);
812 STDMETHODIMP CShell::SetMainWindow(VARIANT varUnk)
814 //
\8aù
\91¶
\82Ì
\83C
\83\93\83^
\81[
\83t
\83F
\83C
\83X
\82Ì
\89ð
\95ú
816 m_pMainWindow->Release();
817 m_pMainWindow = NULL;
819 //
\83C
\83\93\83^
\81[
\83t
\83F
\83C
\83X
\82Ì
\8eæ
\93¾
821 if(tmp.ChangeType(VT_UNKNOWN,&varUnk) == S_OK){
822 if(tmp.punkVal->QueryInterface(IID_IOverlappedWindow,(void**)&m_pMainWindow) == S_OK){
826 return DISP_E_UNKNOWNINTERFACE;
829 STDMETHODIMP CShell::IsExist(VARIANT name, VARIANT *pVal)
831 CComVariant varName,varRet;
832 if(varName.ChangeType(VT_BSTR,&name) != S_OK){
833 return DISP_E_TYPEMISMATCH;
835 CHAR szPath[MAX_PATH];
836 WideCharToMultiByte(GetACP(),0,varName.bstrVal,-1,szPath,MAX_PATH,NULL,NULL);
837 DWORD attr = GetFileAttributes(szPath);
838 if(attr != (DWORD)-1){
839 if(attr & FILE_ATTRIBUTE_DIRECTORY)