send_to_hd.c
Upload User: sales84
Upload Date: 2007-01-11
Package Size: 864k
Code Size: 48k
Development Platform:

Visual C++

  1. #include <userdlg.h>
  2. #include <commctrl.h> #include <shlobj.h> #include "resource.h" #include "sharewareluncher.h" #define DEL_CANCEL 90001 //#define IDC_HAND 99999 //hand cursor typedef struct AAA {
  3. LPITEMIDLIST lpi;
  4. LPSHELLFOLDER lpsfParent;
  5. LPITEMIDLIST lpifq;
  6. }TVITEMDATA,*LPTVITEMDATA;
  7. typedef struct _STRRET1 {
  8.     UINT uType; // One of the STRRET_* values
  9.     union
  10.     {
  11.         LPWSTR          pOleStr;        // OLESTR that will be freed
  12.         LPSTR           pStr;           // ANSI string that will be freed (needed?)
  13.         UINT            uOffset;        // Offset into SHITEMID
  14.         char            cStr[MAX_PATH]; // Buffer to fill in (ANSI)
  15.     } ;//DUMMYUNIONNAME;
  16. } 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) ;
  17. LPITEMIDLIST GetFullyQualPidl( LPSHELLFOLDER lpsf, LPITEMIDLIST lpi) ; void GetNormalAndSelectedIcons(LPITEMIDLIST lpifq,LPTV_ITEM lptvitem); int GetIcon( LPITEMIDLIST lpi, UINT uFlags) ;
  18. UINT GetSize(LPCITEMIDLIST pidl);
  19. LPITEMIDLIST Create(UINT cbSize);
  20. LPITEMIDLIST Next(LPCITEMIDLIST pidl);
  21. int WINAPI BrowseProc( HWND hwnd, UINT msg, LPARAM lParam, LPARAM lpData);
  22. int DelFile(LPSTR szfile);
  23. void DoCopy(void);
  24. void DoSend(void);
  25. void ResetFileOp(void);
  26. BOOL DoCheckCommand(void);
  27. void ExpandTree(void);
  28. void FillList(HWND hWnd);
  29. void FillSend(HWND hWnd,LPSTR szFileType);
  30. LRESULT NotifyHandler( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
  31. void InitCol(HWND hWnd);
  32. void AddListview(HWND hWnd,LPSTR szDisplay,int i);
  33. HICON GetFileIcon(LPSTR lpi);
  34. void AddFileType(LPSTR s);
  35. void RestoreCheckCommand(void); //restore szRunCommand
  36. void UpdateDestFolder(void); //listview对话框“目的文件夹”
  37. void ChangeShortcut(void)
  38. { //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;
  39.           LPSHELLFOLDER lpsf = 0 ;
  40.             SHFILEINFO    sfi;
  41. HRESULT hr ;
  42.             hBaseWnd=hWnd;
  43.             hTreeWnd=GetDlgItem(hWnd,IDC_LISTALL);
  44.             hImageList = (HIMAGELIST)SHGetFileInfo((LPCSTR)"C:\",
  45.                                            0,
  46.                                            &sfi,
  47.                                            sizeof(SHFILEINFO),
  48.                                            SHGFI_SYSICONINDEX | SHGFI_SMALLICON) ;
  49.      if( hImageList)
  50.          TreeView_SetImageList(hTreeWnd, hImageList, 0) ;
  51. hr=SHGetDesktopFolder( &lpsf) ;
  52. if( SUCCEEDED(hr))
  53. {
  54.    TreeView_DeleteAllItems( hTreeWnd);
  55.    FillTreeView( hTreeWnd, lpsf, NULL, TVI_ROOT) ;
  56.                ExpandTree();
  57.                TreeView_SelectItem(hTreeWnd,TreeView_GetRoot(hTreeWnd));//,TVGN_FIRSTVISIBLE);
  58. }
  59. if( lpsf)
  60. lpsf -> lpVtbl -> Release( lpsf) ;
  61.          }
  62. 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,"");              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: {
  63.    NM_TREEVIEW *pnmtv = (NM_TREEVIEW *)lParam;
  64.    LPTVITEMDATA lptvid ;
  65.    HRESULT hr ;
  66.    LPSHELLFOLDER lpsf2 = 0 ;
  67.    switch( pnmtv -> hdr.code)
  68. {
  69. case TVN_SELCHANGED:
  70. {
  71.                pNmTv=pnmtv;
  72. lptvid = (LPTVITEMDATA)pnmtv -> itemNew.lParam;
  73.                GetName(lptvid -> lpsfParent, lptvid->lpi, SHGDN_FORPARSING, szFoldername);
  74.                if(szFoldername[1]!=':')
  75.     {     GetWindowsDirectory(szFoldername,MAX_PATH);        strcat(szFoldername,"\desktop");    }
  76.                if(hExternWnd!=NULL)
  77.                {
  78.                 UpdateDestFolder();
  79.                   ShowWindow(GetDlgItem(hExternWnd,IDC_DESTFOLDER),SW_HIDE);
  80. SendMessage(hExternWnd,WM_COMMAND,MAKELONG((WORD)IDC_NEWFOLDER,(WORD)EN_CHANGE),0);
  81.                   ShowWindow(GetDlgItem(hExternWnd,IDC_DESTFOLDER),SW_SHOW);
  82.                }
  83. }
  84. break ;
  85. case TVN_ITEMEXPANDING:
  86. {
  87.                if( ( pnmtv -> itemNew.state & TVIS_EXPANDEDONCE))
  88.   break ;
  89.    lptvid = (LPTVITEMDATA)pnmtv -> itemNew.lParam ;
  90.    hr=lptvid -> lpsfParent -> lpVtbl -> BindToObject(lptvid -> lpsfParent,
  91.    lptvid -> lpi,
  92.    0,
  93.    &IID_IShellFolder,
  94.    (LPVOID *)&lpsf2) ;
  95.    if( SUCCEEDED(hr))
  96.    {
  97.   FillTreeView(hTreeWnd,
  98.    lpsf2,
  99.    lptvid -> lpifq,
  100.    pnmtv -> itemNew.hItem) ;
  101.    }
  102.    TreeView_SortChildren(hTreeWnd, pnmtv -> itemNew.hItem, FALSE) ;
  103. }
  104. break;
  105. default:
  106.    break;
  107.          }
  108.       }
  109.    }    return FALSE; } LPITEMIDLIST Next(LPCITEMIDLIST pidl) {
  110.    LPSTR lpMem=(LPSTR)pidl;
  111.    lpMem+=pidl -> mkid.cb;
  112.    return (LPITEMIDLIST)lpMem;
  113. }
  114. UINT GetSize(LPCITEMIDLIST pidl)
  115. {
  116.     UINT cbTotal = 0;
  117.     if( pidl)
  118.     {
  119.         cbTotal += sizeof(pidl -> mkid.cb) ;       // Null terminator
  120.         while (pidl -> mkid.cb)
  121.         {
  122.             cbTotal += pidl -> mkid.cb;
  123.             pidl = Next(pidl) ;
  124.         }
  125.     }
  126.     return cbTotal;
  127. }
  128. LPITEMIDLIST Create(UINT cbSize)
  129. {
  130.     LPMALLOC lpMalloc;
  131.     HRESULT  hr;
  132.     LPITEMIDLIST pidl=0;
  133.     hr=SHGetMalloc(&lpMalloc) ;
  134.     if( FAILED(hr))
  135.        return 0;
  136.     pidl=(LPITEMIDLIST)lpMalloc -> lpVtbl -> Alloc(lpMalloc, cbSize) ;
  137.     if( pidl)
  138.         _fmemset(pidl, 0, cbSize) ;      // zero-init for external task   alloc
  139.     if( lpMalloc) lpMalloc -> lpVtbl -> Release(lpMalloc) ;
  140.     return pidl;
  141. }
  142. LPITEMIDLIST ConcatPidls(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
  143. {
  144.     LPITEMIDLIST pidlNew;
  145.     UINT cb1;
  146.     UINT cb2;
  147.     if( pidl1)  //May be NULL
  148.        cb1 = GetSize(pidl1) - sizeof(pidl1 -> mkid.cb) ;
  149.     else
  150.        cb1 = 0;
  151.     cb2 = GetSize(pidl2) ;
  152.     pidlNew = Create(cb1 + cb2) ;
  153.     if( pidlNew)
  154.     {
  155.         if( pidl1)
  156.            memcpy(pidlNew, pidl1, cb1) ;
  157.         memcpy(((LPSTR)pidlNew) + cb1, pidl2, cb2) ;
  158.     }
  159.     return pidlNew;
  160. }
  161. LPITEMIDLIST CopyITEMID(LPMALLOC lpMalloc, LPITEMIDLIST lpi)
  162. {
  163.    LPITEMIDLIST lpiTemp;
  164.    lpiTemp=(LPITEMIDLIST)lpMalloc -> lpVtbl -> Alloc(lpMalloc,
  165.                                                  lpi -> mkid.cb+sizeof(lpi -> mkid.cb)) ;
  166.    CopyMemory((PVOID)lpiTemp, (CONST VOID *)lpi, lpi -> mkid.cb+sizeof(lpi -> mkid.cb)) ;
  167.    return lpiTemp;
  168. }
  169. BOOL GetName(LPSHELLFOLDER lpsf,LPITEMIDLIST  lpi,DWORD dwFlags,LPSTR lpFriendlyName)
  170. {
  171.    BOOL   bSuccess=TRUE;
  172.    STRRET1 str;
  173.    if( lpsf -> lpVtbl -> GetDisplayNameOf(lpsf,lpi,dwFlags,(LPSTRRET)&str)==NOERROR)
  174.    {
  175.       switch (str.uType)
  176.       {
  177.          case STRRET_WSTR:
  178.             WideCharToMultiByte(CP_ACP,                 // CodePage
  179.                                 0,                // dwFlags
  180.                                 str.pOleStr,            // lpWideCharStr
  181.                                 -1,                     // cchWideChar
  182.                                 lpFriendlyName,         // lpMultiByteStr
  183.                                 sizeof(lpFriendlyName), // cchMultiByte,
  184.                                 NULL,                   // lpDefaultChar,
  185.                                 NULL) ;                  // lpUsedDefaultChar
  186.              break;
  187.          case STRRET_OFFSET:
  188.              lstrcpy(lpFriendlyName, (LPSTR)lpi+str.uOffset) ;
  189.              break;
  190.          case STRRET_CSTR:
  191.              lstrcpy(lpFriendlyName, (LPSTR)str.cStr) ;
  192.              break;
  193.          default:
  194.              bSuccess = FALSE;
  195.              break;
  196.       }
  197.    }
  198.    else
  199.       bSuccess = FALSE;
  200.    return bSuccess;
  201. }
  202. LPITEMIDLIST GetFullyQualPidl(LPSHELLFOLDER lpsf, LPITEMIDLIST lpi)
  203. {
  204.    char szBuff[MAX_PATH];
  205.    OLECHAR szOleChar[MAX_PATH];
  206.    LPSHELLFOLDER lpsfDeskTop;
  207.    LPITEMIDLIST  lpifq;
  208.    ULONG ulEaten, ulAttribs;
  209.    HRESULT hr;
  210.    if( !GetName(lpsf, lpi, SHGDN_FORPARSING, szBuff))
  211.       return NULL;
  212.    hr=SHGetDesktopFolder(&lpsfDeskTop) ;
  213.    if( FAILED(hr))
  214.       return NULL;
  215.    MultiByteToWideChar(CP_ACP,
  216.    MB_PRECOMPOSED,
  217.    szBuff,
  218.    -1,
  219.    szOleChar,
  220.    sizeof(szOleChar)) ;
  221.    hr=lpsfDeskTop -> lpVtbl -> ParseDisplayName(lpsfDeskTop,
  222. NULL,
  223. NULL,
  224. szOleChar,
  225. &ulEaten,
  226. &lpifq,
  227. &ulAttribs) ;
  228.    lpsfDeskTop -> lpVtbl -> Release(lpsfDeskTop) ;
  229.    if( FAILED(hr))
  230.       return NULL;
  231.    return lpifq;
  232. }
  233. int GetIcon(LPITEMIDLIST lpi, UINT uFlags)
  234. {
  235.    SHFILEINFO    sfi;
  236.    SHGetFileInfo((LPCSTR)lpi,
  237.                  0,
  238.                  &sfi,
  239.                  sizeof(SHFILEINFO),
  240.                  uFlags) ;
  241.    return sfi.iIcon;
  242. }
  243. HICON GetFileIcon(LPSTR lpi)
  244. {
  245.    SHFILEINFO    sfi;
  246.    SHGetFileInfo((LPCSTR)lpi,
  247.                  0,
  248.                  &sfi,
  249.                  sizeof(SHFILEINFO),
  250.                  SHGFI_ICON) ;
  251.    return sfi.hIcon;
  252. }
  253. void GetNormalAndSelectedIcons(LPITEMIDLIST lpifq,
  254.                                LPTV_ITEM lptvitem)
  255. {
  256.    //Note that we don't check the return value here because if GetIcon()
  257.    //fails, then we're in big trouble...
  258.    lptvitem -> iImage = GetIcon(lpifq, SHGFI_PIDL |
  259.                               SHGFI_SYSICONINDEX |
  260.                               SHGFI_SMALLICON) ;
  261.    lptvitem -> iSelectedImage = GetIcon(lpifq, SHGFI_PIDL |
  262.                                       SHGFI_SYSICONINDEX |
  263.                                       SHGFI_SMALLICON |
  264.                                       SHGFI_OPENICON) ;
  265.    return;
  266. }
  267. void FillTreeView( HWND hwndTreeView,
  268. LPSHELLFOLDER lpsf,
  269. LPITEMIDLIST lpifq,
  270. HTREEITEM hParent)
  271. {
  272.     TV_ITEM         tvi;                          // TreeView Item.
  273.     TV_INSERTSTRUCT tvins;                        // TreeView Insert Struct.
  274.     HTREEITEM       hPrev = NULL;                 // Previous Item Added.
  275.     LPSHELLFOLDER   lpsf2=0;
  276.     LPENUMIDLIST    lpe=0;
  277.     LPITEMIDLIST    lpi=0,lpifqThisItem;// lpiTemp=0, lpifqThisItem;
  278.     LPTVITEMDATA    lptvid=0;
  279.     LPMALLOC        lpMalloc=0;
  280.     ULONG           ulFetched;
  281.     HRESULT         hr;
  282.     char            szBuff[256];
  283.     HWND            hwnd=GetParent(hwndTreeView) ;
  284.     hr=SHGetMalloc(&lpMalloc) ;
  285.     if( FAILED(hr))
  286.        return;
  287.     SetCapture(GetParent(hwndTreeView)) ;
  288.     SetCursor(LoadCursor(NULL, IDC_WAIT)) ;
  289.     if( SUCCEEDED(hr))
  290.     {
  291.         hr=lpsf -> lpVtbl -> EnumObjects(lpsf,
  292.                                      hwnd,
  293.                                      SHCONTF_FOLDERS | SHCONTF_NONFOLDERS|SHCONTF_INCLUDEHIDDEN,
  294.                                      &lpe) ;
  295.         if( SUCCEEDED(hr))
  296.         {
  297.             while (S_OK==lpe -> lpVtbl -> Next(lpe,
  298.                                            1,
  299.                                            &lpi,
  300.                                            &ulFetched))
  301.             {
  302.                 ULONG ulAttrs = SFGAO_HASSUBFOLDER | SFGAO_FOLDER;
  303.                 lpsf -> lpVtbl -> GetAttributesOf(lpsf, 1, (LPCITEMIDLIST)&lpi, &ulAttrs) ;
  304.                 if( ulAttrs & (SFGAO_HASSUBFOLDER | SFGAO_FOLDER))
  305.                 {
  306.                    if( ulAttrs & SFGAO_FOLDER)
  307.                    {
  308.                       tvi.mask            = TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE |
  309.                                             TVIF_PARAM;
  310.                       if( ulAttrs & SFGAO_HASSUBFOLDER)
  311.                       {
  312.                          tvi.cChildren=1;
  313.                          tvi.mask |= TVIF_CHILDREN;
  314.                       }
  315.                       lptvid = (LPTVITEMDATA)lpMalloc -> lpVtbl -> Alloc(lpMalloc, sizeof(TVITEMDATA)) ;
  316.                       if( !lptvid)
  317.                          goto Done;
  318.                       if( !GetName(lpsf, lpi, SHGDN_NORMAL, szBuff))
  319.                          goto Done;
  320.                       tvi.pszText    = szBuff;
  321.                       tvi.cchTextMax = MAX_PATH;
  322.                       lpifqThisItem=ConcatPidls(lpifq, lpi) ;
  323.                       lptvid -> lpi=CopyITEMID(lpMalloc, lpi) ;
  324.                       GetNormalAndSelectedIcons(lpifqThisItem, &tvi) ;
  325.                       lptvid -> lpsfParent=lpsf;    //Store the parent folders SF
  326.                       lpsf -> lpVtbl -> AddRef(lpsf) ;
  327.                       if( hParent==TVI_ROOT)
  328.                          lptvid -> lpifq=ConcatPidls(lpifq, lpi) ;
  329.                       else
  330.                          lptvid -> lpifq=GetFullyQualPidl(lpsf, lpi) ;
  331.                       tvi.lParam = (LPARAM)lptvid;
  332.                       tvins.item         = tvi;
  333.                       tvins.hInsertAfter = hPrev;
  334.                       tvins.hParent      = hParent;
  335.                       hPrev = TreeView_InsertItem(hwndTreeView, &tvins) ;
  336. //////the next code expand all item but CD-ROM in Tree view/////////
  337. //
  338. //TreeView_Expand(hwndTreeView,hPrev,TVE_TOGGLE);
  339. //
  340. /////code end//////////////////////////////////////////////////////
  341.                    }
  342.                    lpMalloc -> lpVtbl -> Free(lpMalloc, lpifqThisItem) ;
  343.                    lpifqThisItem=0;
  344.                 }
  345.                 lpMalloc -> lpVtbl -> Free(lpMalloc, lpi) ;  //Finally, free the pidl that the shell gave us...
  346.                 lpi=0;
  347.             }
  348.         }
  349.     }
  350.     else
  351.        return;
  352. Done:
  353.     ReleaseCapture() ;
  354.     SetCursor( LoadCursor( NULL, IDC_ARROW)) ;
  355.     if( lpe)
  356. lpe -> lpVtbl -> Release( lpe) ;
  357.     if( lpi && lpMalloc)
  358. lpMalloc -> lpVtbl -> Free(lpMalloc, lpi) ;
  359.     if( lpifqThisItem && lpMalloc)
  360. lpMalloc -> lpVtbl -> Free(lpMalloc, lpifqThisItem) ;
  361.     if( lpMalloc)
  362. lpMalloc -> lpVtbl -> Release(lpMalloc) ;
  363. } 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");    }    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)
  364.                 SHFileOperation(&shop);
  365.          }
  366.           else
  367.           SHFileOperation(&shop);
  368.           FindClose(h);
  369.       }
  370.       else
  371.          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)
  372.                SHFileOperation(&shop);
  373.          }
  374.          else
  375.           SHFileOperation(&shop);
  376.          FindClose(h);
  377.       }
  378.       else
  379.          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]=='')     return FALSE;    for(i=0;i<(int)strlen(szRunCommand);i++)    {     if(szRunCommand[i]!=' ')        szSourceFile[i]=szRunCommand[i];       else       {          int j;        strcat(szSourceFile,"");          for(j=0;j<(int)strlen(szRunCommand)-i-1;j++)             szRunCommand[j]=szRunCommand[i+j+1];          szRunCommand[j]='';          szRunCommand[j+1]='';          return TRUE;       }    } if(szRunCommand[i]=='')    {     wsprintf(szRunCommand,"");     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]=='' && (GetFileAttributes(szSourceFile)&FILE_ATTRIBUTE_DIRECTORY))     wsprintf(szDestFolder,szSourceFile);    else     GetPathFromFileName(szSourceFile,szDestFolder);    GetOnlyFilename(szDestFolder,s,SZ_LONGNAME);    if(s[1]==':')     wsprintf(s,"");    RestoreCheckCommand();    if((strlen(szFoldername)+strlen(s))>=MAX_PATH)     s[MAX_PATH-strlen(szFoldername)]='';    wsprintf(szDestFolder,szFoldername);    if(szFoldername[3]=='') //like c:,so cut the ""     szDestFolder[2]='';    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.x<CDestRt.right && pt.y>CDestRt.top && pt.y<CDestRt.bottom)             { if(!bInText)                {                   bInText=TRUE;             SetDlgItemText(hWnd,IDC_CHANGDEST,"目的文件夹:");                }             }             else                if(bInText)                {                   bInText=FALSE;                 SetDlgItemText(hWnd,IDC_CHANGDEST,"目的文件夹:");                }          } break; case WM_CTLCOLORSTATIC:        SetBkColor((HDC)wParam,(COLORREF)(GetSysColor(COLOR_MENU)));          if((HWND)lParam==GetDlgItem(hWnd,IDC_CHANGDEST)) if(!bInText)              SetTextColor((HDC)wParam,0x00ff0000);             else              SetTextColor((HDC)wParam,(COLORREF)(GetSysColor(COLOR_HIGHLIGHT)));        return (BOOL)GetStockObject(NULL_BRUSH); case MYWM_ICON: //该消息为临时借用,先显示对话框再完成最后的初始化          while(SendMessage(hTypeWnd,CB_GETCOUNT,0,0)>0)     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);
  380.       case WM_COMMAND:
  381.        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<j;i++)                 { ListView_GetItemText(hDest,c,0,szd,MAX_PATH);                      if(szd[0]==' ') {    for(k=0;k<(int)(strlen(szd)-1);k++)     szd[k]=szd[k+1];    szd[k]=''; } ch=DelFile(szd);                      if(ch==DEL_CANCEL)                       break;                      else if(ch==FALSE)                      {                       c++;                         continue;                      }                    ListView_DeleteItem(hDest,c);                 }                   ListView_SetColumnWidth(hDest,0,LVSCW_AUTOSIZE);                   SendMessage(hWnd,MYWM_ICON,0,0);                   //SendMessage(hTypeWnd,CB_GETLBTEXT,SendMessage(hTypeWnd,CB_GETCURSEL,0,0),(LPARAM)szd);                 //ImageList_Destroy(ListView_GetImageList(GetDlgItem(hWnd,IDC_SELECTSEND),LVSIL_STATE)); //FillSend(GetDlgItem(hWnd,IDC_SELECTSEND),szd);              }             }              break;             case IDC_ADDSELECT:             case IDC_DELSELECT:             {              int i,j;                HWND hSel,hDest;                char szd[MAX_PATH];                if(LOWORD(wParam)==IDC_ADDSELECT)                {                 hSel=GetDlgItem(hWnd,IDC_SELECTSEND);                   hDest=GetDlgItem(hWnd,IDC_SELECTDEST);                }                else                {                 hDest=GetDlgItem(hWnd,IDC_SELECTSEND);                   hSel=GetDlgItem(hWnd,IDC_SELECTDEST);                }                j=ListView_GetItemCount(hSel);                for(i=0;i<j;i++)                { if((ListView_GetItemState(hSel,i,LVIF_STATE)&LVIS_DROPHILITED))                   {                 ListView_GetItemText(hSel,i,0,szd,MAX_PATH);                      AddListview(hDest,szd,ListView_GetItemCount(hDest));                      ListView_DeleteItem(hSel,i);                      ListView_SetColumnWidth(hSel,0,LVSCW_AUTOSIZE);                      j--;                      i--;                   }                }             }              break;             case IDC_ADDALL:             case IDC_DELALL:             {              int i,j;                HWND hSel,hDest;                char szd[MAX_PATH];                if(LOWORD(wParam)==IDC_ADDALL)                {                 hSel=GetDlgItem(hWnd,IDC_SELECTSEND);                   hDest=GetDlgItem(hWnd,IDC_SELECTDEST);                }                else                {                 hDest=GetDlgItem(hWnd,IDC_SELECTSEND);                   hSel=GetDlgItem(hWnd,IDC_SELECTDEST);                }                j=ListView_GetItemCount(hSel);                for(i=0;i<j;i++)                { ListView_GetItemText(hSel,0,0,szd,MAX_PATH);                   AddListview(hDest,szd,ListView_GetItemCount(hDest));                   ListView_DeleteItem(hSel,0);                   ListView_SetColumnWidth(hSel,0,LVSCW_AUTOSIZE);                }             }              break;             case IDC_MOVE:              if(IsDlgButtonChecked(hWnd,IDC_MOVE)==BST_CHECKED)              {                 dofileop.uOp=FO_MOVE;                   if(hBaseWnd!=NULL)                      CheckDlgButton(hBaseWnd,IDC_MOVE,BST_CHECKED);                }                else                {                 dofileop.uOp=FO_COPY;                   if(hBaseWnd!=NULL)                      CheckDlgButton(hBaseWnd,IDC_MOVE,BST_UNCHECKED);                }                break;             case IDC_NOFOLDER:              if(IsDlgButtonChecked(hWnd,IDC_NOFOLDER)==BST_CHECKED)                {              dofileop.bNoFolder=TRUE;                   if(hBaseWnd!=NULL)                    CheckDlgButton(hBaseWnd,IDC_NOFOLDER,BST_CHECKED);                }                else                {                 dofileop.bNoFolder=FALSE;                   if(hBaseWnd!=NULL)                      CheckDlgButton(hBaseWnd,IDC_NOFOLDER,BST_UNCHECKED);                }                ShowWindow(GetDlgItem(hWnd,IDC_DESTFOLDER),SW_HIDE); SendMessage(hWnd,WM_COMMAND,MAKELONG((WORD)IDC_NEWFOLDER,(WORD)EN_CHANGE),0);                ShowWindow(GetDlgItem(hWnd,IDC_DESTFOLDER),SW_SHOW);                break;             case IDC_UPDATE:                if(IsDlgButtonChecked(hWnd,IDC_UPDATE)==BST_CHECKED)                {                   dofileop.bUpdate=TRUE;                   if(hBaseWnd!=NULL)                      CheckDlgButton(hBaseWnd,IDC_UPDATE,BST_CHECKED);                }                else                {                   dofileop.bUpdate=FALSE;                   if(hBaseWnd!=NULL)                      CheckDlgButton(hBaseWnd,IDC_UPDATE,BST_UNCHECKED);                   break;                }                if(!bNoMsg)                 if(!DialogBox(hInst,MAKEINTRESOURCE(IDD_MSG),hWnd,(DLGPROC)MsgProc))                   {                    CheckDlgButton(hWnd,IDC_UPDATE,BST_UNCHECKED);                      if(hBaseWnd!=NULL)                       CheckDlgButton(hBaseWnd,IDC_UPDATE,BST_UNCHECKED);                      dofileop.bUpdate=FALSE;                   }                break;          }          switch(HIWORD(wParam))          {           case CBN_SELCHANGE:             {              char ext[80];                SendMessage(hTypeWnd,CB_GETLBTEXT,SendMessage(hTypeWnd,CB_GETCURSEL,0,0),(LPARAM)ext);                ListView_DeleteAllItems(GetDlgItem(hWnd,IDC_SELECTSEND));                ImageList_Destroy(ListView_GetImageList(GetDlgItem(hWnd,IDC_SELECTSEND),LVSIL_STATE)); FillSend(GetDlgItem(hWnd,IDC_SELECTSEND),ext);             }             break;             case EN_CHANGE:              if((int)LOWORD(wParam)==IDC_NEWFOLDER)                {                   char s[80];                   int i;                 ZeroMemory(szShowDest,MAX_PATH);                   ZeroMemory(s,80);                   GetDlgItemText(hWnd,IDC_NEWFOLDER,s,80);                   for(i=0;i<80;i++)                    if(s[i]=='*' || s[i]=='?' || s[i]==':' || s[i]=='/' || s[i]=='"' || s[i]=='<' || s[i]=='>')                      {                       Errmsg("非法字符串");                         s[i]=''; SetDlgItemText(hWnd,IDC_NEWFOLDER,s);                         break;                      }                   if(dofileop.bNoFolder)          {                      if((strlen(szFoldername)+strlen(s))>=MAX_PATH)     s[MAX_PATH-strlen(szFoldername)]='';                      wsprintf(szShowDest,"%s\%s",szFoldername,s);                   }           else                   {                      if((strlen(szDestFolder)+strlen(s))>=MAX_PATH)     s[MAX_PATH-strlen(szDestFolder)]='';                      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]=='') //仅一个目录或文件 {       if((GetFileAttributes(szSourceFile)&FILE_ATTRIBUTE_DIRECTORY))       {        wsprintf(szThisFolder,szSourceFile);          if(szThisFolder[3]=='')           szThisFolder[2]='';          FillSend(GetDlgItem(hWnd,IDC_SELECTSEND),NULL);          wsprintf(szRunCommand,szForCheck);          SetCurrentDirectory(szSourceFile);          return;       }    }    GetPathFromFileName(szSourceFile,szThisFolder);    if(szThisFolder[2]=='')    {     szThisFolder[2]='\';       szThisFolder[3]='';     SetCurrentDirectory(szThisFolder);       szThisFolder[2]='';    }    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]=='')       szThisFolder[2]='';    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]=='')    {     szThisFolder[2]='\';       szThisFolder[3]='';     SetCurrentDirectory(szThisFolder);       szThisFolder[2]='';    }    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))    {
  382.          char x[MAX_PATH];
  383.          wsprintf(x," %s",wfile.cFileName);
  384.          lvi.pszText = x;
  385.       }
  386.       else
  387.        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;
  388. lvi.stateMask = 0;
  389. lvi.iItem = i;
  390. lvi.iSubItem = 0;
  391. lvi.cchTextMax = MAX_PATH;
  392. lvi.iImage = i;
  393. lvi.lParam = (LPARAM)&wfile;
  394.       i++;
  395. ListView_InsertItem(hWnd,&lvi);
  396.       AddFileType(wfile.cFileName);
  397.    }while(FindNextFile(hFile,&wfile));    FindClose(hFile);    ListView_SetColumnWidth(hWnd,0,LVSCW_AUTOSIZE); } #pragma argsused LRESULT NotifyHandler( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
  398. {
  399. POINT pt;
  400.    LPNMHDR lphdr=(LPNMHDR)lParam;
  401.    LV_HITTESTINFO lvhti ;
  402. switch(lphdr->code)
  403.    {
  404.       case NM_KILLFOCUS:
  405.        nFocused=-1;
  406.          break;
  407. case NM_CLICK:
  408.       {
  409.          GetCursorPos( &pt) ;
  410.          ScreenToClient(lphdr->hwndFrom, &pt) ;
  411.          lvhti.pt=pt;
  412.          ListView_HitTest(lphdr->hwndFrom, &lvhti) ;
  413.          if(lvhti.flags & LVHT_ONITEM)
  414.          {
  415.             if((HIBYTE(GetKeyState(VK_SHIFT))&1) && nFocused!=-1)
  416.             {
  417.                int i,j=ListView_GetItemCount(lphdr->hwndFrom);
  418.                BOOL bIn=FALSE;
  419.              for(i=0;i<j;i++)
  420.                {
  421.                 if(i!=nFocused && i!=lvhti.iItem)
  422.                   {
  423.                    if(bIn)
  424.                      {
  425.                       ListView_SetItemState(lphdr->hwndFrom,i,LVIS_DROPHILITED,LVIF_STATE);
  426.                      }
  427.                      else
  428.                       ListView_SetItemState(lphdr->hwndFrom,i,0,LVIF_STATE);
  429.                   }
  430.                   else
  431.                   {
  432.                    ListView_SetItemState(lphdr->hwndFrom,i,LVIS_DROPHILITED,LVIF_STATE);
  433.                      bIn=!bIn;
  434.                      if(nFocused==lvhti.iItem)
  435.                       bIn=FALSE;
  436.                   }
  437.                }
  438.             }
  439.             else
  440.             {
  441.              if((ListView_GetItemState(lphdr->hwndFrom,lvhti.iItem,LVIF_STATE)&LVIS_DROPHILITED))
  442.             {
  443.                ListView_SetItemState(lphdr->hwndFrom,lvhti.iItem,0,LVIF_STATE);
  444.              }
  445.              else
  446.              {
  447.                ListView_SetItemState(lphdr->hwndFrom,lvhti.iItem,LVIS_DROPHILITED,LVIF_STATE);
  448.             }
  449.                nFocused=lvhti.iItem;
  450.             }
  451.          }
  452.       }
  453.       break;
  454.    }
  455. return 0L;
  456. } void InitCol(HWND hWnd) {    LV_COLUMN lvC; lvC.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM; lvC.fmt = LVCFMT_LEFT;  // 列元左对齐
  457. lvC.cx = 86;            // 列元的像素宽度
  458. lvC.pszText = "File";//szText; // 列元的文字字符串地址
  459. lvC.iSubItem = 0;
  460.    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]!='')       {        szDisplay[w]=szDisplay[w+1];          w++;       }       szDisplay[w]='';    }    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;
  461. lvi.stateMask = 0;
  462. lvi.iItem = i;
  463. lvi.iSubItem = 0;
  464.    if((wfile.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY))
  465. {
  466.       char x[MAX_PATH];
  467.       wsprintf(x," %s",wfile.cFileName);
  468.       lvi.pszText = x;
  469.    }
  470.    else
  471. lvi.pszText = wfile.cFileName;//LPSTR_TEXTCALLBACK;
  472. lvi.cchTextMax = MAX_PATH;
  473. lvi.iImage = ImageList_GetImageCount(hIList)-1;
  474. lvi.lParam = (LPARAM)&wfile;
  475. ListView_InsertItem(hWnd,&lvi);
  476. ListView_SetColumnWidth(hWnd,0,LVSCW_AUTOSIZE); } void AddFileType(LPSTR s) { char sztype[80];    int i,j,k=0;
  477.    char str[80];
  478.    if((GetFileAttributes(s)&FILE_ATTRIBUTE_DIRECTORY))
  479.       wsprintf(sztype,"文件夹");
  480. else
  481.    GetFileTypeName(s,sztype);
  482.    if(sztype[0]=='')     wsprintf(sztype,"无扩展名文件"); j=SendMessage(hTypeWnd,CB_GETCOUNT,0,0);    for(i=0;i<j;i++)    {     SendMessage(hTypeWnd,CB_GETLBTEXT,i,(LPARAM)str);     if(strcmpi(str,sztype)==0) {        k++;          break;       }    }    if(k==0)     SendMessage(hTypeWnd,CB_ADDSTRING,0,(LPARAM)sztype); } void DoSend(void) {    char s[MAX_PATH],d[MAX_PATH]; SHFILEOPSTRUCT shop;    BOOL bnouse=FALSE;    WIN32_FIND_DATA wfile,wdest;    char dst[MAX_PATH];    HANDLE h;//,hFile;    HWND hDest=GetDlgItem(hExternWnd,IDC_SELECTDEST);    int i,k,j=ListView_GetItemCount(hDest),c=0,l;    char szSend[MAX_PATH];    if(j==0)     return;    shop.hwnd=hMainWnd;    shop.wFunc=dofileop.uOp;    if(dofileop.bNoAsk)    shop.fFlags=FOF_NOCONFIRMATION;    else     shop.fFlags=FOF_ALLOWUNDO;    shop.fAnyOperationsAborted=bnouse;    shop.hNameMappings=NULL;    shop.lpszProgressTitle=NULL;    ZeroMemory(d,MAX_PATH);    GetDlgItemText(hExternWnd,IDC_DESTFOLDER,d,MAX_PATH);    if(strlen(d)>0)     if(d[strlen(d)-1]=='\')     d[strlen(d)-1]=''; MkDir(d);    shop.pTo=d;    ZeroMemory(s,MAX_PATH);    for(i=0;i<j;i++)    {       ZeroMemory(szSend,MAX_PATH); ListView_GetItemText(hDest,i,0,szSend,MAX_PATH);       if(szSend[0]==' ') {    for(k=0;k<(int)(strlen(szSend)-1);k++)     szSend[k]=szSend[k+1];    szSend[k]=''; } /*     if(dofileop.bNoFolder)    {        if(GetFileAttributes(szSend)==FILE_ATTRIBUTE_DIRECTORY)        {          ZeroMemory(s,MAX_PATH);          wsprintf(s,"%s\*.*",szSend);           SetCurrentDirectory(szSend);           hFile=FindFirstFile(s,&wfile);          while(FindNextFile(hFile,&wfile))           {              if(stricmp(wfile.cFileName,"..")==0)                continue;              ZeroMemory(s,MAX_PATH);             wsprintf(s,"%s\",szSend); 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)
  483.                SHFileOperation(&shop);
  484.           }
  485.          else
  486.           SHFileOperation(&shop);
  487.           FindClose(h);
  488.        }
  489.        else
  490.       SHFileOperation(&shop);          }           FindClose(hFile);           continue;       }     } */       if((strlen(szSend)+c)<MAX_PATH-4)    {          if(dofileop.bUpdate)     {         wsprintf(dst,"%s\%s",shop.pTo,szSend);        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)
  491.             {
  492.                   FindClose(h);
  493.                 continue;//SHFileOperation(&shop);
  494.                }
  495.       }
  496.        else
  497.             {
  498.              FindClose(h);
  499.          continue;
  500.             }
  501.       FindClose(h);
  502.     }
  503.          for(l=0;l<(int)strlen(szSend);l++)          {           s[c]=szSend[l];             c++;          }          s[c]='';          c++;          continue;       } else       {       s[c]='';        shop.pFrom=s; SHFileOperation(&shop);          ZeroMemory(s,MAX_PATH);          c=0;          for(l=0;l<(int)strlen(szSend);l++)          {           s[c]=szSend[l];             c++;          }          s[c]='';          c++;          continue;       } }    s[c]='';    shop.pFrom=s; SHFileOperation(&shop); }