www.pudn.com > sharewareluncher.zip > send_to_hd.c


#include  
#include 
#include 
#include "resource.h"
#include "sharewareluncher.h"

#define DEL_CANCEL		90001
//#define IDC_HAND		99999		//hand cursor

typedef struct AAA
{ 
	LPITEMIDLIST	lpi; 
	LPSHELLFOLDER	lpsfParent; 
	LPITEMIDLIST	lpifq; 
}TVITEMDATA,*LPTVITEMDATA; 

typedef struct _STRRET1
{ 
    UINT uType; // One of the STRRET_* values 
    union 
    { 
        LPWSTR          pOleStr;        // OLESTR that will be freed 
        LPSTR           pStr;           // ANSI string that will be freed (needed?) 
        UINT            uOffset;        // Offset into SHITEMID 
        char            cStr[MAX_PATH]; // Buffer to fill in (ANSI) 
    } ;//DUMMYUNIONNAME; 
} STRRET1, *LPSTRRET1;

typedef struct _FileOp
{
	UINT uOp;
   BOOL bUpdate;
   BOOL bNoAsk;
   BOOL bNoFolder;
}DOFILEOP,*LPDOFILEOP;

extern HINSTANCE hInst;
extern HWND hMainWnd;
extern char szRunCommand[300];
extern HBITMAP hbmBkg;
HWND hTreeWnd;

char szFoldername[MAX_PATH],szDestFolder[MAX_PATH],szShowDest[MAX_PATH];
char szSourceFile[MAX_PATH];
char szThisFolder[MAX_PATH];	//in listview-IDC_SELECTSEND's dir
char szForCheck[300];	//restore the szRunCommand
NM_TREEVIEW *pNmTv=NULL;
DOFILEOP dofileop={FO_COPY,FALSE,FALSE,FALSE};
BOOL bNoMsg=FALSE;

BOOL bDelNoAsk=FALSE;
HWND hTypeWnd;
HWND hBaseWnd=NULL,hExternWnd=NULL;	//treeview hwnd and sendproc hwnd
RECT CDestRt;	//change dest folder rect,in SendProc,for text control "目的文件夹"
BOOL bInText=FALSE;	//check mouse in text control "目的文件夹"?

int nFocused=-1;	//for in listview,if "shift" pressed,record the first item;

BOOL CALLBACK WINAPI BrowserProc(HWND hWnd,UINT uMsg,UINT wParam,LONG lParam);
BOOL CALLBACK WINAPI MsgProc(HWND hWnd,UINT uMsg,UINT wParam,LONG lParam);
BOOL CALLBACK WINAPI SendProc(HWND hWnd,UINT uMsg,UINT wParam,LONG lParam);
BOOL CALLBACK WINAPI AskDelProc(HWND hWnd,UINT uMsg,UINT wParam,LONG lParam);
void FillTreeView(HWND hwndTreeView,LPSHELLFOLDER lpsf,LPITEMIDLIST lpifq,	HTREEITEM hParent);
BOOL GetName( LPSHELLFOLDER lpsf, LPITEMIDLIST lpi, DWORD dwFlags, LPSTR lpFriendlyName) ;
LPITEMIDLIST CopyITEMID( LPMALLOC lpMalloc, LPITEMIDLIST lpi) ;
LPITEMIDLIST ConcatPidls( LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2) ; 
LPITEMIDLIST GetFullyQualPidl( LPSHELLFOLDER lpsf, LPITEMIDLIST lpi) ;
void GetNormalAndSelectedIcons(LPITEMIDLIST lpifq,LPTV_ITEM lptvitem);
int GetIcon( LPITEMIDLIST lpi, UINT uFlags) ; 
UINT GetSize(LPCITEMIDLIST pidl); 
LPITEMIDLIST Create(UINT cbSize); 
LPITEMIDLIST Next(LPCITEMIDLIST pidl); 
 
int WINAPI BrowseProc( HWND hwnd, UINT msg, LPARAM lParam, LPARAM lpData); 
int DelFile(LPSTR szfile); 
void DoCopy(void); 
void DoSend(void); 
void ResetFileOp(void); 
BOOL DoCheckCommand(void); 
void ExpandTree(void); 
void FillList(HWND hWnd); 
void FillSend(HWND hWnd,LPSTR szFileType); 
LRESULT NotifyHandler( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); 
void InitCol(HWND hWnd); 
void AddListview(HWND hWnd,LPSTR szDisplay,int i); 
HICON GetFileIcon(LPSTR lpi); 
void AddFileType(LPSTR s); 
 
void RestoreCheckCommand(void);	//restore szRunCommand 
void UpdateDestFolder(void);		//listview对话框“目的文件夹” 
 
void ChangeShortcut(void) 
{
	//MessageBox(GetFocus(),"
}

void DelShortcut(void)
{
	//Errmsg("del link will write later");
}

