www.pudn.com > 大量windows shell编程例子.zip > FileMap.cpp


/***************************************************************** 
* 
*  Project.....:  File Mapping Objects 
*  Application.:  FILEMAP.exe 
*  Module......:  FILEMAP.cpp 
*  Description.:  Application main module 
*  Compiler....:  MS Visual C++ 
*  Written by..:  D. Esposito 
*  Environment.:  Windows 9x/NT 
* 
******************************************************************/ 
 
/*---------------------------------------------------------------*/ 
//                        PRAGMA section 
/*---------------------------------------------------------------*/ 
// Force the linker to add the following libraries. 
#ifdef _MSC_VER 
 
#pragma comment(lib, "kernel32.lib") 
#pragma comment(lib, "user32.lib") 
#pragma comment(lib, "gdi32.lib") 
#pragma comment(lib, "shell32.lib") 
#pragma comment(lib, "comctl32.lib") 
 
#endif 
 
/*---------------------------------------------------------------*/ 
//                        INCLUDE section 
/*---------------------------------------------------------------*/ 
#include "FileMap.h" 
#include  
#include  
#include "resource.h" 
 
/*---------------------------------------------------------------*/ 
//                        GLOBAL section 
/*---------------------------------------------------------------*/ 
// Data 
HICON g_hIconLarge; 
HICON g_hIconSmall; 
 
struct SHNAMEMAPPINGHEADER 
{ 
   UINT cNumOfMappings; 
   LPSHNAMEMAPPING lpNM; 
}; 
 
typedef SHNAMEMAPPINGHEADER* LPSHNAMEMAPPINGHEADER; 
 
typedef BOOL (CALLBACK *ENUMFILEMAPPROC)(LPSHNAMEMAPPING, DWORD); 
 
// Functions 
void OnInitDialog(HWND); 
void OnOK(HWND); 
 
int SHEnumFileMapping(HANDLE, ENUMFILEMAPPROC, DWORD); 
 
// Callbacks 
BOOL CALLBACK APP_DlgProc(HWND, UINT, WPARAM, LPARAM); 
BOOL CALLBACK ProcessNM(LPSHNAMEMAPPING, DWORD); 
 
 
/*---------------------------------------------------------------*/ 
// Procedure....: WinMain() 
// Description..: Entry point in any Windows program 
// Input........: HINSTANCE, HINSTANCE, LPSTR, int 
// Output.......: int 
/*---------------------------------------------------------------*/ 
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevious,  
                     LPTSTR lpsz, int iCmd) 
{ 
   // Save global data 
   g_hIconLarge = static_cast( 
              LoadImage(hInstance, "APP_ICON", IMAGE_ICON, 
              GetSystemMetrics(SM_CXICON), GetSystemMetrics(SM_CXICON), 0)); 
   g_hIconSmall = static_cast( 
              LoadImage(hInstance, "APP_ICON", IMAGE_ICON, 
              GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CXSMICON), 0)); 
 
   // Enable common controls 
   INITCOMMONCONTROLSEX iccex; 
   iccex.dwSize = sizeof(INITCOMMONCONTROLSEX); 
   iccex.dwICC = ICC_WIN95_CLASSES; 
   InitCommonControlsEx(&iccex); 
 
   // Run main dialog 
   BOOL b = DialogBox(hInstance, "DLG_MAIN", NULL, APP_DlgProc); 
 
   // Exit 
   DestroyIcon(g_hIconLarge); 
   DestroyIcon(g_hIconSmall); 
   return b; 
} 
 
 
/*---------------------------------------------------------------*/ 
// Procedure....: APP_DlgProc() 
// Description..: Responds to all messages sent to the dialog 
// Input........: HWND, UINT, WPARAM, LPARAM 
// Output.......: BOOL 
/*---------------------------------------------------------------*/ 
BOOL CALLBACK APP_DlgProc(HWND hDlg, UINT uiMsg, WPARAM wParam, LPARAM lParam) 
{ 
   switch(uiMsg) 
   { 
   case WM_INITDIALOG: 
      OnInitDialog(hDlg); 
      break; 
 
   case WM_COMMAND: 
      switch(wParam) 
      { 
      case IDOK: 
         OnOK(hDlg); 
         return FALSE; 
 
      case IDCANCEL: 
         EndDialog(hDlg, FALSE); 
         return FALSE; 
      } 
      break; 
   } 
 
   return FALSE; 
} 
 
 
/***************************************************************** 
* 
*  Internals: 
*    - OnOK() 
*    - OnInitDialog() 
* 
******************************************************************/ 
 
