DWORD CSubAction::GetData(DWORD nAction,BYTE* pData_,BOOL bHeader) const { BYTE* pData=pData_; if (bHeader) { *((WORD*)pData)=0xFFEA; pData+=sizeof(WORD); } *((DWORD*)pData)=m_nSubAction; *((DWORD*)(pData+sizeof(DWORD)))=(DWORD)min(LONG_PTR(m_pExtraInfo),MAXDWORD); pData+=2*sizeof(DWORD); switch (nAction) { case CAction::ResultListItems: if (m_nResultList==Execute && m_szVerb!=NULL) { DWORD dwUsed=DWORD(istrlenw(m_szVerb)+1); MemCopyW((LPWSTR)pData,m_szVerb,dwUsed); pData+=dwUsed*2; } else if (m_nResultList==ExecuteCommand && m_szCommand!=NULL) { DWORD dwUsed=DWORD(istrlenw(m_szCommand)+1); MemCopyW((LPWSTR)pData,m_szCommand,dwUsed); pData+=dwUsed*2; } break; case CAction::Misc: if ((m_nMisc==SendMessage || m_nMisc==PostMessage) && m_pSendMessage!=NULL) { DWORD dwUsed=m_pSendMessage->GetData(pData); pData+=dwUsed; } else if (m_nMisc==ExecuteCommandMisc && m_szCommand!=NULL) { DWORD dwUsed=DWORD(istrlenw(m_szCommand)+1); MemCopyW((LPWSTR)pData,m_szCommand,dwUsed); pData+=dwUsed*2; } break; case CAction::Presets: case CAction::ChangeValue: if (m_szPreset!=NULL) { DWORD dwUsed=DWORD(istrlenw(m_szPreset)+1); MemCopyW((LPWSTR)pData,m_szPreset,dwUsed); pData+=dwUsed*2; } break; } return DWORD(pData-pData_); }
HTREEITEM CTreeCtrl::FindItem(LPCWSTR pText,BOOL bBackwardDirection,BOOL bPartial,HTREEITEM hItem,HTREEITEM hEnd) const { TV_ITEMW ti; WCHAR szBuffer[1000]; ti.mask=TVIF_TEXT; ti.hItem=hItem; ti.pszText=szBuffer; ti.cchTextMax=1000; LPWSTR pTextMod; if (bPartial) { int iStrLen=istrlen(pText); pTextMod=new WCHAR[iStrLen+3]; if (pText[0]!='*') { pTextMod[0]='*'; MemCopyW(pTextMod+1,pText,iStrLen++); } else MemCopyW(pTextMod,pText,iStrLen); if (pTextMod[iStrLen-1]!='*') pTextMod[iStrLen++]='*'; pTextMod[iStrLen]='\0'; MakeLower(pTextMod); } while ((ti.hItem=bBackwardDirection?GetPrevItem(ti.hItem):GetNextItem(ti.hItem))!=NULL) { // Get next item if (ti.hItem==hEnd) return NULL; // Check text if (!GetItem(&ti)) continue; if (bPartial) { MakeLower(szBuffer); if (ContainString(szBuffer,pTextMod)) { delete[] pTextMod; return ti.hItem; } } else if (_wcsicmp(szBuffer,pText)==0) return ti.hItem; } if (bPartial) delete[] pTextMod; return NULL; }
inline void CCheckFileNotificationsThread::FileCreated(LPCWSTR szFile,DWORD dwLength,CLocateDlg* pLocateDlg) { //BkgDebugNumMessage("File created: %S",DWORD(szFile)); if (pLocateDlg->m_pListCtrl==NULL) return; BOOL bIsDirectory=FileSystem::IsDirectory(szFile); WCHAR szPath[MAX_PATH]; int nItem=pLocateDlg->m_pListCtrl->GetNextItem(-1,LVNI_ALL); while (nItem!=-1) { if (m_lFlags&fwStopWhenPossible) break; CLocatedItem* pItem=(CLocatedItem*)pLocateDlg->m_pListCtrl->GetItemData(nItem); if (pItem!=NULL) { if (pItem->GetPathLen()==dwLength) { if (pItem->IsDeleted()) { MemCopyW(szPath,pItem->GetPath(),pItem->GetPathLen()+1); MakeLower(szPath); if (wcsncmp(szPath,szFile,dwLength)==0) { if (pItem->RemoveFlagsForChanged()) pLocateDlg->m_pListCtrl->RedrawItems(nItem,nItem); } } } else if (bIsDirectory && pItem->GetPathLen()>dwLength) { if (pItem->IsDeleted() && pItem->GetPath()[dwLength]=='\\') { MemCopyW(szPath,pItem->GetPath(),dwLength); MakeLower(szPath,dwLength); // Can be subdiretory if (wcsncmp(szPath,szFile,dwLength)==0) { if (pItem->RemoveFlagsForChanged()) pLocateDlg->m_pListCtrl->RedrawItems(nItem,nItem); } } } } nItem=pLocateDlg->m_pListCtrl->GetNextItem(nItem,LVNI_ALL); } //BkgDebugMessage("File created ENF"); }
inline void CCheckFileNotificationsThread::FileModified(LPCWSTR szFile,DWORD dwLength,CLocateDlg* pLocateDlg) { //BkgDebugNumMessage("File modified: %S",DWORD(szFile)); if (pLocateDlg->m_pListCtrl==NULL) return; WCHAR szPath[MAX_PATH]; int nItem=pLocateDlg->m_pListCtrl->GetNextItem(-1,LVNI_ALL); while (nItem!=-1) { if (m_lFlags&fwStopWhenPossible) break; CLocatedItem* pItem=(CLocatedItem*)pLocateDlg->m_pListCtrl->GetItemData(nItem); if (pItem!=NULL) { if (pItem->GetPathLen()==dwLength) { MemCopyW(szPath,pItem->GetPath(),pItem->GetPathLen()+1); MakeLower(szPath); if (wcsncmp(szPath,szFile,dwLength)==0) { if (pItem->RemoveFlagsForChanged()) pLocateDlg->m_pListCtrl->RedrawItems(nItem,nItem); } } } nItem=pLocateDlg->m_pListCtrl->GetNextItem(nItem,LVNI_ALL); } //BkgDebugMessage("File modified END"); }
CAction::SendMessageInfo* CAction::SendMessageInfo::FromData(const BYTE* pData,DWORD dwDataLen,DWORD& dwUsed) { if (dwDataLen<sizeof(WORD)+sizeof(DWORD)+sizeof(3)) return NULL; if (*((WORD*)pData)!=0xFFEB) return NULL; SendMessageInfo* pSendMessage=new SendMessageInfo; // Set nMessage pSendMessage->nMessage=*((DWORD*)(pData+2)); pData+=sizeof(DWORD)+sizeof(WORD); dwUsed=sizeof(DWORD)+sizeof(WORD); dwDataLen-=sizeof(DWORD)+sizeof(WORD); // Set szWindow DWORD dwLen; for (dwLen=0;dwLen*2<dwDataLen && ((WCHAR*)pData)[dwLen]!='\0';dwLen++); if (dwLen*2==dwDataLen) { delete pSendMessage; return NULL; } dwLen++; if (dwLen>1) { pSendMessage->szWindow=new WCHAR[dwLen]; MemCopyW(pSendMessage->szWindow,(LPCWSTR)pData,dwLen); } else pSendMessage->szWindow=NULL; dwUsed+=dwLen*2; pData+=dwLen*2; dwDataLen-=dwLen*2; // Set szParam for (dwLen=0;dwLen*2<dwDataLen && ((WCHAR*)pData)[dwLen]!='\0';dwLen++); if (dwLen*2==dwDataLen) { delete pSendMessage; return NULL; } dwLen++; if (dwLen>1) { pSendMessage->szWParam=new WCHAR[dwLen]; MemCopyW(pSendMessage->szWParam,(LPCWSTR)pData,dwLen); } else pSendMessage->szWParam=NULL; dwUsed+=dwLen*2; pData+=dwLen*2; dwDataLen-=dwLen*2; // Set szLParam for (dwLen=0;dwLen*2<dwDataLen && ((WCHAR*)pData)[dwLen]!='\0';dwLen++); if (dwLen*2==dwDataLen) { delete pSendMessage; return NULL; } dwLen++; if (dwLen>1) { pSendMessage->szLParam=new WCHAR[dwLen]; MemCopyW(pSendMessage->szLParam,(LPCWSTR)pData,dwLen); } else pSendMessage->szLParam=NULL; dwUsed+=dwLen*2; pData+=dwLen*2; dwDataLen-=dwLen*2; return pSendMessage; }
DWORD CSubAction::FillFromData(DWORD nAction,const BYTE* pData,DWORD dwDataLen) { if (dwDataLen<2*sizeof(DWORD)) return 0; DWORD dwUsed=0; m_nSubAction=*((DWORD*)(pData)); m_pExtraInfo=(void*)*((DWORD*)(pData+sizeof(DWORD))); pData+=2*sizeof(DWORD); dwUsed=2*sizeof(DWORD); dwDataLen-=2*sizeof(DWORD); switch (nAction) { case CAction::ResultListItems: if (m_nResultList==Execute && m_szVerb!=NULL) { DWORD dwLen; for (dwLen=0;dwLen<dwDataLen && ((LPCWSTR)pData)[dwLen]!='\0';dwLen++); if (dwLen==dwDataLen) return 0; dwLen++; m_szVerb=new WCHAR[dwLen]; MemCopyW(m_szVerb,(LPCWSTR)pData,dwLen); dwUsed+=dwLen*2; pData+=dwLen*2; dwDataLen-=dwLen; } else if (m_nResultList==ExecuteCommand && m_szCommand!=NULL) { DWORD dwLen; for (dwLen=0;dwLen<dwDataLen && ((LPCWSTR)pData)[dwLen]!='\0';dwLen++); if (dwLen==dwDataLen) return 0; dwLen++; m_szCommand=new WCHAR[dwLen]; MemCopyW(m_szCommand,(LPCWSTR)pData,dwLen); dwUsed+=dwLen*2; pData+=dwLen*2; dwDataLen-=dwLen; } break; case CAction::Misc: if ((m_nMisc==SendMessage || m_nMisc==PostMessage) && m_pSendMessage!=NULL) { DWORD dwLen; m_pSendMessage=SendMessageInfo::FromData(pData,dwDataLen,dwLen); if (m_pSendMessage==NULL) return 0; pData+=dwLen; dwUsed+=dwLen; dwDataLen-=dwLen; } else if (m_nMisc==ExecuteCommandMisc && m_szCommand!=NULL) { DWORD dwLen; for (dwLen=0;dwLen<dwDataLen && ((LPCWSTR)pData)[dwLen]!='\0';dwLen++); if (dwLen==dwDataLen) return 0; dwLen++; m_szCommand=new WCHAR[dwLen]; MemCopyW(m_szCommand,(LPCWSTR)pData,dwLen); dwUsed+=dwLen*2; pData+=dwLen*2; dwDataLen-=dwLen; } break; case CAction::Presets: case CAction::ChangeValue: if (m_szPreset!=NULL) { DWORD dwLen; for (dwLen=0;dwLen<dwDataLen && ((LPCWSTR)pData)[dwLen]!='\0';dwLen++); if (dwLen==dwDataLen) return 0; dwLen++; m_szPreset=new WCHAR[dwLen]; MemCopyW(m_szPreset,(LPCWSTR)pData,dwLen); dwUsed+=dwLen*2; pData+=dwLen*2; dwDataLen-=dwLen; } break; } return dwUsed; }
void CSubAction::DoChangeValue() { CLocateDlg* pLocateDlg=GetLocateDlg(); if (pLocateDlg==NULL || m_szValue==NULL) return; // Get handle to control CWnd Control(pLocateDlg->GetDlgItem(LOWORD(m_nControl))); HWND hInDialog=*pLocateDlg; if (Control.GetHandle()==NULL) Control.SetHandle(pLocateDlg->m_NameDlg.GetDlgItem(LOWORD(m_nControl))); if (Control.GetHandle()==NULL) Control.SetHandle(pLocateDlg->m_SizeDateDlg.GetDlgItem(LOWORD(m_nControl))); if (Control.GetHandle()==NULL) Control.SetHandle(pLocateDlg->m_AdvancedDlg.GetDlgItem(LOWORD(m_nControl))); ASSERT(Control.GetHandle()!=NULL); if (!Control.IsWindowEnabled()) return; char szClass[100]; GetClassName(Control,szClass,100); if (_stricmp(szClass,"EDIT")==0) { Control.SetWindowText(m_szValue); ::SendMessage(Control.GetParent(),WM_COMMAND,MAKEWPARAM(m_nControl,EN_CHANGE),LPARAM((HWND)Control)); } else if (_stricmp(szClass,"COMBOBOX")==0) { if ((Control.GetStyle()&CBS_DROPDOWNLIST)!=CBS_DROPDOWNLIST) { Control.SetWindowText(m_szValue); ::SendMessage(Control.GetParent(),WM_COMMAND,MAKEWPARAM(m_nControl,CBN_EDITCHANGE),LPARAM((HWND)Control)); } else { Control.SendMessage(CB_SETCURSEL,_wtoi(m_szValue)); ::SendMessage(Control.GetParent(),WM_COMMAND,MAKEWPARAM(m_nControl,CBN_SELCHANGE),LPARAM((HWND)Control)); } } else if (_stricmp(szClass,"BUTTON")==0) { if (Control.GetStyle()&BS_CHECKBOX) // This also takes radiobuttons { Control.SendMessage(BM_SETCHECK,_wtoi(m_szValue)); ::SendMessage(Control.GetParent(),WM_COMMAND,MAKEWPARAM(m_nControl,BN_CLICKED),LPARAM((HWND)Control)); } } else if (_stricmp(szClass,"ComboBoxEx32")==0) { CComboBoxEx cb(Control); cb.SetCurSel(-1); cb.SetItemText(-1,m_szValue); } else if (_stricmp(szClass,"SysDateTimePick32")==0) { SYSTEMTIME st; GetLocalTime(&st); st.wHour=0; st.wMinute=0; st.wSecond=0; st.wMilliseconds=0; if (wcslen(m_szValue)>=8) { WCHAR szTemp[5]; MemCopyW(szTemp,m_szValue,4); szTemp[4]='\0'; st.wYear=(WORD)_wtol(szTemp); MemCopyW(szTemp,m_szValue+4,2); szTemp[2]='\0'; st.wMonth=(WORD)_wtol(szTemp); MemCopyW(szTemp,m_szValue+6,2); szTemp[2]='\0'; st.wDay=(WORD)_wtol(szTemp); } else { int nIndex=CTime::GetIndex(st.wDay,st.wMonth,st.wYear); if (m_szValue[0]='-') nIndex-=(WORD)_wtol(m_szValue+1); else nIndex+=(WORD)_wtol(m_szValue); CTime::GetDayFromIndex(nIndex,st.wDay,st.wMonth,st.wYear); } Control.SendMessage(DTM_SETSYSTEMTIME,GDT_VALID,LPARAM(&st)); } }
INT IsDirectory(LPCWSTR szDirectoryName) { HANDLE hFind; WIN32_FIND_DATAW fd; int ret=TRUE; if (szDirectoryName[0]==L'\0') return 0; if (szDirectoryName[1]==L'\0') return 0; if (szDirectoryName[2]==L'\0') return 0; if (szDirectoryName[1]==L':' && szDirectoryName[2]==L'\\' && szDirectoryName[3]==L'\0') { switch (GetDriveTypeW(szDirectoryName)) { case DRIVE_UNKNOWN: case DRIVE_NO_ROOT_DIR: return 0; case DRIVE_FIXED: return 1; default: return 2; } } // Taking last '\\' LPWSTR szPath; SIZE_T dwPathLen=istrlenw(szDirectoryName); if (szDirectoryName[dwPathLen-1]==L'\\' && dwPathLen>3) { szPath=new WCHAR[dwPathLen+5]; --dwPathLen; MemCopyW(szPath,szDirectoryName,dwPathLen); szPath[dwPathLen]='\0'; } else szPath=LPWSTR(szDirectoryName); hFind=FindFirstFileW(szPath,&fd); if (hFind!=INVALID_HANDLE_VALUE) { while (!(fd.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY) && ret) ret=FindNextFileW(hFind,&fd); if (szPath!=szDirectoryName) delete[] szPath; FindClose(hFind); if (ret) { if (szDirectoryName[0]==L'\\') { if (szDirectoryName[1]==L'\\') return 2; switch (GetDriveType(NULL)) { case DRIVE_UNKNOWN: case DRIVE_NO_ROOT_DIR: return 0; case DRIVE_FIXED: return 1; default: return 2; } } if (szDirectoryName[1]==L':' && szDirectoryName[2]==L'\\') { WCHAR szTemp[4]=L"X:\\"; szTemp[0]=szDirectoryName[0]; switch (GetDriveTypeW(szTemp)) { case DRIVE_UNKNOWN: return 0; case DRIVE_FIXED: return 1; default: return 2; } } } return 0; } else if (szDirectoryName[0]==L'\\' && szDirectoryName[1]==L'\\') { // UNC share name if (szPath==szDirectoryName) { szPath=new WCHAR[dwPathLen+5]; CopyMemory(szPath,szDirectoryName,dwPathLen*2); } CopyMemory(szPath+dwPathLen,L"\\*.*",5*2); hFind=FindFirstFileW(szPath,&fd); delete[] szPath; if (hFind==INVALID_HANDLE_VALUE) return 0; // Is this really needed, e.g. \\pc\c$ does not have '.' in directory list //ret=1; //while ((fd.cFileName[0]!='.' || fd.cFileName[1]!='\0') && ret==1) // ret=FindNextFile(hFind,&fd); FindClose(hFind); //return ret?2:0; return 2; } if (szPath!=szDirectoryName) delete[] szPath; return 0; }
int vswprintfex( wchar_t *buffer, int buffersize, const wchar_t *format, va_list argList ) { int ptr=0; const wchar_t* in=format; LPWSTR end; int nNextArg=0,index,length; while (*in!='\0') { if (*in=='%') { in++; // Finding first non number for(index=0;in[index]>=L'0' && in[index]<=L'9';index++); // Now index points to nonnumberic character if (in[index]==L':') { // ok number was argument place if (index==0) return 0; nNextArg=_wtoi(in); // finding next '%' in+=index+1; for (length=0;in[length]!=L'\0' && in[length]!=L'%';length++); wchar_t* pTemp=new wchar_t[length+2]; pTemp[0]=L'%'; MemCopyW(pTemp+1,in,length); pTemp[length+1]=L'\0'; HRESULT hRes=StringCbPrintfExW(buffer+ptr,(buffersize-ptr)*sizeof(wchar_t),&end, NULL,STRSAFE_IGNORE_NULLS,pTemp,va_getarg(argList,nNextArg)); if (FAILED(hRes)) return 0; ptr=int(end-buffer); delete[] pTemp; if (in[length]==L'\0') break; in+=length; } else { nNextArg++; for (;in[index]!=L'\0' && in[index]!=L'%';index++); wchar_t* pTemp=new wchar_t[index+2]; pTemp[0]='%'; MemCopyW(pTemp+1,in,index); pTemp[index+1]=L'\0'; HRESULT hRes=StringCbPrintfExW(buffer+ptr,(buffersize-ptr)*sizeof(wchar_t),&end, NULL,STRSAFE_IGNORE_NULLS,pTemp,va_getarg(argList,nNextArg)); if (FAILED(hRes)) return 0; ptr=int(end-buffer); delete[] pTemp; if (in[index]==L'\0') break; in+=index; } } else buffer[ptr++]=*(in++); } buffer[ptr]='\0'; return ptr; }
BOOL CCheckFileNotificationsThread::RunningProcNew() { FnDebugMessage("FN: RunningProcNew started"); // Delete this when this functions ends CAutoPtr<CCheckFileNotificationsThread> thisPtr=this; // Creating handles if (!CreateHandlesNew()) return FALSE; DWORD dwOut; for (;;) { FnDebugMessage("FN goes to sleep"); InterlockedExchange(&m_lState,sWaiting); DWORD nRet=WaitForMultipleObjects(m_nHandles,m_pEventHandles,FALSE,INFINITE); InterlockedExchange(&m_lState,sProcessing); FnDebugMessage1("FN waked nRet=%X",nRet); if (nRet==WAIT_OBJECT_0) { // First event signalled, this event is for stopping // So do nothing here and exit FnDebugMessage("FN stopping event signalled, exiting"); break; } else if (nRet>WAIT_OBJECT_0 && nRet<WAIT_OBJECT_0+m_nHandles) { CLocateDlg* pLocateDlg=GetLocateDlg(); // Locate dialog is also closed, stopping this process if (pLocateDlg==NULL) break; DIRCHANGEDATA* pChangeData=m_pDirDatas[nRet-WAIT_OBJECT_0]; // Asking changes if (!pLocateDlg->IsLocating()) // if locating in process, do nothing { if (GetOverlappedResult(pChangeData->hDirHandle,&pChangeData->ol,&dwOut,FALSE)) { // If GetOverlappedResults took so long that Stop() has given during this time // stop right now if (m_lFlags&fwStopWhenPossible) break; while (pLocateDlg->m_pBackgroundUpdater!=NULL && !pLocateDlg->m_pBackgroundUpdater->m_lIsWaiting) Sleep(200); if (dwOut==0) UpdateItemsInRoot(pChangeData->pRoot,pLocateDlg); else { FILE_NOTIFY_INFORMATION* pStruct=(FILE_NOTIFY_INFORMATION*)pChangeData->pBuffer; while (1) { // Check stop state again if (m_lFlags&fwStopWhenPossible) break; DWORD dwLength=pStruct->FileNameLength/2; // Skip log files BOOL bSkipThisFile=FALSE; int nFilePart; for (nFilePart=dwLength-1;nFilePart>=0 && pStruct->FileName[nFilePart]!=L'\\';nFilePart--); nFilePart++; // Skipping ntuser.dat.log file if (dwLength-nFilePart==14) { if (_wcsnicmp(pStruct->FileName+nFilePart,L"ntuser.dat.log",14)==0) bSkipThisFile=TRUE; } #ifdef _DEBUG // Skipping HFCDebug.log if (dwLength-nFilePart==12) { if (_wcsnicmp(pStruct->FileName+nFilePart,L"HFCDebug.log",12)==0) bSkipThisFile=TRUE; } #endif if (!bSkipThisFile) { m_pFile=new WCHAR[pChangeData->dwRootLength+dwLength+2]; MemCopyW(m_pFile,pChangeData->pRoot,pChangeData->dwRootLength); MemCopyW(m_pFile+pChangeData->dwRootLength,pStruct->FileName,dwLength); dwLength+=pChangeData->dwRootLength; m_pFile[dwLength]='\0'; MakeLower(m_pFile); //DebugFormatMessage("BN: file=%S action=%d",m_pFile,pStruct->Action); switch(pStruct->Action) { case FILE_ACTION_ADDED: case FILE_ACTION_RENAMED_NEW_NAME: FileCreated(m_pFile,dwLength,pLocateDlg); break; case FILE_ACTION_REMOVED: case FILE_ACTION_RENAMED_OLD_NAME: FileDeleted(m_pFile,dwLength,pLocateDlg); break; case FILE_ACTION_MODIFIED: FileModified(m_pFile,dwLength,pLocateDlg); break; } delete[] m_pFile; m_pFile=NULL; } if (pStruct->NextEntryOffset==0) break; *((char**)&pStruct)+=pStruct->NextEntryOffset; } } } } // Check this again if (m_lFlags&fwStopWhenPossible) break; // Coing to listen changes FnDebugMessage("FN: going to listen changes"); BOOL bRet=m_pReadDirectoryChangesW(pChangeData->hDirHandle,pChangeData->pBuffer,CHANGE_BUFFER_LEN,TRUE, FILE_NOTIFY_CHANGE_FILE_NAME|FILE_NOTIFY_CHANGE_DIR_NAME| FILE_NOTIFY_CHANGE_ATTRIBUTES|FILE_NOTIFY_CHANGE_SIZE|FILE_NOTIFY_CHANGE_LAST_WRITE| FILE_NOTIFY_CHANGE_CREATION|FILE_NOTIFY_CHANGE_SECURITY, &dwOut,&pChangeData->ol,NULL); FnDebugMessage("FN: m_pReadDirectoryChangesW returned"); if (!bRet) { // ReadDirectoryChangesW failed, reset event manually FnDebugMessage("FN: ReadDirectoryChangesW failed"); ResetEvent(pChangeData->ol.hEvent); } // Finally, before going to sleep, check that shell we continue if (m_lFlags&fwStopWhenPossible) break; } } InterlockedExchange(&m_lState,sStopping); FnDebugMessage("FN RunningProcNew ends"); return FALSE; }
HRESULT ShellFunctions::CreateShortcut(LPCWSTR pszShortcutFile,LPCWSTR pszLink,LPCWSTR pszDesc,LPCWSTR pszParams) { HRESULT hres; if (IsUnicodeSystem()) { IShellLinkW* psl; hres=CoCreateInstance(CLSID_ShellLink,NULL,CLSCTX_INPROC_SERVER,IID_IShellLinkW,(void**)&psl); if (SUCCEEDED(hres)) { IPersistFile* ppf; hres=psl->QueryInterface(IID_IPersistFile,(void**)&ppf); if (SUCCEEDED(hres)) { hres=psl->SetPath(pszLink); if (SUCCEEDED(hres)) { int nIndex=LastCharIndex(pszLink,L'\\'); if (nIndex>=0) { WCHAR szWDir[MAX_PATH]; MemCopyW(szWDir,pszLink,nIndex); szWDir[nIndex]='\0'; psl->SetWorkingDirectory(szWDir); } if (pszDesc!=NULL) psl->SetDescription(pszDesc); if (pszParams!=NULL) psl->SetArguments(pszParams); hres=ppf->Save(pszShortcutFile,TRUE); } ppf->Release(); } psl->Release(); } } else { IShellLink* psl; hres=CoCreateInstance(CLSID_ShellLink,NULL,CLSCTX_INPROC_SERVER,IID_IShellLink,(void**)&psl); if (SUCCEEDED(hres)) { IPersistFile* ppf; hres=psl->QueryInterface(IID_IPersistFile,(void**)&ppf); if (SUCCEEDED(hres)) { hres=psl->SetPath(W2A(pszLink)); if (SUCCEEDED(hres)) { LONG_PTR nIndex=LastCharIndex(pszLink,L'\\'); if (nIndex>=0) { char szWDir[MAX_PATH]; WideCharToMultiByte(CP_ACP,0,pszLink,(int)nIndex,szWDir,MAX_PATH,0,0); szWDir[nIndex]='\0'; psl->SetWorkingDirectory(szWDir); } if (pszDesc!=NULL) psl->SetDescription(W2A(pszDesc)); if (pszParams!=NULL) psl->SetArguments(W2A(pszParams)); hres=ppf->Save(pszShortcutFile,TRUE); } ppf->Release(); } psl->Release(); } } return hres; }
LPWSTR GetDefaultFileLocation(LPCWSTR szFileName,BOOL bMustExists,DWORD* lpdwSize) { int nFileNameLen=istrlen(szFileName); // Check first that is there PFNSHGETFOLDERPATH pGetFolderPath=(PFNSHGETFOLDERPATH)GetProcAddress(GetModuleHandle("shell32.dll"),"SHGetFolderPathW"); if (pGetFolderPath!=NULL) { WCHAR szAppDataPath[MAX_PATH]; if (SUCCEEDED(pGetFolderPath(NULL,CSIDL_APPDATA,NULL, SHGFP_TYPE_CURRENT,szAppDataPath))) { int nPathLen=istrlen(szAppDataPath); // Insert \\ if already not there if (szAppDataPath[nPathLen-1]!=L'\\') szAppDataPath[nPathLen++]=L'\\'; // Buffer for default path LPWSTR pStr=new WCHAR[nPathLen+9+nFileNameLen+1]; MemCopyW(pStr,szAppDataPath,nPathLen); MemCopyW(pStr+nPathLen,L"Locate32",9); nPathLen+=8; // Now pStr contains X:\UsersFolder\AppPath\Locate32 // Check whether directory exists if (FileSystem::IsDirectory(pStr)) { // Directory does exist // Copy file name part at tail pStr[nPathLen++]='\\'; MemCopyW(pStr+nPathLen,szFileName,nFileNameLen+1); if (lpdwSize!=NULL) *lpdwSize=nPathLen+nFileNameLen; if (!bMustExists) return pStr; // Checking file if (FileSystem::IsFile(pStr)) return pStr; } else { // Create directory if does not already exists // and bMustExists is not set (this function is called // for default databases with bMustExists=FALSE) if (!bMustExists) { FileSystem::CreateDirectory(pStr); // Copy file name part at tail pStr[nPathLen++]='\\'; MemCopyW(pStr+nPathLen,szFileName,nFileNameLen+1); if (lpdwSize!=NULL) *lpdwSize=nPathLen+nFileNameLen; return pStr; } } delete[] pStr; } } // Check also Locate32's directory, maybe there is that file int iLen; LPWSTR pStr; WCHAR szExeName[MAX_PATH]; FileSystem::GetModuleFileName(NULL,szExeName,MAX_PATH); iLen=LastCharIndex(szExeName,L'\\')+1; pStr=new WCHAR[iLen+nFileNameLen+1]; MemCopyW(pStr,szExeName,iLen); MemCopyW(pStr+iLen,szFileName,nFileNameLen+1); if (lpdwSize!=NULL) *lpdwSize=iLen+nFileNameLen; if (!bMustExists) return pStr; if (FileSystem::IsFile(pStr)) return pStr; // Return NULL delete[] pStr; return NULL; }