void SendToHD(void)
{
	wsprintf(szForCheck,szRunCommand);
   if(hBaseWnd==NULL)
   {
   	if(DialogBox(hInst,MAKEINTRESOURCE(IDD_BROWSER),hMainWnd,(DLGPROC)BrowserProc))
   		DoCopy();
	   ResetFileOp();
   }
   else
   {
   	SetForegroundWindow(hBaseWnd);
      SendMessage(hBaseWnd,MYWM_ICON,0,0);
   }
}
#pragma argsused
BOOL CALLBACK WINAPI BrowserProc(HWND hWnd,UINT uMsg,UINT wParam,LONG lParam)
{
	switch(uMsg)
   {
   	case WM_INITDIALOG:
      	{
            HIMAGELIST hImageList; 
         	LPSHELLFOLDER lpsf = 0 ; 
            SHFILEINFO    sfi; 
				HRESULT hr ; 
 
            hBaseWnd=hWnd; 
 
            hTreeWnd=GetDlgItem(hWnd,IDC_LISTALL); 
 
            hImageList = (HIMAGELIST)SHGetFileInfo((LPCSTR)"C:\\", 
                                           0, 
                                           &sfi, 
                                           sizeof(SHFILEINFO), 
                                           SHGFI_SYSICONINDEX | SHGFI_SMALLICON) ; 
 
		    	if( hImageList) 
        			TreeView_SetImageList(hTreeWnd, hImageList, 0) ; 
 
				hr=SHGetDesktopFolder( &lpsf) ; 
 
				if( SUCCEEDED(hr)) 
				{ 
				   TreeView_DeleteAllItems( hTreeWnd); 
				   FillTreeView( hTreeWnd, lpsf, NULL, TVI_ROOT) ; 
               ExpandTree(); 
               TreeView_SelectItem(hTreeWnd,TreeView_GetRoot(hTreeWnd));//,TVGN_FIRSTVISIBLE); 
				} 
 
				if( lpsf) 
					lpsf -> lpVtbl -> Release( lpsf) ; 
 
         } 
			break ;
      case MYWM_ICON:					//临时借用,该对话框运行时再有"send to sharewareluncher"
      	if(hExternWnd!=NULL)			//可更新正运行(如果)的listview对话框内容
         {
				UpdateDestFolder();

         	SetDlgItemText(hExternWnd,IDC_DESTFOLDER,szDestFolder);

         	PostMessage(hExternWnd,MYWM_ICON,0,0);
         }
         break;
      case WM_COMMAND:
      	switch(LOWORD(wParam))
         {
         	case IDOK:
               if(hExternWnd!=NULL)
               {
               	SetForegroundWindow(hExternWnd);
                  break;
               }
               hBaseWnd=NULL;
            	EndDialog(hWnd,TRUE);
               return TRUE;
            case IDCANCEL:
            	if(hExternWnd!=NULL)
               {
               	SetForegroundWindow(hExternWnd);
                  break;
               }

               hBaseWnd=NULL;
               wsprintf(szDestFolder,"\0");
            	EndDialog(hWnd,FALSE);
               return FALSE;
            case IDHELP:
            	if(hExternWnd!=NULL)
               {
               	SetForegroundWindow(hExternWnd);
                  break;
               }
            	if(DialogBox(hInst,MAKEINTRESOURCE(IDD_SENDTO),hMainWnd,(DLGPROC)SendProc))
               	;//Errmsg("wait to complete");//DoCopy();
            	break;
            case IDC_MOVE:
            	if(IsDlgButtonChecked(hWnd,IDC_MOVE)==BST_CHECKED)
            	{
               	dofileop.uOp=FO_MOVE;
                  if(hExternWnd!=NULL)
                  	if(IsDlgButtonChecked(hExternWnd,IDC_MOVE)!=BST_CHECKED)
                     	CheckDlgButton(hExternWnd,IDC_MOVE,BST_CHECKED);
               }
               else
               {
               	dofileop.uOp=FO_COPY;
                  if(hExternWnd!=NULL)
                  	if(IsDlgButtonChecked(hExternWnd,IDC_MOVE)==BST_CHECKED)
                     	CheckDlgButton(hExternWnd,IDC_MOVE,BST_UNCHECKED);
               }
               break;
            case IDC_NOFOLDER:
            	if(IsDlgButtonChecked(hWnd,IDC_NOFOLDER)==BST_CHECKED)
               {
            		dofileop.bNoFolder=TRUE;
                  if(hExternWnd!=NULL)
                  {
                     CheckDlgButton(hExternWnd,IDC_NOFOLDER,BST_CHECKED);

                     ShowWindow(GetDlgItem(hExternWnd,IDC_DESTFOLDER),SW_HIDE);
							SendMessage(hExternWnd,WM_COMMAND,MAKELONG((WORD)IDC_NEWFOLDER,(WORD)EN_CHANGE),0);
                  	ShowWindow(GetDlgItem(hExternWnd,IDC_DESTFOLDER),SW_SHOW);
                  }
               }
               else
               {
               	dofileop.bNoFolder=FALSE;
                  if(hExternWnd!=NULL)
                  {
                     CheckDlgButton(hExternWnd,IDC_NOFOLDER,BST_UNCHECKED);

                     ShowWindow(GetDlgItem(hExternWnd,IDC_DESTFOLDER),SW_HIDE);
							SendMessage(hExternWnd,WM_COMMAND,MAKELONG((WORD)IDC_NEWFOLDER,(WORD)EN_CHANGE),0);
                     ShowWindow(GetDlgItem(hExternWnd,IDC_DESTFOLDER),SW_SHOW);
                  }
               }
               break;
            case IDC_UPDATE:
               if(IsDlgButtonChecked(hWnd,IDC_UPDATE)==BST_CHECKED)
               {
                 	dofileop.bUpdate=TRUE;
                  if(hExternWnd!=NULL)
                  	if(IsDlgButtonChecked(hExternWnd,IDC_UPDATE)!=BST_CHECKED)
                     	CheckDlgButton(hExternWnd,IDC_UPDATE,BST_CHECKED);
               }
               else
               {
                 	dofileop.bUpdate=FALSE;
                  if(hExternWnd!=NULL)
                  	if(IsDlgButtonChecked(hExternWnd,IDC_UPDATE)==BST_CHECKED)
                     	CheckDlgButton(hExternWnd,IDC_UPDATE,BST_UNCHECKED);
                  break;
               }

               if(!bNoMsg)
               	if(!DialogBox(hInst,MAKEINTRESOURCE(IDD_MSG),hWnd,(DLGPROC)MsgProc))
                  {
                  	CheckDlgButton(hWnd,IDC_UPDATE,BST_UNCHECKED);
                     if(hExternWnd!=NULL)
	                  	if(IsDlgButtonChecked(hExternWnd,IDC_UPDATE)==BST_CHECKED)
   	                  	CheckDlgButton(hExternWnd,IDC_UPDATE,BST_UNCHECKED);
                     dofileop.bUpdate=FALSE;
                  }
         }
         break;
      case WM_CLOSE:
      	if(hExternWnd!=NULL)
          	SendMessage(hExternWnd,WM_CLOSE,0,0);
      	hBaseWnd=NULL;
      	EndDialog(hWnd,FALSE);
         return FALSE;
      case WM_NOTIFY:
		{ 
		   NM_TREEVIEW *pnmtv = (NM_TREEVIEW *)lParam; 
		   LPTVITEMDATA lptvid ; 
		   HRESULT hr ; 
		   LPSHELLFOLDER lpsf2 = 0 ; 
 
		   switch( pnmtv -> hdr.code) 
			{ 
				case TVN_SELCHANGED: 
				{ 
               pNmTv=pnmtv; 
 
					lptvid = (LPTVITEMDATA)pnmtv -> itemNew.lParam; 
 
               GetName(lptvid -> lpsfParent, lptvid->lpi, SHGDN_FORPARSING, szFoldername); 
 
               if(szFoldername[1]!=':') 
   				{
				   	GetWindowsDirectory(szFoldername,MAX_PATH);
      				strcat(szFoldername,"\\desktop\0");
				   } 
 
               if(hExternWnd!=NULL) 
               { 
               	UpdateDestFolder(); 
 
                  ShowWindow(GetDlgItem(hExternWnd,IDC_DESTFOLDER),SW_HIDE); 
						SendMessage(hExternWnd,WM_COMMAND,MAKELONG((WORD)IDC_NEWFOLDER,(WORD)EN_CHANGE),0); 
                  ShowWindow(GetDlgItem(hExternWnd,IDC_DESTFOLDER),SW_SHOW); 
               } 
				} 
				break ; 
 
				case TVN_ITEMEXPANDING: 
				{ 
               if( ( pnmtv -> itemNew.state & TVIS_EXPANDEDONCE)) 
					  break ; 
 
				   lptvid = (LPTVITEMDATA)pnmtv -> itemNew.lParam ; 
 
				   hr=lptvid -> lpsfParent -> lpVtbl -> BindToObject(lptvid -> lpsfParent, 
																   lptvid -> lpi, 
																   0, 
																   &IID_IShellFolder, 
																   (LPVOID *)&lpsf2) ; 
 
				   if( SUCCEEDED(hr)) 
				   { 
					  FillTreeView(hTreeWnd, 
									   lpsf2, 
									   lptvid -> lpifq, 
									   pnmtv -> itemNew.hItem) ; 
				   } 
 
				   TreeView_SortChildren(hTreeWnd, pnmtv -> itemNew.hItem, FALSE) ; 
				} 
				break; 
 
				default: 
				   break; 
         } 
      } 
   }
   return FALSE;
}