/*---------------------------------------------------------------*/ 
// Procedure...: OnOK() 
// Description.: Do something 
// INPUT.......: HWND 
// OUTPUT......: void 
/*---------------------------------------------------------------*/ 
void OnOK(HWND hDlg) 
{ 
   TCHAR pszFrom[1024] = {0}; 
   TCHAR pszTo[MAX_PATH] = {0}; 
 
   GetDlgItemText(hDlg, IDC_FROM, pszFrom, MAX_PATH); 
   GetDlgItemText(hDlg, IDC_TO, pszTo, MAX_PATH); 
 
   SHFILEOPSTRUCT shfo; 
   ZeroMemory(&shfo, sizeof(SHFILEOPSTRUCT)); 
   shfo.hwnd = hDlg; 
   shfo.wFunc = FO_COPY; 
   shfo.pFrom = pszFrom; 
   shfo.pTo = pszTo; 
   shfo.fFlags = FOF_NOCONFIRMMKDIR | 
                 FOF_RENAMEONCOLLISION | 
                 FOF_WANTMAPPINGHANDLE; 
 
   int iRC = SHFileOperation(&shfo); 
   if(iRC) 
   { 
      SPB_SystemMessage(iRC); 
      return; 
   } 
 
   // Trace the value of the handle 
   Msg("hNameMappings is: %x", shfo.hNameMappings); 
 
   // Enumerate the file mapping objects 
   SHEnumFileMapping(shfo.hNameMappings, ProcessNM, 
                           reinterpret_cast(GetDlgItem(hDlg, IDC_LIST))); 
 
   // Free the object, as recommended 
   if(shfo.hNameMappings) 
      SHFreeNameMappings(shfo.hNameMappings); 
} 
 
 
/*---------------------------------------------------------------*/ 
// Procedure...: OnInitDialog() 
// Description.: Initialize the dialog 
// INPUT.......: HWND 
// OUTPUT......: void 
/*---------------------------------------------------------------*/ 
void OnInitDialog(HWND hDlg) 
{ 
   HWND hwndList = GetDlgItem(hDlg, IDC_LIST); 
 
   // Set up the report view 
   LV_COLUMN lvc; 
   ZeroMemory(&lvc, sizeof(LV_COLUMN)); 
 
   lvc.mask = LVCF_TEXT | LVCF_WIDTH; 
   lvc.cx = 200; 
 
   lvc.pszText = "Original File"; 
   ListView_InsertColumn(hwndList, 0, &lvc); 
 
   lvc.pszText = "Target File"; 
   ListView_InsertColumn(hwndList, 1, &lvc); 
 
   // Initialize the edit fields 
   SetDlgItemText(hDlg, IDC_FROM, "c:\\thedir\\*.*"); 
   SetDlgItemText(hDlg, IDC_TO, "c:\\newdir"); 
 
   // Set the icons (T/F as to Large/Small icon) 
   SendMessage(hDlg, WM_SETICON, FALSE, reinterpret_cast(g_hIconSmall)); 
   SendMessage(hDlg, WM_SETICON, TRUE, reinterpret_cast(g_hIconLarge)); 
} 
 
 
int SHEnumFileMapping(HANDLE hNameMappings, ENUMFILEMAPPROC lpfnEnum, DWORD dwData) 
{ 
   SHNAMEMAPPING shNM; 
 
   // Check the handle 
   if(!hNameMappings) 
      return -1; 
 
   // Get the header of the structure 
   LPSHNAMEMAPPINGHEADER lpNMH = static_cast(hNameMappings); 
   int iNumOfNM = lpNMH->cNumOfMappings; 
 
   // Check the function pointer; if NULL, just return the number of mappings 
   if(!lpfnEnum) 
      return iNumOfNM; 
 
   // Enumerate the objects 
   LPSHNAMEMAPPING lp = lpNMH->lpNM; 
   int i = 0; 
 
   while(i < iNumOfNM) 
   { 
      CopyMemory(&shNM, &lp[i++], sizeof(SHNAMEMAPPING)); 
      if(!lpfnEnum(&shNM, dwData)) 
         break; 
   } 
 
   // Returns the number of objects actually processed 
   return i; 
} 
 
 
BOOL CALLBACK ProcessNM(LPSHNAMEMAPPING pshNM, DWORD dwData) 
{ 
   TCHAR szBuf[1024] = {0}; 
   TCHAR szOldPath[MAX_PATH] = {0}; 
   TCHAR szNewPath[MAX_PATH] = {0}; 
   OSVERSIONINFO os; 
 
   // We need to know the underlying OS 
   os.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); 
   GetVersionEx(&os); 
   BOOL bIsNT = (os.dwPlatformId == VER_PLATFORM_WIN32_NT); 
 
   // Under NT the SHNAMEMAPPING structure includes UNICODE strings 
   if(bIsNT) 
   { 
      WideCharToMultiByte(CP_ACP, 0, (LPWSTR)pshNM->pszOldPath, 
         MAX_PATH, szOldPath, MAX_PATH, NULL, NULL); 
      WideCharToMultiByte(CP_ACP, 0, (LPWSTR)pshNM->pszNewPath, 
         MAX_PATH, szNewPath, MAX_PATH, NULL, NULL); 
   } 
   else 
   { 
      lstrcpy(szOldPath, pshNM->pszOldPath); 
      lstrcpy(szNewPath, pshNM->pszNewPath); 
   } 
 
   // Save the list view handle 
   HWND hwndListView = reinterpret_cast(dwData); 
 
   // Create a \0 separated string 
   LPTSTR psz = szBuf; 
   lstrcpyn(psz, szOldPath, pshNM->cchOldPath + 1); 
   lstrcat(psz, __TEXT("\0")); 
 
   psz += lstrlen(psz) + 1; 
 
   lstrcpyn(psz, szNewPath, pshNM->cchNewPath + 1); 
   lstrcat(psz, __TEXT("\0")); 
 
   // Add the strings to the report view 
   LV_ITEM lvi; 
   ZeroMemory(&lvi, sizeof(LV_ITEM)); 
   lvi.mask = LVIF_TEXT; 
   lvi.pszText = szBuf; 
   lvi.cchTextMax = lstrlen(szBuf); 
   lvi.iItem = 0; 
   ListView_InsertItem(hwndListView, &lvi); 
 
   psz = szBuf + lstrlen(szBuf) + 1; 
   ListView_SetItemText(hwndListView, 0, 1, psz); 
 
   return TRUE; 
} 
 
/*  End of file: FileMap.cpp  */