老羅win32彙編例子修改
#include <windows.h>
#include <process.h>
//#include <objidl.h>
#include "resource.h"
#include "FindFile.h"
#include "BrowseFolder.h"
BOOL CALLBACK DialogProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
void ProcThread (PVOID pvoid);
HWND hWinMain;
TCHAR szPath[MAX_PATH];
TCHAR szSearchInfo[] = L"共找到 %d 個文件夾,%d 個文件,共 %I64dK 字節";
bool all;
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
DialogBoxParam (hInstance, MAKEINTRESOURCE(IDD_DIALOG), NULL, DialogProc, 0);
return 0;
}
BOOL CALLBACK DialogProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static HWND hwndOk;
HANDLE hIcon;
static TCHAR szBuffer[MAX_PATH];
HINSTANCE hInstance;
switch (message)
{
case WM_INITDIALOG:
hWinMain = hwnd;
hwndOk = GetDlgItem (hwnd, IDOK);
EnableWindow(hwndOk, false) ;
SendDlgItemMessage (hwnd, IDC_EDIT, EM_SETLIMITTEXT,MAX_PATH,0);
hInstance = GetModuleHandle (NULL);
hIcon = LoadIcon (hInstance, MAKEINTRESOURCE (IDI_ICON) );
SendMessage(hwnd,WM_SETICON,ICON_BIG, (LPARAM)hIcon);
return true;
case WM_COMMAND:
switch (LOWORD(wParam) )
{
case IDOK:
if (dwOption & F_SEARCHING)
dwOption |= F_STOP;
else
{
GetDlgItemText (hwnd, IDC_EDIT, szPath, MAX_PATH);
_beginthread (ProcThread, 0, szPath) ;//啓動線程函數
}
break;
case IDC_ALL:
all = true;
EnableWindow(hwndOk, true) ;
GetLogicalDriveStrings (sizeof (szPath), szPath);
_beginthread (ProcThread, 0, szPath) ;//啓動線程函數
break;
case IDC_BROWSE:
if (BrowseFolder(hwnd, szPath) )
SetDlgItemText(hwnd, IDC_EDIT, szPath);
break;
case IDC_PATH:
MessageBox (hwnd, L"IDPATH",L"提示",MB_OK);
break;
case IDC_EDIT:
int ch = GetDlgItemText (hwnd, IDC_EDIT, szBuffer, MAX_PATH);
EnableWindow(hwndOk, ch) ;
break;
}
return true;
case WM_CLOSE:
if ( !(dwOption & F_SEARCHING) )
EndDialog(hwnd,NULL);
return true;
}
return false;
}
void ProcThread (PVOID pvoid)
{
TCHAR szBuffer[256];
dwOption &= ~F_STOP;
dwOption |= F_SEARCHING;
EnableWindow (GetDlgItem (hWinMain, IDC_BROWSE), FALSE);
EnableWindow (GetDlgItem (hWinMain, IDC_EDIT), FALSE);
EnableWindow (GetDlgItem (hWinMain, IDC_ALL), FALSE);
SetDlgItemText (hWinMain, IDOK, TEXT("停止") );
if (all)
{
TCHAR Drive[4];
for (int i=0; ; i += 4)
{
if (szPath[i] == L'\0')
break;
lstrcpy (Drive, szPath);
FindFile (&szPath[i]);
}
}
else
FindFile (szPath);
wsprintf (szBuffer, szSearchInfo, dwFolderCount,dwFileCount, dwFileSize / 1000);
SetDlgItemText (hWinMain, IDC_PATH, szBuffer);
EnableWindow (GetDlgItem (hWinMain, IDC_BROWSE), TRUE);
EnableWindow (GetDlgItem (hWinMain, IDC_EDIT), TRUE);
EnableWindow (GetDlgItem (hWinMain, IDC_ALL), TRUE);
SetDlgItemText (hWinMain, IDOK, TEXT("開始") );
SetDlgItemText (hWinMain,IDC_EDIT, szPath);
dwOption &= ~F_SEARCHING;
}
#ifndef BROWSEFOLDER_H
#define BROWSEFOLDER_H
#include <shlobj.h>
TCHAR szDirInfo[] = L"請選擇目錄:";
TCHAR* BrowseFolderTmp;
int CALLBACK BrowseFolderCallBack(HWND hwnd, UINT msg, LPARAM lParam, LPARAM lpData)//瀏覽對話框回調函數
{
TCHAR szBuffer[130];
if (msg == BFFM_INITIALIZED)
SendMessage (hwnd, BFFM_SETSELECTION, true, (LPARAM)BrowseFolderTmp);
else
if (msg == BFFM_SELCHANGED)
{
SHGetPathFromIDList ((LPCITEMIDLIST)lParam, szBuffer);
SendMessage(hwnd,BFFM_SETSTATUSTEXT,0, (LPARAM)szBuffer);
}
return 0;
}
int BrowseFolder(HWND hwnd, TCHAR szBuffer[])//瀏覽對話框模塊
{
BROWSEINFO stBrowseInfo;
IMalloc *stMalloc;
bool dwReturn;
LPCITEMIDLIST pidlParent;
CoInitialize (NULL);
if ( E_FAIL == SHGetMalloc (&stMalloc) )
{
CoUninitialize();
return false;
}
RtlZeroMemory (&stBrowseInfo, sizeof (stBrowseInfo) );
stBrowseInfo.hwndOwner = hwnd;
BrowseFolderTmp = szBuffer;
stBrowseInfo.lpfn = BrowseFolderCallBack;
stBrowseInfo.lpszTitle = szDirInfo;
stBrowseInfo.ulFlags = BIF_RETURNONLYFSDIRS | BIF_STATUSTEXT;
if (NULL == ( pidlParent = SHBrowseForFolder (&stBrowseInfo) ))
dwReturn = FALSE;
else
{
dwReturn = TRUE;
SHGetPathFromIDList (pidlParent, szBuffer);
}
stMalloc->Free ((void *)pidlParent);
stMalloc->Release();
CoUninitialize();
return dwReturn;
}
#endif
#ifndef FINDFILE_H
#define FINDFILE_H
#define F_SEARCHING 1
#define F_STOP 2
extern HWND hWinMain;//主窗口句柄
long long dwFileSize;
unsigned int dwFileCount;
unsigned int dwFolderCount;
int dwOption;
void ProcessFile (TCHAR szFile[])//處理文件模塊
{
HANDLE hFile;
dwFileCount++;
SetDlgItemText (hWinMain, IDC_PATH, szFile);
if (INVALID_HANDLE_VALUE != (hFile = CreateFile (szFile, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0) ) )
dwFileSize += GetFileSize (hFile, NULL);
CloseHandle (hFile);
}
void FindFile (TCHAR szPath[])//目錄搜索模塊
{
HANDLE hFindFile;
WIN32_FIND_DATA stFindFile;
TCHAR szSearch[MAX_PATH];
TCHAR szFindFile[MAX_PATH];
int len = lstrlen (szPath);
if (szPath[len-1] != L'\\')
{
szPath[len] = L'\\';
szPath[len+1] = 0;
}
lstrcpy (szSearch, szPath);
lstrcat (szSearch, TEXT("*.*") );
bool res;
if ( INVALID_HANDLE_VALUE != ( hFindFile = FindFirstFile (szSearch, &stFindFile ) ))
do
{
lstrcpy (szFindFile, szPath);
lstrcat (szFindFile, stFindFile.cFileName);
if (stFindFile.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
if ( stFindFile.cFileName[0] != L'.' )
{
dwFolderCount++;
FindFile(szFindFile);
}
}
else
ProcessFile( szFindFile);
res = FindNextFile (hFindFile, &stFindFile);
}while ( (res != FALSE) && !( dwOption & F_STOP));
FindClose (hFindFile);
}
#endif
//{{NO_DEPENDENCIES}}
// Microsoft Visual C++ generated include file.
// Used by browse.rc
//
#define IDD_DIALOG1 101
#define IDD_DIALOG 101
#define IDI_ICON1 102
#define IDI_ICON 102
#define IDC_BROWSE 1001
#define IDC_EDIT 1002
#define IDC_PATH 1003
#define IDC_BUTTON1 1004
#define IDC_ALL 1004
// Next default values for new objects
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 103
#define _APS_NEXT_COMMAND_VALUE 40001
#define _APS_NEXT_CONTROL_VALUE 1005
#define _APS_NEXT_SYMED_VALUE 101
#endif
#endif