LPITEMIDLIST Next(LPCITEMIDLIST pidl)
{ 
   LPSTR lpMem=(LPSTR)pidl; 
 
   lpMem+=pidl -> mkid.cb; 
 
   return (LPITEMIDLIST)lpMem; 
} 
 
UINT GetSize(LPCITEMIDLIST pidl) 
{ 
    UINT cbTotal = 0; 
    if( pidl) 
    { 
        cbTotal += sizeof(pidl -> mkid.cb) ;       // Null terminator 
        while (pidl -> mkid.cb) 
        { 
            cbTotal += pidl -> mkid.cb; 
            pidl = Next(pidl) ; 
        } 
    } 
 
    return cbTotal; 
} 
 
LPITEMIDLIST Create(UINT cbSize) 
{ 
    LPMALLOC lpMalloc; 
    HRESULT  hr; 
    LPITEMIDLIST pidl=0; 
 
    hr=SHGetMalloc(&lpMalloc) ; 
 
    if( FAILED(hr)) 
       return 0; 
 
    pidl=(LPITEMIDLIST)lpMalloc -> lpVtbl -> Alloc(lpMalloc, cbSize) ; 
 
    if( pidl) 
        _fmemset(pidl, 0, cbSize) ;      // zero-init for external task   alloc 
 
    if( lpMalloc) lpMalloc -> lpVtbl -> Release(lpMalloc) ; 
 
    return pidl; 
} 
 
LPITEMIDLIST ConcatPidls(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2) 
{ 
    LPITEMIDLIST pidlNew; 
    UINT cb1; 
    UINT cb2; 
 
    if( pidl1)  //May be NULL 
       cb1 = GetSize(pidl1) - sizeof(pidl1 -> mkid.cb) ; 
    else 
       cb1 = 0; 
 
    cb2 = GetSize(pidl2) ; 
 
    pidlNew = Create(cb1 + cb2) ; 
    if( pidlNew) 
    { 
        if( pidl1) 
           memcpy(pidlNew, pidl1, cb1) ; 
        memcpy(((LPSTR)pidlNew) + cb1, pidl2, cb2) ; 
    } 
    return pidlNew; 
} 
 
LPITEMIDLIST CopyITEMID(LPMALLOC lpMalloc, LPITEMIDLIST lpi) 
{ 
   LPITEMIDLIST lpiTemp; 
 
   lpiTemp=(LPITEMIDLIST)lpMalloc -> lpVtbl -> Alloc(lpMalloc, 
                                                 lpi -> mkid.cb+sizeof(lpi -> mkid.cb)) ; 
   CopyMemory((PVOID)lpiTemp, (CONST VOID *)lpi, lpi -> mkid.cb+sizeof(lpi -> mkid.cb)) ; 
 
   return lpiTemp; 
} 
 
BOOL GetName(LPSHELLFOLDER lpsf,LPITEMIDLIST  lpi,DWORD dwFlags,LPSTR lpFriendlyName) 
{ 
   BOOL   bSuccess=TRUE; 
   STRRET1 str; 
 
   if( lpsf -> lpVtbl -> GetDisplayNameOf(lpsf,lpi,dwFlags,(LPSTRRET)&str)==NOERROR) 
   { 
      switch (str.uType) 
      { 
         case STRRET_WSTR: 
 
            WideCharToMultiByte(CP_ACP,                 // CodePage 
                                0,		               // dwFlags 
                                str.pOleStr,            // lpWideCharStr 
                                -1,                     // cchWideChar 
                                lpFriendlyName,         // lpMultiByteStr 
                                sizeof(lpFriendlyName), // cchMultiByte, 
                                NULL,                   // lpDefaultChar, 
                                NULL) ;                  // lpUsedDefaultChar 
 
             break; 
 
         case STRRET_OFFSET: 
 
             lstrcpy(lpFriendlyName, (LPSTR)lpi+str.uOffset) ; 
             break; 
 
         case STRRET_CSTR: 
 
             lstrcpy(lpFriendlyName, (LPSTR)str.cStr) ; 
             break; 
 
         default: 
             bSuccess = FALSE; 
             break; 
      } 
   } 
   else 
      bSuccess = FALSE; 
 
   return bSuccess; 
} 
 
LPITEMIDLIST GetFullyQualPidl(LPSHELLFOLDER lpsf, LPITEMIDLIST lpi) 
{ 
   char szBuff[MAX_PATH]; 
   OLECHAR szOleChar[MAX_PATH]; 
   LPSHELLFOLDER lpsfDeskTop; 
   LPITEMIDLIST  lpifq; 
   ULONG ulEaten, ulAttribs; 
   HRESULT hr; 
 
   if( !GetName(lpsf, lpi, SHGDN_FORPARSING, szBuff)) 
      return NULL; 
 
   hr=SHGetDesktopFolder(&lpsfDeskTop) ; 
 
   if( FAILED(hr)) 
      return NULL; 
 
   MultiByteToWideChar(CP_ACP, 
					   MB_PRECOMPOSED, 
					   szBuff, 
					   -1, 
					   szOleChar, 
					   sizeof(szOleChar)) ; 
 
   hr=lpsfDeskTop -> lpVtbl -> ParseDisplayName(lpsfDeskTop, 
											NULL, 
											NULL, 
											szOleChar, 
											&ulEaten, 
											&lpifq, 
											&ulAttribs) ; 
 
   lpsfDeskTop -> lpVtbl -> Release(lpsfDeskTop) ; 
 
   if( FAILED(hr)) 
      return NULL; 
 
   return lpifq; 
} 
 
int GetIcon(LPITEMIDLIST lpi, UINT uFlags) 
{ 
   SHFILEINFO    sfi; 
 
   SHGetFileInfo((LPCSTR)lpi, 
                 0, 
                 &sfi, 
                 sizeof(SHFILEINFO), 
                 uFlags) ; 
 
   return sfi.iIcon; 
} 
 
HICON GetFileIcon(LPSTR lpi) 
{ 
   SHFILEINFO    sfi; 
 
   SHGetFileInfo((LPCSTR)lpi, 
                 0, 
                 &sfi, 
                 sizeof(SHFILEINFO), 
                 SHGFI_ICON) ; 
 
   return sfi.hIcon; 
} 
 
void GetNormalAndSelectedIcons(LPITEMIDLIST lpifq, 
                               LPTV_ITEM lptvitem) 
{ 
   //Note that we don't check the return value here because if GetIcon() 
   //fails, then we're in big trouble... 
 
   lptvitem -> iImage = GetIcon(lpifq, SHGFI_PIDL | 
                              SHGFI_SYSICONINDEX | 
                              SHGFI_SMALLICON) ; 
 
   lptvitem -> iSelectedImage = GetIcon(lpifq, SHGFI_PIDL | 
                                      SHGFI_SYSICONINDEX | 
                                      SHGFI_SMALLICON | 
                                      SHGFI_OPENICON) ; 
 
   return; 
} 
 
 
void FillTreeView(	HWND hwndTreeView, 
					LPSHELLFOLDER lpsf, 
					LPITEMIDLIST lpifq, 
					HTREEITEM hParent) 
{ 
    TV_ITEM         tvi;                          // TreeView Item. 
    TV_INSERTSTRUCT tvins;                        // TreeView Insert Struct. 
    HTREEITEM       hPrev = NULL;                 // Previous Item Added. 
    LPSHELLFOLDER   lpsf2=0; 
    LPENUMIDLIST    lpe=0; 
    LPITEMIDLIST    lpi=0,lpifqThisItem;// lpiTemp=0, lpifqThisItem; 
    LPTVITEMDATA    lptvid=0; 
    LPMALLOC        lpMalloc=0; 
    ULONG           ulFetched; 
    HRESULT         hr; 
    char            szBuff[256]; 
    HWND            hwnd=GetParent(hwndTreeView) ; 
 
    hr=SHGetMalloc(&lpMalloc) ; 
    if( FAILED(hr)) 
       return; 
 
    SetCapture(GetParent(hwndTreeView)) ; 
    SetCursor(LoadCursor(NULL, IDC_WAIT)) ; 
 
    if( SUCCEEDED(hr)) 
    { 
        hr=lpsf -> lpVtbl -> EnumObjects(lpsf, 
                                     hwnd, 
                                     SHCONTF_FOLDERS | SHCONTF_NONFOLDERS|SHCONTF_INCLUDEHIDDEN, 
                                     &lpe) ; 
 
        if( SUCCEEDED(hr)) 
        { 
            while (S_OK==lpe -> lpVtbl -> Next(lpe, 
                                           1, 
                                           &lpi, 
                                           &ulFetched)) 
            { 
                ULONG ulAttrs = SFGAO_HASSUBFOLDER | SFGAO_FOLDER; 
 
                lpsf -> lpVtbl -> GetAttributesOf(lpsf, 1, (LPCITEMIDLIST)&lpi, &ulAttrs) ; 
 
                if( ulAttrs & (SFGAO_HASSUBFOLDER | SFGAO_FOLDER)) 
                { 
                   if( ulAttrs & SFGAO_FOLDER) 
                   { 
                      tvi.mask            = TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | 
                                            TVIF_PARAM; 
 
                      if( ulAttrs & SFGAO_HASSUBFOLDER) 
                      { 
                         tvi.cChildren=1; 
                         tvi.mask |= TVIF_CHILDREN; 
                      } 
 
                      lptvid = (LPTVITEMDATA)lpMalloc -> lpVtbl -> Alloc(lpMalloc, sizeof(TVITEMDATA)) ; 
                      if( !lptvid) 
                         goto Done; 
 
                      if( !GetName(lpsf, lpi, SHGDN_NORMAL, szBuff)) 
                         goto Done; 
                      tvi.pszText    = szBuff; 
                      tvi.cchTextMax = MAX_PATH; 
 
                      lpifqThisItem=ConcatPidls(lpifq, lpi) ; 
 
                      lptvid -> lpi=CopyITEMID(lpMalloc, lpi) ; 
 
                      GetNormalAndSelectedIcons(lpifqThisItem, &tvi) ; 
 
                      lptvid -> lpsfParent=lpsf;    //Store the parent folders SF 
                      lpsf -> lpVtbl -> AddRef(lpsf) ; 
 
                      if( hParent==TVI_ROOT) 
                         lptvid -> lpifq=ConcatPidls(lpifq, lpi) ; 
                      else 
                         lptvid -> lpifq=GetFullyQualPidl(lpsf, lpi) ; 
 
                      tvi.lParam = (LPARAM)lptvid; 
 
                      tvins.item         = tvi; 
                      tvins.hInsertAfter = hPrev; 
                      tvins.hParent      = hParent; 
 
                      hPrev = TreeView_InsertItem(hwndTreeView, &tvins) ; 
 
//////the next code expand all item but CD-ROM in Tree view///////// 
// 
//TreeView_Expand(hwndTreeView,hPrev,TVE_TOGGLE); 
// 
/////code end////////////////////////////////////////////////////// 
                   } 
 
                   lpMalloc -> lpVtbl -> Free(lpMalloc, lpifqThisItem) ; 
                   lpifqThisItem=0; 
                } 
 
                lpMalloc -> lpVtbl -> Free(lpMalloc, lpi) ;  //Finally, free the pidl that the shell gave us... 
                lpi=0; 
            } 
        } 
 
    } 
    else 
       return; 
 
Done: 
 
    ReleaseCapture() ; 
    SetCursor( LoadCursor( NULL, IDC_ARROW)) ; 
 
    if( lpe) 
		lpe -> lpVtbl -> Release( lpe) ; 
 
    if( lpi && lpMalloc) 
		lpMalloc -> lpVtbl -> Free(lpMalloc, lpi) ; 
    if( lpifqThisItem && lpMalloc) 
		lpMalloc -> lpVtbl -> Free(lpMalloc, lpifqThisItem) ; 
 
    if( lpMalloc) 
		lpMalloc -> lpVtbl -> Release(lpMalloc) ; 
}

void DoCopy(void)
{
   char s[MAX_PATH];
	SHFILEOPSTRUCT shop;
   BOOL bnouse=FALSE;
   WIN32_FIND_DATA wfile,wdest;
   char dst[MAX_PATH];
   HANDLE h,hFile;

	shop.hwnd=hMainWnd;
   shop.wFunc=dofileop.uOp;
   shop.pTo=szFoldername;
   if(dofileop.bNoAsk)
	   shop.fFlags=FOF_NOCONFIRMATION;
   else
   	shop.fFlags=FOF_ALLOWUNDO;
   shop.fAnyOperationsAborted=bnouse;
   shop.hNameMappings=NULL;
   shop.lpszProgressTitle=NULL;

   if(szFoldername[1]!=':')
   {
   	GetWindowsDirectory(szFoldername,MAX_PATH);
      strcat(szFoldername,"\\desktop\0");
   }

   while(DoCheckCommand())
   {
      if(dofileop.bNoFolder)
      {
         if(GetFileAttributes(szSourceFile)==FILE_ATTRIBUTE_DIRECTORY)
         {
         	ZeroMemory(s,MAX_PATH);
            wsprintf(s,"%s\\*.*",szSourceFile);

            SetCurrentDirectory(szSourceFile);

            hFile=FindFirstFile(s,&wfile);
            while(FindNextFile(hFile,&wfile))
            {
               if(stricmp(wfile.cFileName,"..")==0)
               	continue;

               ZeroMemory(s,MAX_PATH);
               wsprintf(s,"%s\\",szSourceFile);
					strcat(s,wfile.cFileName);

            	shop.pFrom=s;
               if(dofileop.bUpdate)
			      {
			      	wsprintf(dst,"%s\\%s",shop.pTo,wfile.cFileName);
         			if((h=FindFirstFile(dst,&wdest))!=INVALID_HANDLE_VALUE)
			         {
         			  	if(memcmp(&wfile.ftLastWriteTime,&wdest.ftLastWriteTime,sizeof(FILETIME))!=0 ||
			               wfile.nFileSizeHigh!=wdest.nFileSizeHigh || wfile.nFileSizeLow!=wdest.nFileSizeLow) 
         			      SHFileOperation(&shop); 
			         } 
         			else 
			         	SHFileOperation(&shop); 
         			FindClose(h); 
			      } 
			      else 
        				SHFileOperation(&shop);
            }
            FindClose(hFile);
            continue;
         }
      }
   	shop.pFrom=szSourceFile;
		if(dofileop.bUpdate)
      {
         wsprintf(dst,"%s\\%s",shop.pTo,wfile.cFileName);
         if((h=FindFirstFile(dst,&wdest))!=INVALID_HANDLE_VALUE)
         {
           	if(memcmp(&wfile.ftLastWriteTime,&wdest.ftLastWriteTime,sizeof(FILETIME))!=0 ||
               wfile.nFileSizeHigh!=wdest.nFileSizeHigh || wfile.nFileSizeLow!=wdest.nFileSizeLow) 
               SHFileOperation(&shop); 
         } 
         else 
         	SHFileOperation(&shop); 
         FindClose(h); 
      } 
      else 
        	SHFileOperation(&shop);
   }
   wsprintf(szRunCommand,szForCheck);
}

void ResetFileOp(void)
{
	dofileop.uOp=FO_COPY;
   dofileop.bUpdate=FALSE;
   dofileop.bNoFolder=FALSE;
   dofileop.bNoAsk=FALSE;
}

BOOL DoCheckCommand(void)
{
	int i;

   ZeroMemory(szSourceFile,MAX_PATH);

   if(szRunCommand[0]=='\0')
   	return FALSE;

   for(i=0;i<(int)strlen(szRunCommand);i++)
   {
   	if(szRunCommand[i]!=' ')
      	szSourceFile[i]=szRunCommand[i];
      else
      {
         int j;

      	strcat(szSourceFile,"\0\0");

         for(j=0;j<(int)strlen(szRunCommand)-i-1;j++)
           	szRunCommand[j]=szRunCommand[i+j+1];

         szRunCommand[j]='\0';
         szRunCommand[j+1]='\0';

         return TRUE;
      }
   }

	if(szRunCommand[i]=='\0')
   {
   	wsprintf(szRunCommand,"\0\0");
   	return TRUE;
   }

   return FALSE;
}

void ExpandTree(void)
{
   HTREEITEM hTree;

   hTree=TreeView_GetRoot(hTreeWnd);

   if(hTree)
   	TreeView_Expand(hTreeWnd,hTree,TVE_EXPAND);
}

#pragma argsused
BOOL CALLBACK WINAPI MsgProc(HWND hWnd,UINT uMsg,UINT wParam,LONG lParam)
{
	switch(uMsg)
   {
   	case WM_INITDIALOG:
      	break;
      case WM_COMMAND:
      	switch(LOWORD(wParam))
         {
         	case IDOK:
            	if(IsDlgButtonChecked(hWnd,IDC_NOSHOWNEXT)==BST_CHECKED)
               {
               	REGVALINFO ri;
                  int x=1;

		            ri.szValName="NoMsg";
					   ri.dwType=REG_DWORD;
 			   		ri.lpData=(LPBYTE)&x;
 			   		ri.cbData=sizeof(DWORD);

            		RegSetGroupVal(HKEY_LOCAL_MACHINE,"SOFTWARE\\phonix\\sharewareluncher",1,&ri);
                  bNoMsg=TRUE;
               }
               EndDialog(hWnd,TRUE);
               return TRUE;
            case IDCANCEL:
            	EndDialog(hWnd,FALSE);
               return FALSE;
         }
         break;
      case WM_CLOSE:
      	EndDialog(hWnd,FALSE);
	         return FALSE;
   }
   return FALSE;
}

#pragma argsused
BOOL CALLBACK WINAPI AskDelProc(HWND hWnd,UINT uMsg,UINT wParam,LONG lParam)
{
	switch(uMsg)
   {
   	case WM_INITDIALOG:
      	break;
      case WM_COMMAND:
      	switch(LOWORD(wParam))
         {
         	case IDOK:
            	bDelNoAsk=TRUE;
               EndDialog(hWnd,TRUE);
               return TRUE;
            case IDCANCEL:
					EndDialog(hWnd,FALSE);
               return FALSE;
            case IDHELP:
               bDelNoAsk=FALSE;
               EndDialog(hWnd,TRUE);
               return TRUE;
         }
         break;
      case WM_CLOSE:
			EndDialog(hWnd,FALSE);
            return FALSE;
   }
   return FALSE;
}

void UpdateDestFolder(void)
{
	char s[MAX_PATH];
	ZeroMemory(szDestFolder,MAX_PATH);
   ZeroMemory(s,MAX_PATH);
   DoCheckCommand();
   if(szRunCommand[0]=='\0' && (GetFileAttributes(szSourceFile)&FILE_ATTRIBUTE_DIRECTORY))
   	wsprintf(szDestFolder,szSourceFile);
   else
   	GetPathFromFileName(szSourceFile,szDestFolder);
   GetOnlyFilename(szDestFolder,s,SZ_LONGNAME);
   if(s[1]==':')
   	wsprintf(s,"\0");

   RestoreCheckCommand();

   if((strlen(szFoldername)+strlen(s))>=MAX_PATH)
   	s[MAX_PATH-strlen(szFoldername)]='\0';

   wsprintf(szDestFolder,szFoldername);
   if(szFoldername[3]=='\0')	//like c:\,so cut the "\"
   	szDestFolder[2]='\0';
   strcat(szDestFolder,"\\");
   strcat(szDestFolder,s);
}

int DelFile(LPSTR szfile)
{
   if((GetFileAttributes(szfile)&FILE_ATTRIBUTE_DIRECTORY))
   {
   	SHFILEOPSTRUCT shop;

		shop.hwnd=hMainWnd;
   	shop.wFunc=FO_DELETE;
	   shop.pTo=NULL;//szFoldername;
   	if(bDelNoAsk)
	   	shop.fFlags=FOF_NOCONFIRMATION;
	   else
   		shop.fFlags=FOF_ALLOWUNDO;
	   shop.fAnyOperationsAborted=FALSE;
   	shop.hNameMappings=NULL;
	   shop.lpszProgressTitle=NULL;
	   shop.pFrom=szfile;
		SHFileOperation(&shop);

      return TRUE;
   }
	else if(!bDelNoAsk)
   {
     	char mg[MAX_PATH];
      wsprintf(mg,"确实要删除文件\"%s\"吗?",szfile);
    	switch(MessageBox(GetFocus(),mg,"删除",MB_YESNOCANCEL | MB_ICONQUESTION))
      {
        	case IDYES:
				SetFileAttributes(szfile,FILE_ATTRIBUTE_NORMAL);
           	return DeleteFile(szfile);
         case IDNO:
           	return FALSE;
         case IDCANCEL:
           	return DEL_CANCEL;
      }
   }
   SetFileAttributes(szfile,FILE_ATTRIBUTE_NORMAL);
   return DeleteFile(szfile);
}

#pragma argsused
BOOL CALLBACK WINAPI SendProc(HWND hWnd,UINT uMsg,UINT wParam,LONG lParam)
{
   switch(uMsg)
   {
   	case WM_INITDIALOG:
         hExternWnd=hWnd;
         hTypeWnd=GetDlgItem(hWnd,IDC_FILETYPE);

      	if(dofileop.uOp==FO_MOVE)
         	CheckDlgButton(hWnd,IDC_MOVE,BST_CHECKED);
         else
         	CheckDlgButton(hWnd,IDC_MOVE,BST_UNCHECKED);
         if(dofileop.bUpdate)
         	CheckDlgButton(hWnd,IDC_UPDATE,BST_CHECKED);
         else
         	CheckDlgButton(hWnd,IDC_UPDATE,BST_UNCHECKED);
         if(dofileop.bNoFolder)
         	CheckDlgButton(hWnd,IDC_NOFOLDER,BST_CHECKED);
         else
         	CheckDlgButton(hWnd,IDC_NOFOLDER,BST_UNCHECKED);

         UpdateDestFolder();

         if(dofileop.bNoFolder)
            SetDlgItemText(hWnd,IDC_DESTFOLDER,szFoldername);
         else
         	SetDlgItemText(hWnd,IDC_DESTFOLDER,szDestFolder);

         PostMessage(hWnd,MYWM_ICON,0,0);

         break;
      case WM_LBUTTONDOWN:
      	if(bInText)
         	if(hBaseWnd!=NULL)
   	      {
               bInText=FALSE;
            	SetFocus(hWnd);
               SetForegroundWindow(hBaseWnd);
            }
         break;
		case WM_SETCURSOR:
      	if(bInText)
				SetCursor(LoadCursor(hInst,"IDC_HAND"));
         else
         	SetCursor(LoadCursor(NULL,IDC_ARROW));
         return TRUE;
		case WM_MOUSEMOVE:
			GetWindowRect(GetDlgItem(hWnd,IDC_CHANGDEST),&CDestRt);
         {
         	POINT pt;

            GetCursorPos(&pt);

            if(pt.x>CDestRt.left && pt.xCDestRt.top && pt.y0)
		   	SendMessage(hTypeWnd,CB_DELETESTRING,0,0);

      	ListView_DeleteAllItems(GetDlgItem(hWnd,IDC_SELECTSEND));
         ImageList_Destroy(ListView_GetImageList(GetDlgItem(hWnd,IDC_SELECTSEND),LVSIL_STATE));
         ListView_DeleteAllItems(GetDlgItem(hWnd,IDC_SELECTDEST));
         ImageList_Destroy(ListView_GetImageList(GetDlgItem(hWnd,IDC_SELECTDEST),LVSIL_STATE));

         FillList(hWnd);

         SendMessage(hTypeWnd,CB_ADDSTRING,0,(LPARAM)"*.*");
         SendMessage(hTypeWnd,CB_SELECTSTRING,0,(LPARAM)"*.*");

         ListView_SetCallbackMask(GetDlgItem(hWnd,IDC_SELECTSEND),LVIS_SELECTED);
         ListView_SetCallbackMask(GetDlgItem(hWnd,IDC_SELECTDEST),LVIS_SELECTED);

			break;
      case WM_NOTIFY:
      	return NotifyHandler(hWnd, uMsg, wParam, lParam); 
      case WM_COMMAND: 
      	switch(LOWORD(wParam))
         {
         	case IDOK:
            	bInText=FALSE;
               DoSend();
         	   hExternWnd=NULL;
            	EndDialog(hWnd,TRUE);
               return TRUE;
            case IDCANCEL:
            	bInText=FALSE;
            	hExternWnd=NULL;
            	EndDialog(hWnd,FALSE);
               return FALSE;
            case IDHELP:	//"删除"
            {
               HWND hDest=GetDlgItem(hWnd,IDC_SELECTDEST);
					int i,k,j=ListView_GetItemCount(hDest),c=0,ch;

               if(j==0)
               	break;

            	if(DialogBox(hInst,MAKEINTRESOURCE(IDD_ASKDEL),hWnd,(DLGPROC)AskDelProc))
					{
         	      char szd[MAX_PATH];

            	   for(i=0;i')
                     {
                     	Errmsg("非法字符串");
                        s[i]='\0';
								SetDlgItemText(hWnd,IDC_NEWFOLDER,s);
                        break;
                     }
                  if(dofileop.bNoFolder)
			         {
                     if((strlen(szFoldername)+strlen(s))>=MAX_PATH)
   							s[MAX_PATH-strlen(szFoldername)]='\0';
                     wsprintf(szShowDest,"%s\\%s",szFoldername,s);
                  }
         			else
                  {
                     if((strlen(szDestFolder)+strlen(s))>=MAX_PATH)
   							s[MAX_PATH-strlen(szDestFolder)]='\0';
                     wsprintf(szShowDest,"%s\\%s",szDestFolder,s);
                  }
                  SetDlgItemText(hWnd,IDC_DESTFOLDER,szShowDest);
               }
               break;
         }
         break;
      case WM_CLOSE:
      	bInText=FALSE;
      	hExternWnd=NULL;
         EndDialog(hWnd,FALSE);
         return FALSE;
   }
   return FALSE;
}

void FillList(HWND hWnd)
{
   int i=0;

   DoCheckCommand();

   InitCol(GetDlgItem(hWnd,IDC_SELECTSEND));	//init listview column
   InitCol(GetDlgItem(hWnd,IDC_SELECTDEST));

   ZeroMemory(szThisFolder,MAX_PATH);

   if(szRunCommand[0]=='\0')	//仅一个目录或文件
	{
      if((GetFileAttributes(szSourceFile)&FILE_ATTRIBUTE_DIRECTORY))
      {
      	wsprintf(szThisFolder,szSourceFile);
         if(szThisFolder[3]=='\0')
         	szThisFolder[2]='\0';
        	FillSend(GetDlgItem(hWnd,IDC_SELECTSEND),NULL);
         wsprintf(szRunCommand,szForCheck);
         SetCurrentDirectory(szSourceFile);
         return;
      }
   }

   GetPathFromFileName(szSourceFile,szThisFolder);

   if(szThisFolder[2]=='\0')
   {
   	szThisFolder[2]='\\';
      szThisFolder[3]='\0';
   	SetCurrentDirectory(szThisFolder);
      szThisFolder[2]='\0';
   }
   else
   	SetCurrentDirectory(szThisFolder);

   do{
	  	AddListview(GetDlgItem(hWnd,IDC_SELECTDEST),szSourceFile,i);
      AddFileType(szSourceFile);
      i++;
	}while(DoCheckCommand());

	ListView_SetColumnWidth(GetDlgItem(hWnd,IDC_SELECTDEST),0,LVSCW_AUTOSIZE);

   if(szThisFolder[3]=='\0')
     	szThisFolder[2]='\0';
   FillSend(GetDlgItem(hWnd,IDC_SELECTSEND),NULL);

   RestoreCheckCommand();
}

void RestoreCheckCommand(void)
{
	wsprintf(szRunCommand,szForCheck);
}

void FillSend(HWND hWnd,LPSTR szFileType)
{
   HANDLE hFile;
   WIN32_FIND_DATA wfile;
   char s[MAX_PATH];
   HIMAGELIST hIList;
   LV_FINDINFO lvf;
   HICON hicon1;
   LV_ITEM lvi;
   int i=0;
   BOOL bSpac=FALSE;
   char temp[80];

   ZeroMemory(s,MAX_PATH);
   ZeroMemory(&lvf,sizeof(LV_FINDINFO));

   lvf.flags=LVFI_STRING;

   if(szFileType!=NULL)
   {
   	if(strcmpi(szFileType,"文件夹")==0 || strcmpi(szFileType,"无扩展名文件")==0)
      {
      	wsprintf(s,"%s\\*.*",szThisFolder);
         bSpac=TRUE;
      }
      else
	   	wsprintf(s,"%s\\%s",szThisFolder,szFileType);
   }
   else
   	wsprintf(s,"%s\\*.*",szThisFolder);

   if(szThisFolder[2]=='\0')
   {
   	szThisFolder[2]='\\';
      szThisFolder[3]='\0';
   	SetCurrentDirectory(szThisFolder);
      szThisFolder[2]='\0';
   }
   else
   	SetCurrentDirectory(szThisFolder);

   hIList = ImageList_Create(16,16,ILC_MASK,1,1);//GetSystemMetrics(SM_CXSMICON),GetSystemMetrics(SM_CYSMICON)

	hFile=FindFirstFile(s,&wfile);
   do
   {
   	if(stricmp(wfile.cFileName,"..")==0 || stricmp(wfile.cFileName,".")==0)
        	continue;

      if(bSpac)
      	if(strcmpi(szFileType,"文件夹")==0)
         {
            if(!(wfile.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY))
            	continue;
         }
         else
         	if(GetFileTypeName(wfile.cFileName,temp)!=TYPE_NOEXT)
			   	continue;

      if((wfile.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY))
	   { 
        	char x[MAX_PATH]; 
         wsprintf(x," %s",wfile.cFileName); 
         lvi.pszText = x; 
      } 
      else 
      	lvi.pszText = wfile.cFileName;//LPSTR_TEXTCALLBACK;

      lvf.psz=(LPCTSTR)lvi.pszText;

      if(ListView_FindItem(GetDlgItem(hExternWnd,IDC_SELECTDEST),-1,&lvf)!=-1)
        	continue;

      hicon1=GetFileIcon(wfile.cFileName);

      ImageList_AddIcon(hIList,hicon1);

      ListView_SetImageList(hWnd,hIList,LVSIL_SMALL);

      lvi.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM | LVIF_STATE;
		lvi.state = 0; 
		lvi.stateMask = 0; 
 
		lvi.iItem = i; 
		lvi.iSubItem = 0; 
 
		lvi.cchTextMax = MAX_PATH; 
		lvi.iImage = i; 
		lvi.lParam = (LPARAM)&wfile; 
      i++; 
		ListView_InsertItem(hWnd,&lvi); 
 
      AddFileType(wfile.cFileName); 
   }while(FindNextFile(hFile,&wfile));

   FindClose(hFile);
   ListView_SetColumnWidth(hWnd,0,LVSCW_AUTOSIZE);
}

#pragma argsused
LRESULT NotifyHandler( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) 
{ 
	POINT pt; 
   LPNMHDR lphdr=(LPNMHDR)lParam; 
   LV_HITTESTINFO lvhti ; 
 
	switch(lphdr->code) 
   { 
      case NM_KILLFOCUS: 
      	nFocused=-1; 
         break; 
		case NM_CLICK: 
      { 
         GetCursorPos( &pt) ; 
         ScreenToClient(lphdr->hwndFrom, &pt) ; 
 
         lvhti.pt=pt; 
         ListView_HitTest(lphdr->hwndFrom, &lvhti) ; 
 
         if(lvhti.flags & LVHT_ONITEM) 
         { 
            if((HIBYTE(GetKeyState(VK_SHIFT))&1) && nFocused!=-1) 
            { 
               int i,j=ListView_GetItemCount(lphdr->hwndFrom); 
               BOOL bIn=FALSE; 
 
            	for(i=0;ihwndFrom,i,LVIS_DROPHILITED,LVIF_STATE); 
                     } 
                     else 
                     	ListView_SetItemState(lphdr->hwndFrom,i,0,LVIF_STATE); 
                  } 
                  else 
                  { 
                  	ListView_SetItemState(lphdr->hwndFrom,i,LVIS_DROPHILITED,LVIF_STATE); 
                     bIn=!bIn; 
                     if(nFocused==lvhti.iItem) 
                     	bIn=FALSE; 
                  } 
               } 
            } 
            else 
            { 
            	if((ListView_GetItemState(lphdr->hwndFrom,lvhti.iItem,LVIF_STATE)&LVIS_DROPHILITED)) 
	            { 
   	          	ListView_SetItemState(lphdr->hwndFrom,lvhti.iItem,0,LVIF_STATE); 
      	      } 
         	   else 
            	{ 
              		ListView_SetItemState(lphdr->hwndFrom,lvhti.iItem,LVIS_DROPHILITED,LVIF_STATE); 
	            } 
               nFocused=lvhti.iItem; 
            } 
         } 
      } 
      break; 
   } 
	return 0L; 
}

void InitCol(HWND hWnd)
{
   LV_COLUMN lvC;

	lvC.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
	lvC.fmt = LVCFMT_LEFT;  // 列元左对齐 
	lvC.cx = 86;            // 列元的像素宽度 
	lvC.pszText = "File";//szText;	// 列元的文字字符串地址 
 
	lvC.iSubItem = 0; 
   ListView_InsertColumn(hWnd,0,&lvC);
}

void AddListview(HWND hWnd,LPSTR szDisplay,int i)
{
   WIN32_FIND_DATA wfile;
   HIMAGELIST hIList;
   HICON hicon1;
   LV_ITEM lvi;

   if(szDisplay[0]==' ')
   {
   	int w=0;
      while(szDisplay[w+1]!='\0')
      {
      	szDisplay[w]=szDisplay[w+1];
         w++;
      }
      szDisplay[w]='\0';
   }

   FindFirstFile(szDisplay,&wfile);

   hIList = ListView_GetImageList(hWnd,LVSIL_SMALL);
   if(hIList==NULL)
   	hIList=ImageList_Create(16,16,ILC_MASK,1,1);

	hicon1=GetFileIcon(szDisplay);//,&dwtemp);//wfile.cFileName,0);

   ImageList_AddIcon(hIList,hicon1);

   ListView_SetImageList(hWnd,hIList,LVSIL_SMALL);

//   DestroyIcon(hicon1);

   lvi.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM | LVIF_STATE;
	lvi.state = 0; 
	lvi.stateMask = 0; 
 
	lvi.iItem = i; 
	lvi.iSubItem = 0; 
   if((wfile.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)) 
	{ 
     	char x[MAX_PATH]; 
      wsprintf(x," %s",wfile.cFileName); 
      lvi.pszText = x; 
   } 
   else 
		lvi.pszText = wfile.cFileName;//LPSTR_TEXTCALLBACK; 
	lvi.cchTextMax = MAX_PATH; 
	lvi.iImage = ImageList_GetImageCount(hIList)-1; 
	lvi.lParam = (LPARAM)&wfile; 
	ListView_InsertItem(hWnd,&lvi); 

	ListView_SetColumnWidth(hWnd,0,LVSCW_AUTOSIZE);
}

void AddFileType(LPSTR s)
{
	char sztype[80];
   int i,j,k=0; 
   char str[80]; 
 
   if((GetFileAttributes(s)&FILE_ATTRIBUTE_DIRECTORY)) 
     	wsprintf(sztype,"文件夹"); 
	else 
	   GetFileTypeName(s,sztype); 

   if(sztype[0]=='\0')
   	wsprintf(sztype,"无扩展名文件");

	j=SendMessage(hTypeWnd,CB_GETCOUNT,0,0);
   for(i=0;i0)
   	if(d[strlen(d)-1]=='\\')
	   	d[strlen(d)-1]='\0';
	MkDir(d);

   shop.pTo=d;

   ZeroMemory(s,MAX_PATH);

   for(i=0;i