home *** CD-ROM | disk | FTP | other *** search
Wrap
#include <windows.h> #include <commctrl.h> #include <shlobj.h> #include <math.h> #include "view.h" #include "resource.h" // 10000 Linit HANDLE hArrayMutex; char g_szDrive[MAX_PATH]; #define SORT_NONE 0 #define SORT_UP 1 #define SORT_DOWN 2 int iSort[5]; #define MAX_FIND 25 typedef struct tagLISTENTRY { char szPath[MAX_PATH]; char szFind[MAX_FIND+1]; long lPath; long lFileNameStart; // Wo beginnt der Dateiname? long lSize; int iType; FILETIME Time; long lPos; int iIcon; } LISTENTRY; int iNumEntries; LISTENTRY List[10000]; // Fⁿⁿge die Eingaben aus den Eingabefeldern in die Kombinationsfelder ein, falls diese noch // nciht dort verfⁿgbar sind bool IsInCombo( LPSTR lpText, HWND hwndCombo ) { int iCount, i, iLen1, iLen2; char szText[256]; iLen1 = lstrlen( lpText ); iCount = SendMessage( hwndCombo, CB_GETCOUNT, 0, 0 ); for( i = 0; i < iCount; i++ ) { iLen2 = SendMessage( hwndCombo, CB_GETLBTEXT, i, (LPARAM)szText ); if( iLen2 != CB_ERR ) if( CompareString( LOCALE_USER_DEFAULT, NORM_IGNORECASE|SORT_STRINGSORT, lpText, iLen1, szText, iLen2 ) == 2 ) return true; } return false; } void TestAndAddTextToCombo( HWND hwndCombo, int iMax ) { char szText[255]; int iLen; iLen = GetWindowText( hwndCombo, szText, sizeof( szText ) ); if( iLen ) { if( !IsInCombo( szText, hwndCombo ) ) { SendMessage( hwndCombo, CB_INSERTSTRING, 0, (LPARAM)szText ); while( SendMessage( hwndCombo, CB_GETCOUNT, 0, 0 ) > iMax ) { SendMessage( hwndCombo, CB_DELETESTRING, SendMessage( hwndCombo, CB_GETCOUNT, 0, 0 )-1, 0 ); } } } } void AddInputToCombo( HWND hwndDlg ) { TestAndAddTextToCombo( GetDlgItem( hwndDlg, IDC_COMBONAME ), 10 ); TestAndAddTextToCombo( GetDlgItem( hwndDlg, IDC_COMBOMUSTER ), 10 ); TestAndAddTextToCombo( GetDlgItem( hwndDlg, IDC_COMBOSUCHENIN ), 10 ); } bool SetRegKey( HKEY hRoot, LPSTR lpSubKey, LPSTR lpValueName, LPSTR lpValue ) { HKEY hKeyStack[256], hKey; int i, iKeyStart, iStack; char szText[256]; hKey = hRoot; iKeyStart = 0; iStack = 0; while( TRUE ) { i = 0; while( ( lpSubKey[i+iKeyStart] ) && ( lpSubKey[i+iKeyStart] != '\\' ) ) { szText[i] = lpSubKey[i+iKeyStart]; i++; } szText[i]=0; if( i ) { if( RegCreateKey( hKey, lpSubKey, &hKeyStack[iStack] ) == ERROR_SUCCESS ) { iStack++; iKeyStart += i + 1; } else goto cleanup; } else { if( iKeyStart == 0 ) return false; // lpSubKey = "" break; // Ende des Keys erreicht } } RegSetValueEx( hKeyStack[iStack-1], lpValueName, 0, REG_SZ, (CONST BYTE*)lpValue, lstrlen(lpValue) + 1 ); cleanup: while( iStack ) { iStack--; RegCloseKey( hKeyStack[iStack] ); } return true; } bool LoadComboFromRegistry( HWND hwndCombo, HKEY hRoot, LPSTR lpSubKey, int iMax ) { HKEY hKeyStack[256], hKey; int iStack = 0, i, iCount,iKeyStart; char szText[256], szNumber[13]; DWORD dwSize, dwType; LONG lSize; hKey = hRoot; iKeyStart = 0; while( TRUE ) { i = 0; while( ( lpSubKey[i+iKeyStart] ) && ( lpSubKey[i+iKeyStart] != '\\' ) ) { szText[i] = lpSubKey[i+iKeyStart]; i++; } szText[i]=0; if( i ) { if( RegCreateKey( hKey, lpSubKey, &hKeyStack[iStack] ) == ERROR_SUCCESS ) { iStack++; iKeyStart +=i+1; } else goto cleanup; } else { if( iKeyStart == 0 ) return false; // lpSubKey = "" break; // Ende des Keys erreicht } } lSize = lstrlen( szNumber ); iCount = 0; if( RegQueryValue( hKeyStack[iStack-1], NULL, szNumber, &lSize ) == ERROR_SUCCESS ) iCount = atol( szNumber ); if( iCount > iMax ) iCount = iMax; SendMessage( hwndCombo, CB_RESETCONTENT, 0, 0 ); i = 0; while( i < iCount ) { wsprintf( szNumber,"%ld", i ); dwSize = sizeof( szText); dwType = REG_SZ; if( RegQueryValueEx( hKeyStack[iStack-1], szNumber, NULL, &dwType, (LPBYTE)szText, &dwSize ) == ERROR_SUCCESS ) SendMessage( hwndCombo, CB_ADDSTRING, 0, (LPARAM)szText ); i++; } cleanup: while( iStack ) { iStack--; RegCloseKey( hKeyStack[iStack] ); } return true; } bool SaveComboToRegistry( HWND hwndCombo, HKEY hRoot, LPSTR lpSubKey, int iMax ) { HKEY hKeyStack[256], hKey; int iStack = 0, i, iCount,iKeyStart; char szText[256], szNumber[13]; LONG lSize; hKey = hRoot; iKeyStart = 0; while( TRUE ) { i = 0; while( ( lpSubKey[i+iKeyStart] ) && ( lpSubKey[i+iKeyStart] != '\\' ) ) { szText[i] = lpSubKey[i+iKeyStart]; i++; } szText[i]=0; if( i ) { if( RegCreateKey( hKey, lpSubKey, &hKeyStack[iStack] ) == ERROR_SUCCESS ) { iStack++; iKeyStart += i+1; } else goto cleanup; } else { if( iKeyStart == 0 ) return false; // lpSubKey = "" break; // Ende des Keys erreicht } } lSize = lstrlen( szNumber ); if( RegQueryValue( hKeyStack[iStack-1], "", szNumber, &lSize ) == ERROR_SUCCESS ) { iCount = atol( szNumber ); for( i = 0; i < iCount; i++ ) { wsprintf( szNumber, "%ld", i ); RegDeleteValue( hKeyStack[iStack-1], szNumber ); } } iCount = SendMessage( hwndCombo, CB_GETCOUNT, 0, 0 ); if( iCount > iMax ) iCount = iMax; wsprintf( szNumber, "%ld", iCount ); RegSetValue( hKeyStack[iStack-1], NULL, REG_SZ, (LPCTSTR)szNumber, lstrlen(szNumber) + 1 ); for( i = 0; i < iCount; i++ ) { SendMessage( hwndCombo, CB_GETLBTEXT, i, (LPARAM)szText ); wsprintf( szNumber, "%ld", i ); RegSetValueEx( hKeyStack[iStack-1], szNumber, 0, REG_SZ, (LPBYTE)szText, lstrlen( szText ) + 1 ); } cleanup: while( iStack ) { iStack--; RegCloseKey( hKeyStack[iStack] ); } return true; } bool SaveEditToRegistry( HWND hwndEdit, HKEY hRoot, LPSTR lpSubKey ) { HKEY hKeyStack[256], hKey; int iStack = 0, i, iKeyStart; char szText[256]; hKey = hRoot; iKeyStart = 0; while( TRUE ) { i = 0; while( ( lpSubKey[i+iKeyStart] ) && ( lpSubKey[i+iKeyStart] != '\\' ) ) { szText[i] = lpSubKey[i+iKeyStart]; i++; } szText[i]=0; if( i ) { if( RegCreateKey( hKey, lpSubKey, &hKeyStack[iStack] ) == ERROR_SUCCESS ) { iStack++; iKeyStart +=i+1; } else goto cleanup; } else { if( iKeyStart == 0 ) return false; // lpSubKey = "" break; // Ende des Keys erreicht } } RegDeleteValue( hKeyStack[iStack-1], "" ); GetWindowText( hwndEdit, szText, sizeof(szText) ); RegSetValueEx( hKeyStack[iStack-1], "", 0, REG_SZ, (LPBYTE)szText, lstrlen( szText ) + 1 ); cleanup: while( iStack ) { iStack--; RegCloseKey( hKeyStack[iStack] ); } return true; } bool LoadEditFromRegistry( HWND hwndEdit, HKEY hRoot, LPSTR lpSubKey ) { HKEY hKeyStack[256], hKey; int iStack = 0, i, iKeyStart; char szText[256]; LONG lSize; hKey = hRoot; iKeyStart = 0; while( TRUE ) { i = 0; while( ( lpSubKey[i+iKeyStart] ) && ( lpSubKey[i+iKeyStart] != '\\' ) ) { szText[i] = lpSubKey[i+iKeyStart]; i++; } szText[i]=0; if( i ) { if( RegCreateKey( hKey, lpSubKey, &hKeyStack[iStack] ) == ERROR_SUCCESS ) { iStack++; iKeyStart +=i+1; } else goto cleanup; } else { if( iKeyStart == 0 ) return false; // lpSubKey = "" break; // Ende des Keys erreicht } } lSize = sizeof( szText ); RegQueryValue( hKeyStack[iStack-1], "", szText, &lSize ); SetWindowText( hwndEdit, szText ); cleanup: while( iStack ) { iStack--; RegCloseKey( hKeyStack[iStack] ); } return true; } bool SaveCheckboxToRegistry( HWND hwndCheckbox, HKEY hRoot, LPSTR lpSubKey ) { HKEY hKeyStack[256], hKey; int iStack = 0, i, iKeyStart; DWORD dwVal; char szText[256]; hKey = hRoot; iKeyStart = 0; while( TRUE ) { i = 0; while( ( lpSubKey[i+iKeyStart] ) && ( lpSubKey[i+iKeyStart] != '\\' ) ) { szText[i] = lpSubKey[i+iKeyStart]; i++; } szText[i]=0; if( i ) { if( RegCreateKey( hKey, lpSubKey, &hKeyStack[iStack] ) == ERROR_SUCCESS ) { iStack++; iKeyStart +=i+1; } else goto cleanup; } else { if( iKeyStart == 0 ) return false; // lpSubKey = "" break; // Ende des Keys erreicht } } RegDeleteValue( hKeyStack[iStack-1], "" ); dwVal = SendMessage( hwndCheckbox, BM_GETCHECK,0,0 ); wsprintf(szText, "%ld", dwVal ); RegSetValueEx( hKeyStack[iStack-1], "", 0, REG_SZ, (LPBYTE)szText, lstrlen(szText)+1); cleanup: while( iStack ) { iStack--; RegCloseKey( hKeyStack[iStack] ); } return true; } bool LoadCheckboxFromRegistry( HWND hwndCheckbox, HKEY hRoot, LPSTR lpSubKey ) { HKEY hKeyStack[256], hKey; int iStack = 0, i, iKeyStart; char szText[256]; LONG lSize; hKey = hRoot; iKeyStart = 0; while( TRUE ) { i = 0; while( ( lpSubKey[i+iKeyStart] ) && ( lpSubKey[i+iKeyStart] != '\\' ) ) { szText[i] = lpSubKey[i+iKeyStart]; i++; } szText[i]=0; if( i ) { if( RegCreateKey( hKey, lpSubKey, &hKeyStack[iStack] ) == ERROR_SUCCESS ) { iStack++; iKeyStart +=i+1; } else goto cleanup; } else { if( iKeyStart == 0 ) return false; // lpSubKey = "" break; // Ende des Keys erreicht } } lSize = sizeof( szText ); RegQueryValue( hKeyStack[iStack-1], "", szText, &lSize ); SendMessage( hwndCheckbox, BM_SETCHECK,atol(szText),0 ); cleanup: while( iStack ) { iStack--; RegCloseKey( hKeyStack[iStack] ); } return true; } void SaveParameters( HWND hwndDlg ) { SaveComboToRegistry( GetDlgItem( hwndDlg, IDC_COMBONAME ), HKEY_LOCAL_MACHINE, "SOFTWARE\\PCPRO\\WINGREP\\NAME", 10); SaveComboToRegistry( GetDlgItem( hwndDlg, IDC_COMBOMUSTER ), HKEY_LOCAL_MACHINE, "SOFTWARE\\PCPRO\\WINGREP\\MUSTER", 10); SaveComboToRegistry( GetDlgItem( hwndDlg, IDC_COMBOSUCHENIN ), HKEY_LOCAL_MACHINE, "SOFTWARE\\PCPRO\\WINGREP\\SUCHENIN", 10); SaveEditToRegistry( GetDlgItem( hwndDlg, IDC_EDITBIS ), HKEY_LOCAL_MACHINE, "SOFTWARE\\PCPRO\\WINGREP\\BIS"); SaveEditToRegistry( GetDlgItem( hwndDlg, IDC_EDITVON ), HKEY_LOCAL_MACHINE, "SOFTWARE\\PCPRO\\WINGREP\\VON"); SaveEditToRegistry( GetDlgItem( hwndDlg, IDC_EDITLETZTEMONATE ), HKEY_LOCAL_MACHINE, "SOFTWARE\\PCPRO\\WINGREP\\LETZTETAGE"); SaveEditToRegistry( GetDlgItem( hwndDlg, IDC_EDITLETZTETAGE ), HKEY_LOCAL_MACHINE, "SOFTWARE\\PCPRO\\WINGREP\\LETZTEMONATE"); SaveEditToRegistry( GetDlgItem( hwndDlg, IDC_EDITGROESSE ), HKEY_LOCAL_MACHINE, "SOFTWARE\\PCPRO\\WINGREP\\GROESSE"); SaveCheckboxToRegistry( GetDlgItem( hwndDlg, IDC_RECURSEDIR ),HKEY_LOCAL_MACHINE, "SOFTWARE\\PCPRO\\WINGREP\\RECURSEDIR" ); SaveCheckboxToRegistry( GetDlgItem( hwndDlg, IDC_GROSSKLEIN ),HKEY_LOCAL_MACHINE, "SOFTWARE\\PCPRO\\WINGREP\\GROSSKLEIN" ); SaveCheckboxToRegistry( GetDlgItem( hwndDlg, IDC_UNICODE ), HKEY_LOCAL_MACHINE, "SOFTWARE\\PCPRO\\WINGREP\\UNICODE" ); SaveCheckboxToRegistry( GetDlgItem( hwndDlg, IDC_WINDOWSSYNTAX ),HKEY_LOCAL_MACHINE, "SOFTWARE\\PCPRO\\WINGREP\\WINSYNTAX" ); } void LoadParameters( HWND hwndDlg ) { LoadComboFromRegistry( GetDlgItem( hwndDlg, IDC_COMBONAME ), HKEY_LOCAL_MACHINE, "SOFTWARE\\PCPRO\\WINGREP\\NAME", 10); LoadComboFromRegistry( GetDlgItem( hwndDlg, IDC_COMBOMUSTER ), HKEY_LOCAL_MACHINE, "SOFTWARE\\PCPRO\\WINGREP\\MUSTER", 10); LoadComboFromRegistry( GetDlgItem( hwndDlg, IDC_COMBOSUCHENIN ), HKEY_LOCAL_MACHINE, "SOFTWARE\\PCPRO\\WINGREP\\SUCHENIN", 10); LoadEditFromRegistry( GetDlgItem( hwndDlg, IDC_EDITBIS ), HKEY_LOCAL_MACHINE, "SOFTWARE\\PCPRO\\WINGREP\\BIS"); LoadEditFromRegistry( GetDlgItem( hwndDlg, IDC_EDITVON ), HKEY_LOCAL_MACHINE, "SOFTWARE\\PCPRO\\WINGREP\\VON"); LoadEditFromRegistry( GetDlgItem( hwndDlg, IDC_EDITLETZTEMONATE ), HKEY_LOCAL_MACHINE, "SOFTWARE\\PCPRO\\WINGREP\\LETZTETAGE"); LoadEditFromRegistry( GetDlgItem( hwndDlg, IDC_EDITLETZTETAGE ), HKEY_LOCAL_MACHINE, "SOFTWARE\\PCPRO\\WINGREP\\LETZTEMONATE"); LoadEditFromRegistry( GetDlgItem( hwndDlg, IDC_EDITGROESSE ), HKEY_LOCAL_MACHINE, "SOFTWARE\\PCPRO\\WINGREP\\GROESSE"); LoadCheckboxFromRegistry( GetDlgItem( hwndDlg, IDC_RECURSEDIR ),HKEY_LOCAL_MACHINE, "SOFTWARE\\PCPRO\\WINGREP\\RECURSEDIR" ); LoadCheckboxFromRegistry( GetDlgItem( hwndDlg, IDC_GROSSKLEIN ),HKEY_LOCAL_MACHINE, "SOFTWARE\\PCPRO\\WINGREP\\GROSSKLEIN" ); LoadCheckboxFromRegistry( GetDlgItem( hwndDlg, IDC_UNICODE ),HKEY_LOCAL_MACHINE, "SOFTWARE\\PCPRO\\WINGREP\\UNICODE" ); LoadCheckboxFromRegistry( GetDlgItem( hwndDlg, IDC_WINDOWSSYNTAX ),HKEY_LOCAL_MACHINE, "SOFTWARE\\PCPRO\\WINGREP\\WINSYNTAX" ); } int GetTypeString( HWND hFileTypesCombo, LISTENTRY *le, LPSTR lpText ) { lpText[0]=0; if( le->iType >= 0 ) return SendMessage( hFileTypesCombo, CB_GETLBTEXT, le->iType, (LPARAM)lpText ); else { int i,j; i = lstrlen( le->szPath )-1; j=0; while( i > 0 ) { if( le->szPath[i]=='.' ) { lstrcpy( lpText, &le->szPath[i+1] ); CharUpperBuff( lpText, j ); lstrcat( lpText, " Datei"); return j + 6; } i--; j++; } } return 0; } void _SortArray( long l, long r, int iKey, int iDir, HWND hFileTypesCombo ) { long i,j; LISTENTRY x,w; static long lTypeString1, lTypeString2; static char szTypeString1[ MAX_PATH * 2 ]; static char szTypeString2[ MAX_PATH * 2 ]; i = l; j = r; x = List[(l+r)/2]; if( iKey == 3 ) // Bei Sortierung nach Typ besteht das Sorierkriterium aus { // dem Dateityp gefolgt vom Dateinamen lTypeString1 = GetTypeString( hFileTypesCombo, &x, szTypeString1 ); lstrcat( szTypeString1, x.szPath ); lTypeString1 += x.lPath; } do { switch( iKey ) { case 0: // Dateiname { if( iDir == SORT_UP ) { while( CompareString( LOCALE_USER_DEFAULT, NORM_IGNORECASE|SORT_STRINGSORT, &List[i].szPath[List[i].lFileNameStart], List[i].lPath-List[i].lFileNameStart, &x.szPath[x.lFileNameStart], x.lPath-x.lFileNameStart ) == 1 ) i++; while( CompareString( LOCALE_USER_DEFAULT, NORM_IGNORECASE|SORT_STRINGSORT, &List[j].szPath[List[j].lFileNameStart], List[j].lPath-List[j].lFileNameStart, &x.szPath[x.lFileNameStart], x.lPath-x.lFileNameStart ) == 3 ) j--; } else { while( CompareString( LOCALE_USER_DEFAULT, NORM_IGNORECASE|SORT_STRINGSORT, &List[i].szPath[List[i].lFileNameStart], List[i].lPath-List[i].lFileNameStart, &x.szPath[x.lFileNameStart], x.lPath-x.lFileNameStart ) == 3 ) i++; while( CompareString( LOCALE_USER_DEFAULT, NORM_IGNORECASE|SORT_STRINGSORT, &List[j].szPath[List[j].lFileNameStart], List[j].lPath-List[j].lFileNameStart, &x.szPath[x.lFileNameStart], x.lPath-x.lFileNameStart ) == 1 ) j--; } } break; case 1: // Pfad { if( iDir == SORT_UP ) { while( CompareString( LOCALE_USER_DEFAULT, NORM_IGNORECASE|SORT_STRINGSORT, List[i].szPath, List[i].lPath, x.szPath, x.lPath ) == 1 ) i++; while( CompareString( LOCALE_USER_DEFAULT, NORM_IGNORECASE|SORT_STRINGSORT, List[j].szPath, List[j].lPath, x.szPath, x.lPath ) == 3 ) j--; } else { while( CompareString( LOCALE_USER_DEFAULT, NORM_IGNORECASE|SORT_STRINGSORT, List[i].szPath, List[i].lPath, x.szPath, x.lPath ) == 3 ) i++; while( CompareString( LOCALE_USER_DEFAULT, NORM_IGNORECASE|SORT_STRINGSORT, List[j].szPath, List[j].lPath, x.szPath, x.lPath ) == 1 ) j--; } } break; case 2: // Groesse { if( iDir == SORT_UP ) { while( List[i].lSize < x.lSize ) i++; while( List[j].lSize > x.lSize ) j--; } else { while( List[i].lSize > x.lSize ) i++; while( List[j].lSize < x.lSize ) j--; } } break; case 3: // Type { if( iDir == SORT_UP ) { while( TRUE ) { lTypeString2 = GetTypeString( hFileTypesCombo, &List[i], szTypeString2 ); lstrcat( szTypeString2, List[i].szPath ); lTypeString2 += List[i].lPath; if( CompareString( LOCALE_USER_DEFAULT, NORM_IGNORECASE|SORT_STRINGSORT, szTypeString1, lTypeString1, szTypeString2, lTypeString2 ) == 1 ) i++; else break; } while( TRUE ) { lTypeString2 = GetTypeString( hFileTypesCombo, &List[j], szTypeString2 ); lstrcat( szTypeString2, List[j].szPath ); lTypeString2 += List[j].lPath; if( CompareString( LOCALE_USER_DEFAULT, NORM_IGNORECASE|SORT_STRINGSORT, szTypeString1, lTypeString1, szTypeString2, lTypeString2 ) == 3 ) j--; else break; } } else { while( TRUE ) { lTypeString2 = GetTypeString( hFileTypesCombo, &List[i], szTypeString2 ); lstrcat( szTypeString2, List[i].szPath ); lTypeString2 += List[i].lPath; if( CompareString( LOCALE_USER_DEFAULT, NORM_IGNORECASE|SORT_STRINGSORT, szTypeString1, lTypeString1, szTypeString2, lTypeString2 ) == 3 ) i++; else break; } while( TRUE ) { lTypeString2 = GetTypeString( hFileTypesCombo, &List[j], szTypeString2 ); lstrcat( szTypeString2, List[j].szPath ); lTypeString2 += List[j].lPath; if( CompareString( LOCALE_USER_DEFAULT, NORM_IGNORECASE|SORT_STRINGSORT, szTypeString1, lTypeString1, szTypeString2, lTypeString2 ) == 1 ) j--; else break; } } } break; case 4: { if( iDir == SORT_UP ) { while( CompareFileTime(&List[i].Time, &x.Time ) < 0 ) i++; while( CompareFileTime(&List[j].Time, &x.Time ) > 0 ) j--; } else { while( CompareFileTime(&List[i].Time, &x.Time ) > 0 ) i++; while( CompareFileTime(&List[j].Time, &x.Time ) < 0 ) j--; } } break; } if( i <= j ) { w = List[i]; List[i]=List[j]; List[j]=w; i++; j--; } } while( i <= j ); if( l < j ) _SortArray( l,j,iKey,iDir,hFileTypesCombo ); if( i < r ) _SortArray( i,r,iKey,iDir,hFileTypesCombo ); } void SortArray( long l, long r, int iKey, int iDir, HWND hFileTypesCombo ) { WaitForSingleObject( hArrayMutex, INFINITE ); _SortArray( l, r, iKey, iDir, hFileTypesCombo ); ReleaseMutex( hArrayMutex ); } #define ID_FIRSTCONTEXTMENU 9899 #define ID_LASTCONTEXTMENU 9999 // Registry 10 Muster // Registry 10 Directories HINSTANCE g_Hinstance; LPSHELLFOLDER g_DesktopShellFolder; LPMALLOC g_SHMalloc; int g_iResultHeight; // H÷he der Result-Listbox HANDLE g_hStopSempahore; // Mutex zum Beenden des Thread HWND g_hStatusBar; HIMAGELIST g_hImageListIcon; HIMAGELIST g_hImageListSmallIcon; #define FREEANDEXIT { \ if( lpAct ) delete lpAct; \ if( lpFirst ) delete lpFirst; \ return NULL; \ } // Das folgende Makro erzeugt eine Instanz der in type angegebenen // Klasse. SchlΣgt das fehl, wird der saugbere ausstirg vorbereitet #define CREATENODETYPE(type) { \ lpAct = new type;\ if( !lpAct ) \ FREEANDEXIT \ } void GetFirstAndLastFileTypeEntry( HWND hWnd, long lType, long *lStart, long *lEnd ) { char szMask[10]; char szFind[256]; int i; *lStart = 0; *lEnd = -1; wsprintf( szMask, "%06ld", lType ); i = SendMessage( hWnd, LB_FINDSTRING, -1, (LPARAM)szMask ); if( i != CB_ERR ) { while( (i-1) >= 0 ) { SendMessage( hWnd, LB_GETTEXT, i-1, (LPARAM)szFind ); if( ( szFind[5] != szMask[5] ) || ( szFind[4] != szMask[4] ) || ( szFind[3] != szMask[3] ) || ( szFind[2] != szMask[2] ) || ( szFind[1] != szMask[1] ) || ( szFind[0] != szMask[0] ) ) break; i--; } *lStart = i; while( i < SendMessage( hWnd, LB_GETCOUNT, 0, 0 ) ) { SendMessage( hWnd, LB_GETTEXT, i, (LPARAM)szFind ); if( ( szFind[5] != szMask[5] ) || ( szFind[4] != szMask[4] ) || ( szFind[3] != szMask[3] ) || ( szFind[2] != szMask[2] ) || ( szFind[1] != szMask[1] ) || ( szFind[0] != szMask[0] ) ) break; i++; } *lEnd = i; } } void AddFileTypesToCombo( HWND hWndCombo, HWND hWndList, HWND hWndExtensions ) { DWORD dwIndex; long lSize; char szExtension[MAX_PATH+1]; char szClass[MAX_PATH+1]; char szDisplayName[MAX_PATH+1]; // Zuerst alle Anwendungstypen einfⁿgen dwIndex = 0; while( RegEnumKey( HKEY_CLASSES_ROOT, dwIndex++,szExtension, MAX_PATH+1 ) == ERROR_SUCCESS ) { if( szExtension[0]=='.' ) { lSize = sizeof( szClass ); if( RegQueryValue(HKEY_CLASSES_ROOT, szExtension, szClass, &lSize ) == ERROR_SUCCESS ) { lSize = sizeof( szDisplayName ); if( RegQueryValue(HKEY_CLASSES_ROOT, szClass, szDisplayName, &lSize ) == ERROR_SUCCESS ) { if( szDisplayName[0] ) if( SendMessage( hWndCombo, CB_FINDSTRINGEXACT, -1, (LPARAM) szDisplayName ) == CB_ERR ) SendMessage( hWndCombo, CB_ADDSTRING, 0, (LPARAM) szDisplayName ); } } } } SendMessage( hWndCombo, CB_INSERTSTRING, 0, (LPARAM) "Alle Dateien und Ordner"); SendMessage( hWndCombo, CB_SETCURSEL, 0, 0L); dwIndex = 0; // Listbox mit Dateiendungen erzeugen while( RegEnumKey( HKEY_CLASSES_ROOT, dwIndex++,szExtension, MAX_PATH+1 ) == ERROR_SUCCESS ) { if( szExtension[0]=='.' ) { lSize = sizeof( szClass ); if( RegQueryValue(HKEY_CLASSES_ROOT, szExtension, szClass, &lSize ) == ERROR_SUCCESS ) { lSize = sizeof( szDisplayName ); if( RegQueryValue(HKEY_CLASSES_ROOT, szClass, szDisplayName, &lSize ) == ERROR_SUCCESS ) { if( szDisplayName[0] ) { int i; i = SendMessage( hWndCombo, CB_FINDSTRINGEXACT, -1, (LPARAM) szDisplayName ); if( i != CB_ERR ) { int k; wsprintf( szDisplayName, "%06ld %s", i, szExtension ); SendMessage( hWndList, LB_ADDSTRING, 0, (LPARAM) szDisplayName ); CharUpperBuff(szExtension, lstrlen(szExtension)); k = SendMessage( hWndExtensions, LB_ADDSTRING, 0, (LPARAM) szExtension ); if( k != LB_ERR ) SendMessage( hWndExtensions, LB_SETITEMDATA, k, i); } } } } } } } void ShellFree( LPVOID lpMem ) { g_SHMalloc->Free( lpMem ); } LPITEMIDLIST GetNextItem (LPITEMIDLIST pidl) { USHORT nLen; if ((nLen = pidl->mkid.cb) == 0) return NULL; return (LPITEMIDLIST) (((LPBYTE) pidl) + nLen); } UINT GetItemCount (LPITEMIDLIST pidl) { USHORT nLen; UINT nCount; nCount = 0; while ((nLen = pidl->mkid.cb) != 0) { pidl = GetNextItem (pidl); nCount++; } return nCount; } LPITEMIDLIST DuplicateItem(LPITEMIDLIST pidl) { USHORT nLen; LPITEMIDLIST pidlNew; nLen = pidl->mkid.cb; if (nLen == 0) return NULL; pidlNew = (LPITEMIDLIST) g_SHMalloc->Alloc (nLen + sizeof (USHORT)); if (pidlNew == NULL) return NULL; CopyMemory (pidlNew, pidl, nLen); *((USHORT*) (((LPBYTE) pidlNew) + nLen)) = 0; return pidlNew; } void CopyStrRet(LPITEMIDLIST pidl, LPSTRRET lpStr, LPSTR lpPath) { switch (lpStr->uType) { case STRRET_WSTR: { int cch; cch = WideCharToMultiByte( CP_ACP, 0, lpStr->pOleStr, -1, NULL, 0, NULL, NULL); WideCharToMultiByte( CP_ACP, 0, lpStr->pOleStr, -1, lpPath, cch, NULL, NULL); } break; case STRRET_OFFSET: { int i; LPSTR lpSrc = ((char *) pidl) + lpStr->uOffset; i = 0; while( lpSrc[i] ) lpPath[i]=lpSrc[i++]; lpPath[i]=0; } break; case STRRET_CSTR: { int i; LPSTR lpSrc = lpStr->cStr; i = 0; while( lpSrc[i] ) lpPath[i]=lpSrc[i++]; lpPath[i]=0; } } } int GetDisplayNameOfPidl( LPITEMIDLIST pidl, LPSTR lpResult ) { LPITEMIDLIST p; LPSHELLFOLDER pFolder; pFolder = g_DesktopShellFolder; pFolder->AddRef(); lpResult[0]=0; for (p = pidl; pidl != NULL; p = GetNextItem(p)) { STRRET sName; LPSHELLFOLDER pSubFolder; LPITEMIDLIST pidlCopy; if ((pidlCopy = DuplicateItem(pidl)) == NULL) break; if (SUCCEEDED(pFolder->GetDisplayNameOf( pidlCopy, SHGDN_INFOLDER, &sName))) CopyStrRet(pidlCopy, &sName, &lpResult[lstrlen(lpResult)]); if (!SUCCEEDED(pFolder->BindToObject( pidlCopy, NULL, IID_IShellFolder, (LPVOID*)&pSubFolder))) { //ShellFree( pidlCopy); //break; } else { pFolder->Release(); pFolder = pSubFolder; } ShellFree( pidlCopy); } pFolder->Release(); return lstrlen( lpResult ); } BOOL DoExplorerMenu (HWND hwnd, LPCTSTR pszPath, long lFilePos, POINT point) { LPSHELLFOLDER psfFolder, psfNextFolder; LPITEMIDLIST pidlMain, pidlItem, pidlNextItem, *ppidl; LPCONTEXTMENU pContextMenu; CMINVOKECOMMANDINFO ici; ULONG ulCount, ulAttr; TCHAR tchPath[MAX_PATH]; WCHAR wchPath[MAX_PATH]; UINT nCount, nCmd; BOOL bResult; HMENU hMenu; GetFullPathName(pszPath,sizeof(tchPath)/sizeof(TCHAR),tchPath,NULL); if (IsTextUnicode (tchPath, lstrlen (tchPath), NULL)) lstrcpy ((char *) wchPath, tchPath); else MultiByteToWideChar (CP_ACP, 0, pszPath, -1, wchPath, sizeof (wchPath) / sizeof (WCHAR)); bResult = FALSE; psfFolder = g_DesktopShellFolder; psfFolder->AddRef(); if (SUCCEEDED (psfFolder->ParseDisplayName (hwnd, NULL, wchPath, &ulCount, &pidlMain, &ulAttr)) && (pidlMain != NULL)) { if (nCount = GetItemCount (pidlMain)) { pidlItem = pidlMain; while (--nCount) { pidlNextItem = DuplicateItem (pidlItem); if (pidlNextItem == NULL) { ShellFree(pidlMain); psfFolder->Release(); return bResult; } if(FAILED(psfFolder->BindToObject(pidlNextItem, NULL, IID_IShellFolder, (LPVOID*)&psfNextFolder))) { ShellFree( pidlNextItem); ShellFree( pidlMain); psfFolder->Release(); return bResult; } psfFolder->Release (); psfFolder = psfNextFolder; ShellFree( pidlNextItem); pidlItem = GetNextItem (pidlItem); } ppidl = &pidlItem; if (SUCCEEDED (psfFolder->GetUIObjectOf(hwnd, 1, (LPCITEMIDLIST*)ppidl, IID_IContextMenu, NULL, (LPVOID*)&pContextMenu))) { hMenu = CreatePopupMenu (); if (SUCCEEDED (pContextMenu->QueryContextMenu (hMenu, 0, 1, 0x7FF0, CMF_NORMAL|CMF_VERBSONLY))) { int iIndex; iIndex = GetMenuItemCount( hMenu ); ::InsertMenu(hMenu, iIndex++, MF_STRING | MF_BYPOSITION|MF_SEPARATOR, 0x7FF1, ""); ::InsertMenu(hMenu, iIndex++, MF_STRING | MF_BYPOSITION, 0x7FF2, "&Betrachten"); nCmd = TrackPopupMenu (hMenu, TPM_LEFTALIGN | TPM_LEFTBUTTON | TPM_RIGHTBUTTON | TPM_RETURNCMD, point.x, point.y, 0, hwnd, NULL); if (nCmd == 0x7ff2 ) { HWND hwndViewer; if( CreateViewer( g_Hinstance, &hwndViewer, pszPath, lFilePos ) ) ShowWindow( hwndViewer, SW_SHOW ); } else if( nCmd ) { ici.cbSize = sizeof (CMINVOKECOMMANDINFO); ici.fMask = 0; ici.hwnd = hwnd; ici.lpVerb = MAKEINTRESOURCE (nCmd - 1); ici.lpParameters = NULL; ici.lpDirectory = NULL; ici.nShow = SW_SHOWNORMAL; ici.dwHotKey = 0; ici.hIcon = NULL; if (SUCCEEDED ( pContextMenu->InvokeCommand(&ici))) bResult = TRUE; } } DestroyMenu (hMenu); pContextMenu->Release (); } ShellFree(pidlMain); } } psfFolder->Release (); return bResult; } // xx wan anhalten erlaubt ist. signal!!! int iMonth[12]={31,28,31,30,31,30,31,31,30,31,30,31}; BOOL ValidDay( int day, int month, int year ) { if( year < 51 ) // 50 == 2050, 51 == 1951 year += 2000; else if( year < 100 ) year += 1900; if( year >= 2100 ) return FALSE; iMonth[1]=28; // Moinatsarray auf Korrekten Februar setzen if( !( year % 4 ) ) // Teilbar durch 4 { if( ( year % 100 ) == 0 ) // Alle Hundertjahre fΣllt das Schaltjahr aus { if( (year % 400 ) == 0 ) // Alle vierhunderter allerdings dann doch wieder iMonth[1]=29; // Tausender sind doich Schaltjahre } else iMonth[1]=29; } month--; day--; if( ( month >= 0 ) && ( month < 11 ) ) if( ( day >= 0 ) && ( day < iMonth[month] ) ) if( ( year >= -4173 ) && ( year <= 2100 ) ) return TRUE; return FALSE; } BOOL CalDayToJulianDay( long *l, int day, int month, int year ) { double month1, year1; double a, b, c ,d; if( !ValidDay( day, month, year ) ) return FALSE; month1 = (double)month; year1 = (double)year; if( year1 < 0 ) year1++; if( month < 3 ) { month1 = month + 12.0f; year1--; } a = floor( year1 / 100.0 ); // division schneidet nachkomma ab b = 2 - a + floor( a / 4.0 ); if( year < 1582 ) // Kleiner als Reformdatum b = 0; if( ( year == 1582 ) && ( month < 10 ) ) // diese tage gibt es nicht! b = 0; if( ( year == 1582 ) && ( month == 10 ) && ( day < 15 ) ) // diese tage gibt es nicht! b = 0; if( year1 < 0 ) c = ceil((365.25 * year1) - 0.75) - 694025.0; else c = floor(365.25 * year1) - 694025.0; d = floor( 30.6001 * ( month1 + 1 ) ); // 1.1.4713 v.Chr. == 0 // 1.1.1900 v.Chr. == 2415021 *l = (long)(b + c + d + day) + 2415020L; return TRUE; } BOOL JulianDayToCalDay( long julday, SYSTEMTIME *s ) { double a, b, c, d, f, g, i, mn, dy, yr; julday -= 2415020L; d = julday + 0.5; i = floor( d ); f = d - i; if( f == 1.0 ) { f = 0; i += 1.0; } if( i > -115860L) { a = floor((i/36524.25)+0.99835726) + 14.0; i = i+1.0+a-floor(a/4.0); } b = floor((i/365.25)+0.802601); c = i - floor((365.25*b)+0.750001)+416.0; g = floor(c/30.6001); dy = c - floor(30.6001*g)+f; if( g >13.5) mn = g - 13.0; else mn = g - 1.0; if( mn < 2.5 ) yr = b + 1900.0; else yr = b + 1899.0; if( yr < 1 ) yr = yr - 1.0; memset( s, 0, sizeof( SYSTEMTIME ) ); s->wDay = (short)dy; s->wMonth = (short)mn; s->wYear = (short)yr; return TRUE; } class CHARACTERPOOL { public: BOOL bUpperCase; HANDLE hFile; unsigned char cReadPuffer[2 * 4096]; long lBufStartPos; long lReadPos; long lFileSize; // Datei lΣnge long lFileStack[1000]; // aktuelle Leseposition speichern int iStackPtr; CHARACTERPOOL() { hFile = INVALID_HANDLE_VALUE; lBufStartPos = 0L; lReadPos = 0L; lFileSize = 0L; iStackPtr = 0; bUpperCase = FALSE; } bool getchar(unsigned char *c ) { // Der Puffer darf verΣndert werden, wenn sich WinGrep nicht // in einer Rekursion befindet if( !iStackPtr ) // Neuen Teil des Puffers einlesen { if( ( ( lReadPos + sizeof(cReadPuffer)/2 ) >= lBufStartPos + sizeof(cReadPuffer) ) && ( lBufStartPos + sizeof(cReadPuffer) < lFileSize ) ) { DWORD dwRead; memcpy( &cReadPuffer[0], &cReadPuffer[sizeof(cReadPuffer)/2], sizeof(cReadPuffer)/2 ); lBufStartPos += sizeof(cReadPuffer)/2; ReadFile( hFile, &cReadPuffer[sizeof(cReadPuffer)/2], sizeof(cReadPuffer)/2, &dwRead, NULL ); if( bUpperCase ) CharUpperBuff( (char*)&cReadPuffer[sizeof(cReadPuffer)/2], sizeof(cReadPuffer)/2 ); } } if( lReadPos < lFileSize ) { *c = cReadPuffer[ lReadPos - lBufStartPos ]; lReadPos++; return true; } return false; } bool push() { if( iStackPtr < ( sizeof( lFileStack ) / sizeof( long ) ) ) { lFileStack[iStackPtr] = lReadPos; iStackPtr++; return true; } return false; } bool restore() { if( iStackPtr ) { --iStackPtr; lReadPos = lFileStack[iStackPtr]; return true; } return false; } bool pop() { if( iStackPtr ) { --iStackPtr; return true; } return false; } bool open( LPSTR lpFileName, BOOL bUpperCaseStream ) { if( hFile != INVALID_HANDLE_VALUE ) return FALSE; bUpperCase = bUpperCaseStream; lBufStartPos = 0L; lReadPos = 0L; lFileSize = 0L; iStackPtr = 0; hFile = CreateFile( lpFileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0L, NULL ); if( hFile != INVALID_HANDLE_VALUE ) { DWORD dwRead; lFileSize = GetFileSize( hFile, NULL ); dwRead = lFileSize < sizeof(cReadPuffer) ? lFileSize : sizeof(cReadPuffer); ReadFile( hFile, cReadPuffer, dwRead, &dwRead, NULL ); if( bUpperCase ) CharUpperBuff( (char*)cReadPuffer, dwRead ); } return hFile != INVALID_HANDLE_VALUE; } void close() { if( hFile != INVALID_HANDLE_VALUE ) { CloseHandle(hFile); hFile = INVALID_HANDLE_VALUE; } } }; class GREPNODE { public: GREPNODE *lpNext; int iMinMatch, // diese Node mu▀ mindestens iMinMatch-mal gefunden werden, iMaxMatch; // aber darf nur maximal iMaxMatch-mal vorkommen virtual bool matchchar(CHARACTERPOOL *cp) // das ⁿbergebene Zeichen pa▀t { return false; } GREPNODE() { lpNext = NULL; iMinMatch = 1; // Genau einmal iMaxMatch = 1; } ~GREPNODE() { if( lpNext ) delete lpNext; lpNext = NULL; } bool match( CHARACTERPOOL *cp ) { int i; // Diese Treffer mⁿssen sein if( !cp->push() ) return false; for( i = 0; i < iMinMatch; i++ ) if( !matchchar( cp ) ) { if( !cp->restore() ) return false; return false; } // Diese Treffer dⁿrfen sein while( ( i < iMaxMatch ) || ( iMaxMatch == -1 ) ) { if( lpNext ) { if( !cp->push() ) return false; if( lpNext->match( cp ) ) { if( !cp->pop() ) return false; return true; } if( !cp->restore() ) return false; } if( !matchchar( cp ) ) { if( !cp->restore() ) return false; return false; } i++; } if( !cp->pop() ) return false; if( lpNext ) return lpNext->match( cp ); return true; } }; class CHARNODE:public GREPNODE { public: unsigned char cCharacter; virtual bool matchchar(CHARACTERPOOL *cp) // das ⁿbergebene Zeichen pa▀t { unsigned char c; if( !cp->getchar( &c ) ) return false; return c == cCharacter; } }; // End Of Line class EOLNODE:public GREPNODE { public: }; // Start Of Line class SOLNODE:public GREPNODE { public: }; // "Unternoide" fⁿr Sub-Expressions (Klammerausdrⁿcke) class SUBNODE:public GREPNODE { public: GREPNODE *lpSubNode; SUBNODE() { lpSubNode = NULL; } ~SUBNODE() { if( lpSubNode ) delete lpSubNode; } virtual bool matchchar(CHARACTERPOOL *cp) // das ⁿbergebene Zeichen pa▀t { return lpSubNode->match( cp ); } }; // Zeichenklasse. Jedes Zeichen der Klasse wird durch ein Bit // innerhalb eines Bit-Arrays reprΣsentiert unsigned char BitMask[8]={1,2,4,8,16,32,64,128}; class CLASSNODE:public GREPNODE { public: char Bits[256/8]; CLASSNODE() { memset( Bits,0,sizeof(Bits)); } void SetBit( char c ) // Bit fⁿr das angegebenebe Zeichen setzen { Bits[c/8] |= BitMask[c & 7]; } void InvertAllBits( ) { for( int i = 0; i < 256/8;i++) Bits[i] ^= 0xFF; } bool IsSet( char c ) { return (Bits[c/8] & BitMask[(c & 7)]) ? true : false; } virtual bool matchchar(CHARACTERPOOL *cp) // das ⁿbergebene Zeichen pa▀t { unsigned char c; if( !cp->getchar( &c ) ) return FALSE; return IsSet( c ); } }; // Irgendein Zeichen class ANYNODE:public CLASSNODE { public: ANYNODE():CLASSNODE() { SetBit( '\n' ); // Alles au▀er CR und LF SetBit( '\r' ); InvertAllBits(); } }; // Diese Parameter werden an den Worker-Thread ⁿbergeben: class THREADPARAMETERS { public: HWND hwndDlg; // Handle des Dialogfensters HANDLE hThread; // Handle des Such-Threads DWORD dwThreadID; // ID des Suchthreads GREPNODE *Pattern; // zu suchendes Muster char szName[MAX_PATH]; // zu suchender Dateiname char szDirectory[MAX_PATH]; // Startpfad bool bRecurseDirectories; // Unterverzeichnisse durchsuchen? HWND hStatusBar; // Handle des Statusfensters HWND hResults; // Handle der Ergebnisliste bool bUpperCase; // Gro▀/Kleinschreibung durch verwendung von Grossbuchstaben ignorieren bool bUnicode; // Unicode-Zeichen bool bWindowsSemantic; // Muster-Suche mit * und ? CHARACTERPOOL cp; // Struktur zum Einlesen der Zeichen aus den zu durchsuchenden Datei BOOL bDate; // Nur Dateien innerhalb eines Zeitraums berⁿcksichtigen FILETIME dateVon, // Start und Enddatum dateBis; BOOL bSize; // Nur Dateien einer bestimmten Gr÷▀e berⁿcksichtigen int bSameSize; // 0 = gleich, -1, minimal, 1 = maximal DWORD lKByte; // Gr÷▀e long lFileTypeStart, // Nur Dateien eines Bestimmten, registrierten Dateityps berⁿcksichtigen lFileTypeEnd; HWND hFileTypes; HWND hFileExtensions; HWND hFileTypesCombo; }; // Fenster mit registrierten Dateitypen // globale Parameter - nur ein Suchthread pro Anwendung THREADPARAMETERS g_ThreadParameters; // Holt den nΣchsten Buchstaben aus dem Muster-String // Escape-Sequenzen und Hex-Digits werden automatisch aufgel÷st bool GetPatternCharacter( unsigned char *c, LPSTR lpPattern, int *iPos, bool bInCharacterClass, bool bWindowsSemantic ) { switch( lpPattern[*iPos] ) { case '\\': (*iPos)++; switch( lpPattern[*iPos] ) { case 'n': *c = '\n'; (*iPos)++; return true; case 'r': *c = '\r'; (*iPos)++; return true; case 't': *c = '\t'; (*iPos)++; return true; case '[': *c = '['; (*iPos)++; return true; case ']': *c = ']'; (*iPos)++; return true; case '(': *c = '('; (*iPos)++; return true; case ')': *c = ')'; (*iPos)++; return true; case '{': *c = '{'; (*iPos)++; return true; case '}': *c = '}'; (*iPos)++; return true; case '.': *c = '.'; (*iPos)++; return true; case '\\': *c = '\\'; (*iPos)++; return true; case '$': *c = '$'; (*iPos)++; return true; case '^': *c = '^'; (*iPos)++; return true; case '*': *c = '*'; (*iPos)++; return true; case '+': *c = '+'; (*iPos)++; return true; case '?': *c = '?'; (*iPos)++; return true; case '-': if( bInCharacterClass ) { // die Escapesequenz \- ist nur innerhalb einer characterklasse erlaubt *c = '-'; (*iPos)++; return true; } return false; // dreistelle Oktalzahl case '0':case '1':case '2':case '3':case '4': case '5':case '6':case '7':case '8':case '9': { int iVal; iVal = lpPattern[*iPos] - '0'; (*iPos)++; if( !isdigit(lpPattern[*iPos]) ) { // bisherigen wert ⁿbernehmen *c = (unsigned char) iVal; return true; } iVal *= 8; iVal += lpPattern[*iPos] - '0'; (*iPos)++; if( !isdigit(lpPattern[*iPos]) ) { // bisherigen wert ⁿbernehmen *c = (unsigned char) iVal; return true; } iVal *= 8; iVal += lpPattern[*iPos] - '0'; (*iPos)++; *c = (unsigned char) iVal; return true; } // zweistellige Hex-Ziffer case 'x': case 'X': { int iVal,nVal; if( isdigit(lpPattern[*iPos]) ) iVal = lpPattern[*iPos]-'0'; else if( (lpPattern[*iPos]>='a') && (lpPattern[*iPos]<='f') ) iVal = 10 + lpPattern[*iPos]-'a'; else if( (lpPattern[*iPos]>='A') && (lpPattern[*iPos]<='F') ) iVal = 10 + lpPattern[*iPos]-'A'; else return false; (*iPos)++; if( isdigit(lpPattern[*iPos]) ) nVal = lpPattern[*iPos]-'0'; else if( (lpPattern[*iPos]>='a') && (lpPattern[*iPos]<='f') ) nVal = 10 + lpPattern[*iPos]-'a'; else if( (lpPattern[*iPos]>='A') && (lpPattern[*iPos]<='F') ) nVal = 10 + lpPattern[*iPos]-'A'; else { // bisherigen wert ⁿbernehmen *c = (unsigned char) iVal; return true; } iVal += nVal; (*iPos)++; *c = (unsigned char) iVal; return true; } default: *c = lpPattern[*iPos]; (*iPos)++; return true; } break; // die folgenden Zeichen dⁿrfen nicht "unescaped" auftauchen case '[': case ']': case '(': case ')': case '{': case '}': case '$': case '^': case '.': case '\0': case '*': case '?': case '+': return bWindowsSemantic; case '-': // ausserhalb einer zeichenklasse erlaubt! if( bInCharacterClass ) return bWindowsSemantic; default: *c = lpPattern[*iPos]; (*iPos)++; return true; } } GREPNODE *MakePattern( LPSTR lpPattern, int *iPos, int iLevel, bool bWindowsSemantic, bool bUnicode ) { GREPNODE *lpFirst, *lpLast, *lpAct; bool bCloseureAllowed; // an LastNode darf eine Closeure gehangen werden! bool bAppendAny; lpFirst = NULL; lpLast = NULL; bCloseureAllowed = FALSE; while( lpPattern[*iPos] ) { lpAct = NULL; bAppendAny = false; // eine Anynode fⁿr UNicode-Erkennung einfⁿgen? if( bWindowsSemantic ) // Nur * und ? als Wildcard zulassen { switch( lpPattern[*iPos] ) { // Any - jedes Zeichen gilt case '?': CREATENODETYPE(ANYNODE); // Characterklasse mit leeren zeichen (*iPos)++; bCloseureAllowed = true; bAppendAny = bUnicode; break; case '*': CREATENODETYPE(ANYNODE); // Characterklasse mit leeren zeichen lpAct->iMinMatch = 0; lpAct->iMaxMatch = -1; // Beliebig oft (*iPos)++; bCloseureAllowed = true; bAppendAny = bUnicode; break; default: CREATENODETYPE(CHARNODE); // Characterklasse mit leeren zeichen if( !GetPatternCharacter( &((CHARNODE*)lpAct)->cCharacter, lpPattern, iPos, false, bWindowsSemantic ) ) FREEANDEXIT; bCloseureAllowed = true; bAppendAny = bUnicode; break; } } else { switch( lpPattern[*iPos] ) { // Die geshlossene runde Klammer taucht nur bei einem // Subexpression uaf. Eine RUnde Klammer auf oberster Ebene // ist ein Syntax-Fehler case ')': { if( iLevel ) { (*iPos)++; return lpFirst; } else { FREEANDEXIT; return NULL; } } break; // Sub - Die ge÷ffnete runde Klammer leitet einen Subexpression ein case '(': { CREATENODETYPE(SUBNODE); (*iPos)++; ((SUBNODE*)lpAct)->lpSubNode = MakePattern( lpPattern, iPos, iLevel+1, bWindowsSemantic, bUnicode ); if( !((SUBNODE*)lpAct)->lpSubNode ) FREEANDEXIT; bCloseureAllowed = TRUE; } break; // Class - Die eckigen Klammern stehen fⁿr eine Zeichenklasse case '[': { unsigned char a,b; (*iPos)++; if( lpPattern[*iPos] == ']' ) return NULL; CREATENODETYPE(CLASSNODE); bAppendAny = bUnicode; while( lpPattern[*iPos] != ']' ) { bool bInvert; if( lpPattern[*iPos] == '\0' ) // vorzeitiges Ende des Patternstrings? FREEANDEXIT; bInvert = FALSE; if( lpPattern[*iPos] == '^' ) { bInvert = true; (*iPos)++; } if( !GetPatternCharacter( &a, lpPattern, iPos, true, bWindowsSemantic ) ) FREEANDEXIT; if( lpPattern[*iPos] == '-' ) { (*iPos)++; if( !GetPatternCharacter( &b, lpPattern, iPos, true, bWindowsSemantic ) ) FREEANDEXIT; if( b < a ) { FREEANDEXIT; return false; } while( a <= b ) ((CLASSNODE*)lpAct)->SetBit( a++ ); } else ((CLASSNODE*)lpAct)->SetBit( a ); if( bInvert ) ((CLASSNODE*)lpAct)->InvertAllBits(); } (*iPos)++; bCloseureAllowed = true; } break; // Any - jedes Zeichen gilt case '.': CREATENODETYPE(ANYNODE); // Characterklasse mit leeren zeichen (*iPos)++; bCloseureAllowed = true; bAppendAny = bUnicode; break; default: CREATENODETYPE(CHARNODE); // Characterklasse mit leeren zeichen if( !GetPatternCharacter( &((CHARNODE*)lpAct)->cCharacter, lpPattern, iPos, false, bWindowsSemantic ) ) FREEANDEXIT; bCloseureAllowed = true; bAppendAny = bUnicode; break; // EOL - Ende der Zeile case '$': CREATENODETYPE(EOLNODE); // Characterklasse mit leeren zeichen (*iPos)++; bCloseureAllowed = FALSE; break; // SOL - Start der Zeile case '^': CREATENODETYPE(SOLNODE); // Characterklasse mit leeren zeichen (*iPos)++; bCloseureAllowed = false; break; // Closure - die letzte Node beliebig oft wiederholen case '*': (*iPos)++; if( !bCloseureAllowed ) { FREEANDEXIT; return NULL; } bCloseureAllowed = false; if( !lpLast ) FREEANDEXIT; lpLast->iMinMatch = 0; lpLast->iMaxMatch = -1; // Beliebig oft break; case '+': (*iPos)++; if( !bCloseureAllowed ) { FREEANDEXIT; return NULL; } bCloseureAllowed = false; if( !lpLast ) FREEANDEXIT; lpLast->iMinMatch = 1; lpLast->iMaxMatch = -1; // Beliebig oft break; // Count - Anzahl der Wiederholungen {1,2} {,2} {1} case '{': { int iVal; if( !bCloseureAllowed ) { FREEANDEXIT; return NULL; } bCloseureAllowed = false; if( !lpLast ) FREEANDEXIT; (*iPos)++; iVal = 0; while( isdigit(lpPattern[*iPos] ) ) { iVal*=10; iVal+= lpPattern[*iPos] - '0'; (*iPos)++; } lpLast->iMinMatch = iVal; if( lpPattern[*iPos]==',' ) { (*iPos)++; iVal = 0; while( isdigit(lpPattern[*iPos] ) ) { iVal*=10; iVal+= lpPattern[*iPos] - '0'; (*iPos)++; } lpLast->iMaxMatch = iVal; } else lpLast->iMaxMatch = lpLast->iMinMatch; if( lpPattern[*iPos] == '}' ) (*iPos)++; else FREEANDEXIT; } break; } } if( lpAct ) { if( lpLast ) { lpLast->lpNext = lpAct; lpLast = lpLast->lpNext; } else { lpFirst = lpLast = lpAct; } } // Unicode-Zusatznode einfⁿgen if( bAppendAny ) { CREATENODETYPE(ANYNODE); // Characterklasse mit leeren zeichen if( lpAct ) { if( lpLast ) { lpLast->lpNext = lpAct; lpLast = lpLast->lpNext; } else { lpFirst = lpLast = lpAct; } } } } return lpFirst; } void SetDate( HWND hwndDlg ) { BOOL bAlleDateien; BOOL bControl; bAlleDateien = FALSE; if( !( SendMessage( GetDlgItem( hwndDlg, IDC_DATEIDATUM ), BM_GETCHECK, 0, 0L ) & BST_CHECKED ) ) bAlleDateien = TRUE; EnableWindow( GetDlgItem( hwndDlg, IDC_ALLEDATEIEN ), TRUE ); SendMessage( GetDlgItem( hwndDlg, IDC_ALLEDATEIEN ), BM_SETCHECK, bAlleDateien ? BST_CHECKED : BST_UNCHECKED, 0L ); EnableWindow( GetDlgItem( hwndDlg, IDC_DATEIDATUM ), TRUE ); SendMessage( GetDlgItem( hwndDlg, IDC_DATEIDATUM ), BM_SETCHECK, bAlleDateien ? BST_UNCHECKED : BST_CHECKED, 0L ); if( (!( SendMessage( GetDlgItem( hwndDlg, IDC_ZWISCHEN), BM_GETCHECK, 0, 0L ) & BST_CHECKED )) && (!( SendMessage( GetDlgItem( hwndDlg, IDC_LETZTEMONATE ), BM_GETCHECK, 0, 0L ) & BST_CHECKED )) && (!( SendMessage( GetDlgItem( hwndDlg, IDC_LETZTETAGE ), BM_GETCHECK, 0, 0L ) & BST_CHECKED ))) SendMessage( GetDlgItem( hwndDlg, IDC_ZWISCHEN), BM_SETCHECK, BST_CHECKED, 0L ) ; EnableWindow( GetDlgItem( hwndDlg, IDC_ZWISCHEN ), !bAlleDateien ); bControl = FALSE; if( SendMessage( GetDlgItem( hwndDlg, IDC_ZWISCHEN), BM_GETCHECK, 0, 0L ) & BST_CHECKED ) bControl = !bAlleDateien; EnableWindow( GetDlgItem( hwndDlg, IDC_EDITVON ), bControl ); EnableWindow( GetDlgItem( hwndDlg, IDC_STATICUND ), bControl ); EnableWindow( GetDlgItem( hwndDlg, IDC_EDITBIS ), bControl ); EnableWindow( GetDlgItem( hwndDlg, IDC_LETZTEMONATE ), !bAlleDateien ); bControl = FALSE; if( SendMessage( GetDlgItem( hwndDlg, IDC_LETZTEMONATE ), BM_GETCHECK, 0, 0L ) & BST_CHECKED ) bControl = !bAlleDateien; EnableWindow( GetDlgItem( hwndDlg, IDC_EDITLETZTEMONATE ), bControl ); EnableWindow( GetDlgItem( hwndDlg, IDC_SPINLETZTEMONATE ), bControl ); EnableWindow( GetDlgItem( hwndDlg, IDC_STATICLETZTEMONATE ), bControl ); EnableWindow( GetDlgItem( hwndDlg, IDC_LETZTETAGE ), !bAlleDateien ); bControl = FALSE; if( SendMessage( GetDlgItem( hwndDlg, IDC_LETZTETAGE ), BM_GETCHECK, 0, 0L ) & BST_CHECKED ) bControl = !bAlleDateien; EnableWindow( GetDlgItem( hwndDlg, IDC_EDITLETZTETAGE ), bControl ); EnableWindow( GetDlgItem( hwndDlg, IDC_SPINLETZTETAGE ), bControl ); EnableWindow( GetDlgItem( hwndDlg, IDC_STATICLETZTETAGE ), bControl ); } void StopSuche(THREADPARAMETERS *p, bool bStopThread) { char szText[100]; int i; if( bStopThread ) { if( p->hThread != INVALID_HANDLE_VALUE ) { //g_hStopSempahore = CreateSemaphore( NULL, 0,1, NULL ); // Semaphore erzeugen und signalisieren //if( g_hStopSempahore ) //{ // WaitForSingleObject( g_hStopSempahore, INFINITE ); // Auf freigabe durch Thread warten // CloseHandle( g_hStopSempahore ); // g_hStopSempahore = NULL; //} TerminateThread( p->hThread, 0 ); p->hThread = INVALID_HANDLE_VALUE; } p->cp.close(); // Characterpool aufrΣumen (das dortige hFile ist nicht an den Thread gebunden!) } if( p->Pattern ) { delete p->Pattern; p->Pattern = NULL; } EnableWindow( GetDlgItem( p->hwndDlg, IDC_SUCHESTARTEN ), TRUE ); EnableWindow( GetDlgItem( p->hwndDlg, IDC_SUCHEANHALTEN ), FALSE ); EnableWindow( GetDlgItem( p->hwndDlg, IDC_STATICNAME ), TRUE ); EnableWindow( GetDlgItem( p->hwndDlg, IDC_COMBONAME ), TRUE ); EnableWindow( GetDlgItem( p->hwndDlg, IDC_STATICMUSTER ), TRUE ); EnableWindow( GetDlgItem( p->hwndDlg, IDC_COMBOMUSTER ), TRUE ); EnableWindow( GetDlgItem( p->hwndDlg, IDC_STATICSUCHENIN ), TRUE ); EnableWindow( GetDlgItem( p->hwndDlg, IDC_COMBOSUCHENIN ), TRUE ); EnableWindow( GetDlgItem( p->hwndDlg, IDC_DURCHSUCHEN ), TRUE ); EnableWindow( GetDlgItem( p->hwndDlg, IDC_RECURSEDIR ), TRUE ); EnableWindow( GetDlgItem( p->hwndDlg, IDC_GROSSKLEIN ), TRUE ); EnableWindow( GetDlgItem( p->hwndDlg, IDC_UNICODE ), TRUE ); EnableWindow( GetDlgItem( p->hwndDlg, IDC_WINDOWSSYNTAX ), TRUE ); //EnableWindow( GetDlgItem( p->hwndDlg, IDC_ALLEDATEIEN ), TRUE ); //EnableWindow( GetDlgItem( p->hwndDlg, IDC_DATEIDATUM ), TRUE ); //EnableWindow( GetDlgItem( p->hwndDlg, IDC_ZWISCHEN ), TRUE ); //EnableWindow( GetDlgItem( p->hwndDlg, IDC_EDITVON ), TRUE ); //EnableWindow( GetDlgItem( p->hwndDlg, IDC_STATICUND ), TRUE ); //EnableWindow( GetDlgItem( p->hwndDlg, IDC_EDITBIS ), TRUE ); //EnableWindow( GetDlgItem( p->hwndDlg, IDC_LETZTEMONATE ), TRUE ); //EnableWindow( GetDlgItem( p->hwndDlg, IDC_EDITLETZTEMONATE ), TRUE ); //EnableWindow( GetDlgItem( p->hwndDlg, IDC_SPINLETZTEMONATE ), TRUE ); //EnableWindow( GetDlgItem( p->hwndDlg, IDC_STATICLETZTEMONATE ), TRUE ); //EnableWindow( GetDlgItem( p->hwndDlg, IDC_LETZTETAGE ), TRUE ); //EnableWindow( GetDlgItem( p->hwndDlg, IDC_EDITLETZTETAGE ), TRUE ); //EnableWindow( GetDlgItem( p->hwndDlg, IDC_SPINLETZTETAGE ), TRUE ); //EnableWindow( GetDlgItem( p->hwndDlg, IDC_STATICLETZTETAGE ), TRUE ); SetDate( p->hwndDlg ); EnableWindow( GetDlgItem( p->hwndDlg, IDC_STATICTYP ), TRUE ); EnableWindow( GetDlgItem( p->hwndDlg, IDC_COMBOTYP ), TRUE ); EnableWindow( GetDlgItem( p->hwndDlg, IDC_STATICGROESSE ), TRUE ); EnableWindow( GetDlgItem( p->hwndDlg, IDC_COMBOGROESSE ), TRUE ); EnableWindow( GetDlgItem( p->hwndDlg, IDC_EDITGROESSE ), TRUE ); EnableWindow( GetDlgItem( p->hwndDlg, IDC_SPINGROESSE ), TRUE ); EnableWindow( GetDlgItem( p->hwndDlg, IDC_STATICKB ), TRUE ); i = ListView_GetItemCount(p->hResults ); if( i == 1 ) wsprintf( szText, "1 Vorkommnis gefunden" ); else wsprintf( szText, "%ld Vorkommnisse gefunden", i ); SendMessage( p->hStatusBar, SB_SETTEXT, 255, (LPARAM)szText ); } void AppendDirSep( LPSTR szPath ) { int i; i = lstrlen( szPath ); if( i ) if( szPath[i-1] != '\\' ) { szPath[i]='\\'; szPath[i+1]=0; } } #define ISDELIMITER(c) (((c) ==':')||((c)==',')||((c) == ';')||((c)==0)) bool CompareWildcard( LPSTR szFilename, LPSTR szWildPattern ) { // LOCALE_SYSTEM_DEFAULT = Sprache der Windows-Installation // LOCALE_USER_DEFAULT = aktuelle vom Anwender ausgewΣhlte Sprache (s. Systemeinstellungen) while( !ISDELIMITER( *szWildPattern ) ) { switch( *szWildPattern ) { case '*': szWildPattern++; if( !(*szWildPattern ) ) return true; while( CompareString( LOCALE_USER_DEFAULT, NORM_IGNORECASE|SORT_STRINGSORT, szFilename, 1, szWildPattern, 1 ) != 2 ) // 2 == EQUAL { szFilename++; if(!( *szFilename )) return false; } break; case '?': szWildPattern++; szFilename++; break; default: if( CompareString( LOCALE_USER_DEFAULT, NORM_IGNORECASE|SORT_STRINGSORT, szFilename, 1, szWildPattern, 1 ) == 2 ) // 2 == EQUAL { szFilename++; szWildPattern++; } else return false; } } if( *szFilename ) return false; return true; } void InsertItem( HWND hWnd, HWND hFileTypesCombo, LISTENTRY *le ) { char szText[256]; LVITEM lvi; char c; SYSTEMTIME st; WaitForSingleObject( hArrayMutex, INFINITE ); // Darstelluingsview lvi.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM | LVIF_STATE; lvi.iItem = ListView_GetItemCount(hWnd); // Am Ende lvi.iSubItem = 0; lvi.state = 0; lvi.stateMask = 0; lvi.pszText = &le->szPath[le->lFileNameStart]; lvi.cchTextMax = lstrlen(lvi.pszText); lvi.iImage = le->iIcon; lvi.lParam = 0; lvi.iIndent = 0; lvi.iItem = ListView_InsertItem(hWnd,&lvi); c = le->szPath[le->lFileNameStart]; le->szPath[le->lFileNameStart] = 0; lvi.mask = LVIF_TEXT; lvi.pszText = le->szPath; lvi.cchTextMax = le->lFileNameStart; lvi.iSubItem = 1; ListView_SetItem(hWnd,&lvi); le->szPath[le->lFileNameStart] = c; if( le->lSize < 1024 ) lvi.cchTextMax = wsprintf( szText, "%ld Bytes", le->lSize ); else lvi.cchTextMax = wsprintf( szText, "%ld KB", (le->lSize +1023)/1024); lvi.pszText = szText; lvi.iSubItem = 2; ListView_SetItem(hWnd, &lvi ); lvi.cchTextMax = GetTypeString( hFileTypesCombo, le, szText ); lvi.pszText = szText; lvi.iSubItem = 3; ListView_SetItem(hWnd, &lvi ); FileTimeToSystemTime( &le->Time, &st ); lvi.cchTextMax = wsprintf( szText, "%02d.%02d.%02d %02d:%02d", st.wDay, st.wMonth, st.wYear, st.wHour, st.wMinute ); lvi.pszText = szText; lvi.iSubItem = 4; ListView_SetItem(hWnd, &lvi ); lvi.pszText = le->szFind; lvi.cchTextMax = lstrlen(lvi.pszText); lvi.iSubItem = 5; ListView_SetItem(hWnd, &lvi ); lvi.cchTextMax = wsprintf( szText, "%ld", le->lPos ); lvi.pszText = szText; lvi.iSubItem = 6; ListView_SetItem(hWnd, &lvi ); ReleaseMutex( hArrayMutex ); } bool InsertMatch( THREADPARAMETERS *p, WIN32_FIND_DATA *lpwfd, LPSTR lpPath, LPSTR lpFind, long lFilePos ) { SHFILEINFO sfi; int i; if( iNumEntries == 10000 ) { MessageBox( p->hwndDlg, "Mehr als 10.000 EintrΣge. Bitte SchrΣnken SIe das Suchergebnis ein!", "", MB_ICONSTOP | MB_OK ); return false; } lstrcpy( List[iNumEntries].szPath, lpPath); AppendDirSep( List[iNumEntries].szPath ); List[iNumEntries].lFileNameStart = lstrlen(List[iNumEntries].szPath); lstrcat( List[iNumEntries].szPath, lpwfd->cFileName ); lstrcpy( List[iNumEntries].szFind, lpFind); List[iNumEntries].lPath = List[iNumEntries].lFileNameStart + lstrlen( lpwfd->cFileName ); List[iNumEntries].lSize = lpwfd->nFileSizeLow; i = lstrlen( lpwfd->cFileName ); CharUpperBuff(lpwfd->cFileName, i); i--; List[iNumEntries].iType = -1; while( i > 0 ) { if( lpwfd->cFileName[i] == '.' ) { int iItem; iItem = SendMessage( p->hFileExtensions, LB_FINDSTRING, -1, (LPARAM)&lpwfd->cFileName[i] ); if( iItem != LB_ERR ) List[iNumEntries].iType = SendMessage( p->hFileExtensions, LB_GETITEMDATA, iItem, 0L ); break; } i--; } SHGetFileInfo(List[iNumEntries].szPath,0,&sfi,sizeof(sfi),SHGFI_SYSICONINDEX); List[iNumEntries].iIcon = sfi.iIcon; FileTimeToLocalFileTime( &lpwfd->ftLastWriteTime, &List[iNumEntries].Time ); List[iNumEntries].lPos = lFilePos; InsertItem( p->hResults, p->hFileTypesCombo, &List[iNumEntries] ); iNumEntries++; return true; } void FillListView( HWND hWndList, HWND hFileTypesCombo, HWND hStatusBar ) { int i; char szText[256]; WaitForSingleObject( hArrayMutex, INFINITE ); ListView_DeleteAllItems( hWndList ); for( i = 0; i < iNumEntries; i++ ) InsertItem( hWndList, hFileTypesCombo, &List[i] ); ReleaseMutex( hArrayMutex ); i = ListView_GetItemCount(hWndList); if( i == 1 ) wsprintf( szText, "1 Vorkommnis gefunden" ); else wsprintf( szText, "%ld Vorkommnisse gefunden", i ); SendMessage( hStatusBar, SB_SETTEXT, 255, (LPARAM)szText ); } void SearchDirectory( THREADPARAMETERS *p, LPSTR lpPath ) { char szPath[MAX_PATH+1]; char szPath2[MAX_PATH + 20]; // kleine Sicherheitsa┤marge fⁿr Text HANDLE hDir; WIN32_FIND_DATA wfd, wfd2; lstrcpy( szPath, lpPath ); AppendDirSep( szPath ); lstrcpy( szPath2, "Suche "); lstrcat( szPath2, szPath); SendMessage( p->hStatusBar, SB_SETTEXT, 255, (LPARAM)szPath2 ); lstrcat( szPath, "*.*" ); // xxx hDir = FindFirstFile( szPath, &wfd ); if( hDir != INVALID_HANDLE_VALUE ) { do { if( g_hStopSempahore ) break; if( wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ) { if( p->bRecurseDirectories ) { if( wfd.cFileName[0] != '.' ) // "." und ".." ignorieren { lstrcpy( szPath2, lpPath ); AppendDirSep( szPath2 ); lstrcat( szPath2, wfd.cFileName ); SearchDirectory( p, szPath2 ); } } } else { if( p->bDate ) { FILETIME ft; FileTimeToLocalFileTime( &wfd.ftCreationTime, &ft ); if( CompareFileTime( &ft, &p->dateVon ) < 0 ) continue; // aktuelle Datei skippen if( CompareFileTime( &ft, &p->dateBis ) > 0 ) continue; // aktuelle Datei skippen } if( p->bSize ) { switch( p->bSameSize ) // 0 = gleich, -1, minimal, 1 = maximal { case 0: // Binary shift wΣre effizienter if( ( (wfd.nFileSizeLow + 1023L) / 1024L ) != p->lKByte ) continue; break; case -1: // minmal (kleinere dateien fallen raus) if( ( (wfd.nFileSizeLow + 1023L) / 1024L ) < p->lKByte ) continue; break; case 1: // maximal (gr÷▀ere dateien fallen raus) if( ( (wfd.nFileSizeLow + 1023L) / 1024L ) > p->lKByte ) continue; break; } } if( p->lFileTypeEnd > p->lFileTypeStart ) { long l; long sl1, sl2, i1, i2; BOOL bFound; sl1 = lstrlen( wfd.cFileName ); bFound = FALSE; for( l = p->lFileTypeStart; (l < p->lFileTypeEnd) && (!bFound); l++ ) { char szMask[256]; sl2 = SendMessage( p->hFileTypes, LB_GETTEXT, l, (LPARAM)szMask ); i1 = sl1-1; i2 = sl2-1; while( (i1>=0) && (i2>=0) ) { if( toupper( szMask[i2] ) != toupper( wfd.cFileName[i1] ) ) break; if( szMask[i2] == '.' ) { bFound = TRUE; break; } i1--; i2--; } } if( !bFound ) continue; } if( p->szName[0] ) { int i; bool bFound; i = 0; bFound = false; wfd2 = wfd; CharUpperBuff( wfd2.cFileName, lstrlen(wfd.cFileName) ); while( p->szName[i] ) { if( CompareWildcard( wfd2.cFileName, &p->szName[i] ) ) { bFound = true; break; } while( !ISDELIMITER( p->szName[i] ) ) i++; if( p->szName[i] ) i++; } if( !bFound ) continue; } //FILETIME ftCreationTime; //FILETIME ftLastAccessTime; //FILETIME ftLastWriteTime; //DWORD nFileSizeHigh; //DWORD nFileSizeLow; //DWORD dwReserved0; //DWORD dwReserved1; //TCHAR cFileName[ MAX_PATH ]; //TCHAR cAlternateFileName[ 14 ]; //} WIN32_FIND_DATA; lstrcpy( szPath2, lpPath ); AppendDirSep( szPath2 ); lstrcat( szPath2, wfd.cFileName ); if( p->Pattern ) { if( p->cp.open( szPath2, p->bUpperCase ) ) { unsigned char c; DWORD lPerc; char szPerc[10]; long lFilePos; wsprintf( szPerc, " (%ld%%)", 0); lstrcpy( szPath2, "Suche "); lstrcat( szPath2, lpPath); AppendDirSep( szPath2 ); lstrcat( szPath2, wfd.cFileName ); lstrcat( szPath2, szPerc ); SendMessage( p->hStatusBar, SB_SETTEXT, 255, (LPARAM)szPath2 ); lPerc = 0; while(true) { if( wfd.nFileSizeLow ) if( ( ( p->cp.lReadPos * 100 ) / wfd.nFileSizeLow ) != lPerc ) { lPerc = ( p->cp.lReadPos * 100 ) / wfd.nFileSizeLow; wsprintf( szPerc, " (%ld%%)", lPerc); lstrcpy( szPath2, "Suche "); lstrcat( szPath2, lpPath); AppendDirSep( szPath2 ); lstrcat( szPath2, wfd.cFileName ); lstrcat( szPath2, szPerc ); SendMessage( p->hStatusBar, SB_SETTEXT, 255, (LPARAM)szPath2 ); } lFilePos = p->cp.lReadPos; if( p->Pattern->match( &p->cp ) ) // Len { char szFind[256]; long lSavePos; DWORD dwRead; DWORD i; lSavePos = SetFilePointer( p->cp.hFile, 0, NULL, FILE_CURRENT ); SetFilePointer( p->cp.hFile, lFilePos, NULL, FILE_BEGIN ); dwRead = 25; if( !ReadFile( p->cp.hFile, szFind, dwRead, (DWORD*)&dwRead, NULL ) ) dwRead = 0L; SetFilePointer( p->cp.hFile, lSavePos, NULL, FILE_BEGIN ); szFind[dwRead]=0; for( i = 0; i < dwRead; i++ ) if( !isprint(szFind[i]) ) szFind[i] = '.'; if( !InsertMatch( p, &wfd, lpPath, szFind, lFilePos ) ) { p->cp.close(); FindClose( hDir ); if( g_hStopSempahore ) ReleaseSemaphore( g_hStopSempahore,1,NULL ); return; } } if( !p->cp.getchar(&c) ) break; } p->cp.close(); } } else { if( !InsertMatch( p, &wfd, lpPath, "", 0 ) ) { FindClose( hDir ); if( g_hStopSempahore ) ReleaseSemaphore( g_hStopSempahore,1,NULL ); return; } } } } while( FindNextFile( hDir, &wfd ) ); FindClose( hDir ); } if( g_hStopSempahore ) ReleaseSemaphore( g_hStopSempahore,1,NULL ); } DWORD WINAPI SearchThreadProc( LPVOID lpParameter ) { THREADPARAMETERS *p; p = (THREADPARAMETERS*) lpParameter; iNumEntries = 0; // Keine EintrΣge SearchDirectory( p, p->szDirectory); StopSuche( p, FALSE ); return 1; } void UpdateTab( HWND hwndDlg ) { int iActTab; iActTab = SendMessage( GetDlgItem( hwndDlg, IDC_TAB ), TCM_GETCURSEL, 0, 0 ); if( iActTab < 0 ) iActTab = 0; ShowWindow( GetDlgItem( hwndDlg, IDC_STATICNAME ), iActTab == 0 ); ShowWindow( GetDlgItem( hwndDlg, IDC_COMBONAME ), iActTab == 0 ); ShowWindow( GetDlgItem( hwndDlg, IDC_STATICMUSTER ), iActTab == 0 ); ShowWindow( GetDlgItem( hwndDlg, IDC_COMBOMUSTER ), iActTab == 0 ); ShowWindow( GetDlgItem( hwndDlg, IDC_STATICSUCHENIN ),iActTab == 0 ); ShowWindow( GetDlgItem( hwndDlg, IDC_DURCHSUCHEN ), iActTab == 0 ); ShowWindow( GetDlgItem( hwndDlg, IDC_COMBOSUCHENIN ), iActTab == 0 ); ShowWindow( GetDlgItem( hwndDlg, IDC_RECURSEDIR ), iActTab == 0 ); ShowWindow( GetDlgItem( hwndDlg, IDC_GROSSKLEIN ), iActTab == 0 ); ShowWindow( GetDlgItem( hwndDlg, IDC_UNICODE ), iActTab == 0 ); ShowWindow( GetDlgItem( hwndDlg, IDC_WINDOWSSYNTAX ), iActTab == 0 ); ShowWindow( GetDlgItem( hwndDlg, IDC_ALLEDATEIEN ), iActTab == 1 ); ShowWindow( GetDlgItem( hwndDlg, IDC_DATEIDATUM ), iActTab == 1 ); ShowWindow( GetDlgItem( hwndDlg, IDC_ZWISCHEN ), iActTab == 1 ); ShowWindow( GetDlgItem( hwndDlg, IDC_EDITVON ), iActTab == 1 ); ShowWindow( GetDlgItem( hwndDlg, IDC_EDITBIS ), iActTab == 1 ); ShowWindow( GetDlgItem( hwndDlg, IDC_LETZTEMONATE ), iActTab == 1 ); ShowWindow( GetDlgItem( hwndDlg, IDC_EDITLETZTEMONATE ), iActTab == 1 ); ShowWindow( GetDlgItem( hwndDlg, IDC_SPINLETZTEMONATE ), iActTab == 1 ); ShowWindow( GetDlgItem( hwndDlg, IDC_LETZTETAGE ), iActTab == 1 ); ShowWindow( GetDlgItem( hwndDlg, IDC_EDITLETZTETAGE ), iActTab == 1 ); ShowWindow( GetDlgItem( hwndDlg, IDC_LETZTETAGE ), iActTab == 1 ); ShowWindow( GetDlgItem( hwndDlg, IDC_SPINLETZTETAGE ), iActTab == 1 ); ShowWindow( GetDlgItem( hwndDlg, IDC_STATICUND ), iActTab == 1 ); ShowWindow( GetDlgItem( hwndDlg, IDC_STATICLETZTEMONATE ), iActTab == 1 ); ShowWindow( GetDlgItem( hwndDlg, IDC_STATICLETZTETAGE ), iActTab == 1 ); ShowWindow( GetDlgItem( hwndDlg, IDC_STATICTYP ), iActTab == 2 ); ShowWindow( GetDlgItem( hwndDlg, IDC_COMBOTYP ), iActTab == 2 ); ShowWindow( GetDlgItem( hwndDlg, IDC_STATICGROESSE ), iActTab == 2 ); ShowWindow( GetDlgItem( hwndDlg, IDC_COMBOGROESSE ), iActTab == 2 ); ShowWindow( GetDlgItem( hwndDlg, IDC_EDITGROESSE ), iActTab == 2 ); ShowWindow( GetDlgItem( hwndDlg, IDC_SPINGROESSE ), iActTab == 2 ); ShowWindow( GetDlgItem( hwndDlg, IDC_STATICKB ), iActTab == 2 ); } void SetTab( HWND hwndDlg, int i ) { SendMessage( GetDlgItem( hwndDlg, IDC_TAB ), TCM_SETCURSEL, i, 0 ); UpdateTab( hwndDlg ); } BOOL GetDigit( LPSTR szText, int *i, int *v ) { BOOL bDigit; bDigit = FALSE; *v = 0; while( isdigit( szText[*i] ) ) { *v *= 10; *v += szText[*i] - '0'; (*i)++; bDigit = TRUE; } return bDigit; } BOOL GetDate( HWND hwndDlg, HWND hwndDateEdit, SYSTEMTIME *st ) { int i,d,m,y; BOOL bCorrect; char szDate[256]; memset( st, 0, sizeof( SYSTEMTIME ) ); if( !GetWindowText( hwndDateEdit, szDate, sizeof(szDate)) ) { MessageBox( hwndDlg, "Bitte geben Sie ein gⁿltiges Datum bzw. einen gⁿltigen Datumsbereich ein!", "Dasteien suchen", MB_OK | MB_ICONSTOP ); SetTab( hwndDlg, 1 ); SetFocus( hwndDateEdit ); return FALSE; } i=0; bCorrect = FALSE; if( GetDigit( szDate, &i, &d ) ) // Tag if( szDate[i]=='.' ) { i++; if( GetDigit( szDate, &i, &m ) ) // Monat if( szDate[i]=='.' ) { i++; if( GetDigit( szDate, &i, &y ) ) // Jahr bCorrect = TRUE; } } if( !bCorrect ) { MessageBox( hwndDlg, "Bitte geben Sie ein gⁿltiges Datum bzw. einen gⁿltigen Datumsbereich ein!", "Dasteien suchen", MB_OK | MB_ICONSTOP ); SetTab( hwndDlg, 1 ); SetFocus( hwndDateEdit ); return FALSE; } st->wYear = y; if( st->wYear < 51 ) // 50 == 2050, 51 == 1951 st->wYear+= 2000; else if( st->wYear < 100 ) st->wYear += 1900; if( st->wYear < 1980 ) { MessageBox( hwndDlg, "Bitte wΣhlen Sie ein Datum ab dem 1.1.1980!" , "Dateien suchen", MB_OK | MB_ICONSTOP ); SetTab( hwndDlg, 1 ); SetFocus( hwndDateEdit ); return FALSE; } if( st->wYear >= 2100 ) { MessageBox( hwndDlg, "Bitte wΣhlen Sie ein Datum bis zum 31.12.2099!" , "Dateien suchen", MB_OK | MB_ICONSTOP ); SetTab( hwndDlg, 1 ); SetFocus( hwndDateEdit ); return FALSE; } iMonth[1]=28; // Moinatsarray auf Korrekten Februar setzen if( !( y % 4 ) ) // Teilbar durch 4 { if( ( y % 100 ) == 0 ) // Alle Hundertjahre fΣllt das Schaltjahr aus { if( (y % 400 ) == 0 ) // Alle vierhunderter allerdings dann doch wieder iMonth[1]=29; // Tausender sind doich Schaltjahre } else iMonth[1]=29; } m--; if( ( m >= 0 ) && ( m < 11 ) ) { d--; if( ( d >= 0 ) && ( d < iMonth[m] ) ) { if( ( y >= 1980 ) && ( y <= 2100 ) ) { st->wMonth = m + 1; st->wDayOfWeek = 0; st->wDay = d + 1; st->wHour = 0; st->wMinute = 0; st->wSecond = 0; st->wMilliseconds = 0; bCorrect = TRUE; } } else { MessageBox( hwndDlg, "Ungⁿltige Tagesangabe!" , "Dateien suchen", MB_OK | MB_ICONSTOP ); SetTab( hwndDlg, 1 ); SetFocus( hwndDateEdit ); return FALSE; } } else { MessageBox( hwndDlg, "Ungⁿltige Monatsangabe!" , "Dateien suchen", MB_OK | MB_ICONSTOP ); SetTab( hwndDlg, 1 ); SetFocus( hwndDateEdit ); return FALSE; } return bCorrect; } void SizeWindow( HWND hwndDlg, int iResultHeight, BOOL bCalcResultHeight ) { RECT rWindow, rButton, rTab, rControl, rNewWindow; int w, h, dlux, dluy, x, y,xx; GetClientRect( hwndDlg, &rWindow ); w = rWindow.right - rWindow.left; h = rWindow.bottom - rWindow.top; dlux = LOWORD( GetDialogBaseUnits() ); dluy = HIWORD( GetDialogBaseUnits() ); GetClientRect( GetDlgItem( hwndDlg, IDC_SUCHESTARTEN ), &rButton ); x = ( w - ( 7 * dlux ) / 4 ) - ( rButton.right - rButton.left ); y = (7 + 7) * dluy/8; MoveWindow( GetDlgItem( hwndDlg, IDC_SUCHESTARTEN ), x, y, ( rButton.right - rButton.left ), 12*dluy/8, TRUE ); y += (12+4) * dluy/8; GetClientRect( GetDlgItem( hwndDlg, IDC_SUCHEANHALTEN ), &rButton ); MoveWindow( GetDlgItem( hwndDlg, IDC_SUCHEANHALTEN ), x, y, ( rButton.right - rButton.left ), 12*dluy/8, TRUE ); y += (12+4) * dluy/8; GetClientRect( GetDlgItem( hwndDlg, IDC_NEUESUCHE ), &rButton ); MoveWindow( GetDlgItem( hwndDlg, IDC_NEUESUCHE ), x, y, ( rButton.right - rButton.left ), 12*dluy/8, TRUE ); GetClientRect( GetDlgItem( hwndDlg, IDC_SUCHESTARTEN ), &rButton ); rTab.left = 7 * dlux/4; rTab.top = 4 * dluy/8; rTab.right = x - 7*dlux/4; rTab.bottom = rTab.top + ((5+8*14)*dluy/8); MoveWindow( GetDlgItem( hwndDlg, IDC_TAB ), rTab.left, rTab.top, rTab.right - rTab.left,rTab.bottom -rTab.top, TRUE ); // Tab 0 GetWindowRect( GetDlgItem( hwndDlg, IDC_STATICNAME ), &rControl ); x = rTab.left + 7 * dlux/4; y = rTab.top + (5+14)*dluy/8; MoveWindow( GetDlgItem( hwndDlg,IDC_STATICNAME ), x, y, rControl.right-rControl.left,12*dluy/8,TRUE ); x += rControl.right-rControl.left + 7*dlux/4; MoveWindow( GetDlgItem( hwndDlg,IDC_COMBONAME ), x, y,(rTab.right - 7*dlux/4)-x,5*12*dluy/8, TRUE); GetWindowRect( GetDlgItem( hwndDlg, IDC_STATICMUSTER ), &rControl ); x = rTab.left + 7 * dlux/4; y = rTab.top + (5+2*14)*dluy/8; MoveWindow( GetDlgItem( hwndDlg,IDC_STATICMUSTER ), x, y, rControl.right-rControl.left,12*dluy/8,TRUE ); x += rControl.right-rControl.left + 7*dlux/4; MoveWindow( GetDlgItem( hwndDlg,IDC_COMBOMUSTER ), x, y,(rTab.right - 7*dlux/4)-x,5 * 12*dluy/8, TRUE); // Combobox-H÷he nur in ausgeklappten Zustand sichtbar GetWindowRect( GetDlgItem( hwndDlg, IDC_STATICSUCHENIN ), &rControl ); GetWindowRect( GetDlgItem( hwndDlg, IDC_DURCHSUCHEN ), &rButton ); x = rTab.right -7 * dlux/4 - ( rButton.right - rButton.left ); y = rTab.top + (5+3*14)*dluy/8; MoveWindow( GetDlgItem( hwndDlg, IDC_DURCHSUCHEN ), x,y,rButton.right-rButton.left, 12*dluy/8, TRUE); rButton.left = x; x = rTab.left + 7 * dlux/4; MoveWindow( GetDlgItem( hwndDlg,IDC_STATICSUCHENIN ), x, y, (rControl.right-rControl.left),12*dluy/8,TRUE ); x += rControl.right-rControl.left + 7*dlux/4; MoveWindow( GetDlgItem( hwndDlg, IDC_COMBOSUCHENIN ), x, y,(rButton.left - 7*dlux/4) - x, 5 * 12*dluy/8, TRUE); y = rTab.top + (5+4*14)*dluy/8; xx = x; GetWindowRect( GetDlgItem( hwndDlg, IDC_RECURSEDIR ), &rControl ); MoveWindow( GetDlgItem( hwndDlg, IDC_RECURSEDIR ), x, y,(rControl.right-rControl.left), 12*dluy/8, TRUE); y = rTab.top + (5+4*14 + 12)*dluy/8; GetWindowRect( GetDlgItem( hwndDlg, IDC_GROSSKLEIN ), &rControl ); MoveWindow( GetDlgItem( hwndDlg, IDC_GROSSKLEIN ), x, y,(rControl.right-rControl.left), 12*dluy/8, TRUE); y = rTab.top + (5+4*14 + 24)*dluy/8; GetWindowRect( GetDlgItem( hwndDlg, IDC_UNICODE ), &rControl ); MoveWindow( GetDlgItem( hwndDlg, IDC_UNICODE ), x, y,(rControl.right-rControl.left), 12*dluy/8, TRUE); y = rTab.top + (5+4*14 + 36)*dluy/8; GetWindowRect( GetDlgItem( hwndDlg, IDC_WINDOWSSYNTAX ), &rControl ); MoveWindow( GetDlgItem( hwndDlg, IDC_WINDOWSSYNTAX ), x, y,(rControl.right-rControl.left), 12*dluy/8, TRUE); // Tab 1 x = rTab.left + 7 * dlux/4; y = rTab.top + (5+14)*dluy/8; GetWindowRect( GetDlgItem( hwndDlg, IDC_ALLEDATEIEN ), &rControl ); MoveWindow( GetDlgItem( hwndDlg, IDC_ALLEDATEIEN ), x, y, rControl.right-rControl.left,12*dluy/8,TRUE ); x = rTab.left + 7 * dlux/4; y += 14*dluy/8; GetWindowRect( GetDlgItem( hwndDlg, IDC_DATEIDATUM ), &rControl ); MoveWindow( GetDlgItem( hwndDlg, IDC_DATEIDATUM ), x, y, rControl.right-rControl.left,12*dluy/8,TRUE ); x = rTab.left + 14 * dlux/4; y += 14*dluy/8; GetWindowRect( GetDlgItem( hwndDlg, IDC_ZWISCHEN ), &rControl ); MoveWindow( GetDlgItem( hwndDlg, IDC_ZWISCHEN ), x, y, rControl.right-rControl.left,12*dluy/8,TRUE ); x += rControl.right-rControl.left + dlux/4; GetWindowRect( GetDlgItem( hwndDlg, IDC_EDITVON ), &rControl ); MoveWindow( GetDlgItem( hwndDlg, IDC_EDITVON ), x, y, rControl.right-rControl.left,12*dluy/8,TRUE ); x += rControl.right-rControl.left + dlux/4; GetWindowRect( GetDlgItem( hwndDlg, IDC_STATICUND ), &rControl ); MoveWindow( GetDlgItem( hwndDlg, IDC_STATICUND ), x, y+dluy/3, rControl.right-rControl.left,12*dluy/8,TRUE ); x += rControl.right-rControl.left + dlux/4; GetWindowRect( GetDlgItem( hwndDlg, IDC_EDITBIS ), &rControl ); MoveWindow( GetDlgItem( hwndDlg, IDC_EDITBIS ), x, y, rControl.right-rControl.left,12*dluy/8,TRUE ); xx = x; x = rTab.left + 14 * dlux/4; y += 14*dluy/8; GetWindowRect( GetDlgItem( hwndDlg, IDC_LETZTEMONATE ), &rControl ); MoveWindow( GetDlgItem( hwndDlg, IDC_LETZTEMONATE ), x, y, rControl.right-rControl.left,12*dluy/8,TRUE ); x += rControl.right-rControl.left + dlux/4; GetWindowRect( GetDlgItem( hwndDlg, IDC_EDITLETZTEMONATE ), &rControl ); MoveWindow( GetDlgItem( hwndDlg, IDC_EDITLETZTEMONATE ), x, y, rControl.right-rControl.left,12*dluy/8,TRUE ); x += rControl.right-rControl.left + dlux/4; GetWindowRect( GetDlgItem( hwndDlg, IDC_SPINLETZTEMONATE ), &rControl ); MoveWindow( GetDlgItem( hwndDlg, IDC_SPINLETZTEMONATE ), x, y, rControl.right-rControl.left,12*dluy/8,TRUE ); x = xx; //rControl.right-rControl.left + dlux/4; GetWindowRect( GetDlgItem( hwndDlg, IDC_STATICLETZTEMONATE ), &rControl ); MoveWindow( GetDlgItem( hwndDlg, IDC_STATICLETZTEMONATE ), x, y+dluy/3, rControl.right-rControl.left,12*dluy/8,TRUE ); x = rTab.left + 14 * dlux/4; y += 14*dluy/8; GetWindowRect( GetDlgItem( hwndDlg, IDC_LETZTETAGE ), &rControl ); MoveWindow( GetDlgItem( hwndDlg, IDC_LETZTETAGE ), x, y, rControl.right-rControl.left,12*dluy/8,TRUE ); x += rControl.right-rControl.left + dlux/4; GetWindowRect( GetDlgItem( hwndDlg, IDC_EDITLETZTETAGE ), &rControl ); MoveWindow( GetDlgItem( hwndDlg, IDC_EDITLETZTETAGE ), x, y, rControl.right-rControl.left,12*dluy/8,TRUE ); x += rControl.right-rControl.left + dlux/4; GetWindowRect( GetDlgItem( hwndDlg, IDC_SPINLETZTETAGE ), &rControl ); MoveWindow( GetDlgItem( hwndDlg, IDC_SPINLETZTETAGE ), x, y, rControl.right-rControl.left,12*dluy/8,TRUE ); x = xx; //rControl.right-rControl.left + dlux/4; GetWindowRect( GetDlgItem( hwndDlg, IDC_STATICLETZTETAGE ), &rControl ); MoveWindow( GetDlgItem( hwndDlg, IDC_STATICLETZTETAGE ), x, y+dluy/3, rControl.right-rControl.left,12*dluy/8,TRUE ); // Tab 2 x = rTab.left + 7 * dlux/4; y = rTab.top + (5+14)*dluy/8; GetWindowRect( GetDlgItem( hwndDlg, IDC_STATICTYP ), &rControl ); MoveWindow( GetDlgItem( hwndDlg, IDC_STATICTYP ), x, y, rControl.right-rControl.left,12*dluy/8,TRUE ); x += rControl.right-rControl.left + dlux/4; GetWindowRect( GetDlgItem( hwndDlg, IDC_COMBOTYP ), &rControl ); MoveWindow( GetDlgItem( hwndDlg, IDC_COMBOTYP ), x, y, rControl.right-rControl.left,6 * 12*dluy/8,TRUE ); x = rTab.left + 7 * dlux/4; y += 14*dluy/8; GetWindowRect( GetDlgItem( hwndDlg, IDC_STATICGROESSE ), &rControl ); MoveWindow( GetDlgItem( hwndDlg, IDC_STATICGROESSE ), x, y, rControl.right-rControl.left,12*dluy/8,TRUE ); x += rControl.right-rControl.left + dlux/4; GetWindowRect( GetDlgItem( hwndDlg, IDC_COMBOGROESSE ), &rControl ); MoveWindow( GetDlgItem( hwndDlg, IDC_COMBOGROESSE ), x, y, rControl.right-rControl.left,3 * 12*dluy/8,TRUE ); x += rControl.right-rControl.left + dlux/4; GetWindowRect( GetDlgItem( hwndDlg, IDC_EDITGROESSE ), &rControl ); MoveWindow( GetDlgItem( hwndDlg, IDC_EDITGROESSE ), x, y, rControl.right-rControl.left,12*dluy/8,TRUE ); x += rControl.right-rControl.left + dlux/4; GetWindowRect( GetDlgItem( hwndDlg, IDC_SPINGROESSE ), &rControl ); MoveWindow( GetDlgItem( hwndDlg, IDC_SPINGROESSE ), x, y, rControl.right-rControl.left,12*dluy/8,TRUE ); x += rControl.right-rControl.left + dlux/4; GetWindowRect( GetDlgItem( hwndDlg, IDC_STATICKB ), &rControl ); MoveWindow( GetDlgItem( hwndDlg, IDC_STATICKB ), x, y, rControl.right-rControl.left,12*dluy/8,TRUE ); rNewWindow.left = 0; rNewWindow.top = 0; rNewWindow.right = 0; rNewWindow.bottom = 0; AdjustWindowRect(&rNewWindow, GetWindowLong( hwndDlg, GWL_STYLE), TRUE ); h = rNewWindow.bottom - rNewWindow.top; rNewWindow.left = 0; rNewWindow.top = 0; rNewWindow.right = w; rNewWindow.bottom = rTab.bottom + 4*dluy/8; if( bCalcResultHeight ) iResultHeight -= (rNewWindow.bottom-h); if( iResultHeight < h+20 ) iResultHeight = 0; if( iResultHeight ) { int iList; int iTop; if( iResultHeight <= 0 ) iResultHeight = 100; iList = iResultHeight - h; // WindowFrame H÷he abziehen iTop = rNewWindow.bottom; rNewWindow.bottom += iList; MoveWindow( g_hStatusBar, 0, rNewWindow.bottom-(rControl.bottom- rControl.top), w, (rControl.bottom- rControl.top), TRUE); iResultHeight = rNewWindow.bottom - iTop + h; if( bCalcResultHeight ) g_iResultHeight = iResultHeight; MoveWindow( GetDlgItem( hwndDlg, IDC_RESULTS ), 0, rTab.bottom + 4 * dluy/8, w, iResultHeight-(h+(rControl.bottom- rControl.top)) + 2 * dluy/8, TRUE ); ShowWindow( GetDlgItem( hwndDlg, IDC_RESULTS ), SW_SHOW ); ShowWindow( g_hStatusBar, SW_SHOW ); } else { ShowWindow( GetDlgItem( hwndDlg, IDC_RESULTS ), SW_HIDE ); ShowWindow( g_hStatusBar, SW_HIDE ); } AdjustWindowRect(&rNewWindow, GetWindowLong( hwndDlg, GWL_STYLE), TRUE ); GetWindowRect( hwndDlg, &rWindow ); MoveWindow( hwndDlg, rWindow.left, rWindow.top, rNewWindow.right-rNewWindow.left, rNewWindow.bottom-rNewWindow.top, TRUE ); } void SetView( HWND hwndDlg, int id ) { DWORD dwStyle; dwStyle = GetWindowLong( GetDlgItem( hwndDlg, IDC_RESULTS ), GWL_STYLE ); dwStyle &= ~(LVS_ICON|LVS_LIST|LVS_REPORT|LVS_SMALLICON); switch( id ) { case ID_ANSICHTGROSSESYMBOLE: dwStyle |= LVS_ICON; break; case ID_ANSICHTKLEINESYMBOLE: dwStyle |= LVS_SMALLICON; break; case ID_ANSICHTLISTE: dwStyle |= LVS_LIST; break; case ID_ANSICHTDETAILS: dwStyle |= LVS_REPORT; break; } SetWindowLong( GetDlgItem( hwndDlg, IDC_RESULTS ), GWL_STYLE, dwStyle ); CheckMenuItem( GetMenu( hwndDlg), ID_ANSICHTGROSSESYMBOLE,MF_BYCOMMAND | (ID_ANSICHTGROSSESYMBOLE==id) ? MF_CHECKED : MF_UNCHECKED ); CheckMenuItem( GetMenu( hwndDlg), ID_ANSICHTKLEINESYMBOLE,MF_BYCOMMAND | (ID_ANSICHTKLEINESYMBOLE==id) ? MF_CHECKED : MF_UNCHECKED ); CheckMenuItem( GetMenu( hwndDlg), ID_ANSICHTLISTE,MF_BYCOMMAND | (ID_ANSICHTLISTE==id) ? MF_CHECKED : MF_UNCHECKED ); CheckMenuItem( GetMenu( hwndDlg), ID_ANSICHTDETAILS,MF_BYCOMMAND | (ID_ANSICHTDETAILS==id) ? MF_CHECKED : MF_UNCHECKED ); } BOOL CALLBACK WinGrepProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam ) { switch( uMsg ) { case WM_INITDIALOG: { TCITEM tci; LVCOLUMN lvc; SHFILEINFO sfi; RECT r; GetClientRect( hwndDlg , &r ); SizeWindow( hwndDlg, r.bottom-r.top, TRUE ); AddFileTypesToCombo( GetDlgItem( hwndDlg, IDC_COMBOTYP ), GetDlgItem( hwndDlg, IDC_LISTTYP ), GetDlgItem( hwndDlg, IDC_LISTEXTENSIONS ) ); SetWindowText( GetDlgItem( hwndDlg, IDC_EDITLETZTEMONATE ), "1" ); SendMessage( GetDlgItem( hwndDlg, IDC_SPINLETZTEMONATE ), UDM_SETRANGE, 0, (LPARAM) MAKELONG((short) 32767, (short) 1) ); SetWindowText( GetDlgItem( hwndDlg, IDC_EDITLETZTETAGE ), "1" ); SendMessage( GetDlgItem( hwndDlg, IDC_SPINLETZTETAGE ), UDM_SETRANGE, 0, (LPARAM) MAKELONG((short) 32767, (short) 1) ); SendMessage( GetDlgItem( hwndDlg, IDC_COMBOGROESSE ), CB_INSERTSTRING, 0, (LPARAM)"" ); SendMessage( GetDlgItem( hwndDlg, IDC_COMBOGROESSE ), CB_INSERTSTRING, 1, (LPARAM)"Minimal" ); SendMessage( GetDlgItem( hwndDlg, IDC_COMBOGROESSE ), CB_INSERTSTRING, 2, (LPARAM)"Maximal" ); SetWindowText( GetDlgItem( hwndDlg, IDC_EDITGROESSE ), "" ); g_hImageListIcon = (HIMAGELIST)SHGetFileInfo( "",0,&sfi,sizeof(sfi),SHGFI_SYSICONINDEX|SHGFI_ICON ); g_hImageListSmallIcon = (HIMAGELIST)SHGetFileInfo( "",0,&sfi,sizeof(sfi),SHGFI_SYSICONINDEX|SHGFI_SMALLICON ); ListView_SetImageList(GetDlgItem( hwndDlg, IDC_RESULTS ),g_hImageListIcon,LVSIL_NORMAL); ListView_SetImageList(GetDlgItem( hwndDlg, IDC_RESULTS ),g_hImageListSmallIcon,LVSIL_SMALL); g_iResultHeight = 0; g_ThreadParameters.hThread = INVALID_HANDLE_VALUE; g_hStatusBar = CreateStatusWindow( WS_CHILD,"", hwndDlg, 0 ); tci.mask = TCIF_TEXT | TCIF_IMAGE | TCIF_PARAM | TCIF_STATE; tci.dwState = 0; tci.dwStateMask = 0; tci.pszText = "Name / Ort"; tci.cchTextMax = lstrlen( tci.pszText ); tci.iImage = -1; tci.lParam = 0; SendMessage( GetDlgItem( hwndDlg, IDC_TAB ), TCM_INSERTITEM, 0, (LPARAM)&tci ); tci.mask = TCIF_TEXT | TCIF_IMAGE | TCIF_PARAM | TCIF_STATE; tci.dwState = 0; tci.dwStateMask = 0; tci.pszText = "─nderungsdatum"; tci.cchTextMax = lstrlen( tci.pszText ); tci.iImage = -1; tci.lParam = 0; SendMessage( GetDlgItem( hwndDlg, IDC_TAB ), TCM_INSERTITEM, 1, (LPARAM)&tci ); tci.mask = TCIF_TEXT | TCIF_IMAGE | TCIF_PARAM | TCIF_STATE; tci.dwState = 0; tci.dwStateMask = 0; tci.pszText = "Weitere Optionen"; tci.cchTextMax = lstrlen( tci.pszText ); tci.iImage = -1; tci.lParam = 0; SendMessage( GetDlgItem( hwndDlg, IDC_TAB ), TCM_INSERTITEM, 2, (LPARAM)&tci ); lvc.mask = LVCF_FMT | LVCF_TEXT | LVCF_WIDTH; lvc.fmt = LVCFMT_LEFT; lvc.cx = 100; lvc.pszText = "Name"; lvc.cchTextMax = lstrlen(lvc.pszText); lvc.iSubItem = 0; lvc.iImage - 1; lvc.iOrder = 0; ListView_InsertColumn( GetDlgItem( hwndDlg, IDC_RESULTS ), 0, &lvc ); lvc.mask = LVCF_FMT | LVCF_TEXT | LVCF_WIDTH; lvc.fmt = LVCFMT_LEFT; lvc.cx = 100; lvc.pszText = "In Ordner"; lvc.cchTextMax = lstrlen(lvc.pszText); lvc.iSubItem = 1; lvc.iImage - 1; lvc.iOrder = 1; ListView_InsertColumn( GetDlgItem( hwndDlg, IDC_RESULTS ), 1, &lvc ); lvc.mask = LVCF_FMT | LVCF_TEXT | LVCF_WIDTH; lvc.fmt = LVCFMT_RIGHT; lvc.cx = 100; lvc.pszText = "Gr÷▀e"; lvc.cchTextMax = lstrlen(lvc.pszText); lvc.iSubItem = 2; lvc.iImage - 1; lvc.iOrder = 2; ListView_InsertColumn( GetDlgItem( hwndDlg, IDC_RESULTS ), 2, &lvc ); lvc.mask = LVCF_FMT | LVCF_TEXT | LVCF_WIDTH; lvc.fmt = LVCFMT_LEFT; lvc.cx = 100; lvc.pszText = "Typ"; lvc.cchTextMax = lstrlen(lvc.pszText); lvc.iSubItem = 3; lvc.iImage - 1; lvc.iOrder = 3; ListView_InsertColumn( GetDlgItem( hwndDlg, IDC_RESULTS ), 3, &lvc ); lvc.mask = LVCF_FMT | LVCF_TEXT | LVCF_WIDTH; lvc.fmt = LVCFMT_LEFT; lvc.cx = 100; lvc.pszText = "GeΣndert am"; lvc.cchTextMax = lstrlen(lvc.pszText); lvc.iSubItem = 4; lvc.iImage - 1; lvc.iOrder = 4; ListView_InsertColumn( GetDlgItem( hwndDlg, IDC_RESULTS ), 4, &lvc ); lvc.mask = LVCF_FMT | LVCF_TEXT | LVCF_WIDTH; lvc.fmt = LVCFMT_RIGHT; lvc.cx = 100; lvc.pszText = "Fundtext"; lvc.cchTextMax = lstrlen(lvc.pszText); lvc.iSubItem = 5; lvc.iImage - 1; lvc.iOrder = 5; ListView_InsertColumn( GetDlgItem( hwndDlg, IDC_RESULTS ), 5, &lvc ); lvc.mask = LVCF_FMT | LVCF_TEXT | LVCF_WIDTH; lvc.fmt = LVCFMT_RIGHT; lvc.cx = 100; lvc.pszText = "Fundstelle"; lvc.cchTextMax = lstrlen(lvc.pszText); lvc.iSubItem = 6; lvc.iImage - 1; lvc.iOrder = 6; ListView_InsertColumn( GetDlgItem( hwndDlg, IDC_RESULTS ), 6, &lvc ); SetView( hwndDlg, ID_ANSICHTDETAILS ); UpdateTab( hwndDlg ); SetDate( hwndDlg ); LoadParameters( hwndDlg ); SetWindowText( GetDlgItem( hwndDlg, IDC_COMBOSUCHENIN ), g_szDrive ); } break; case WM_SIZE: // CLient Area { RECT rNewWindow; rNewWindow.left = 0; rNewWindow.top = 0; rNewWindow.right = 0; rNewWindow.bottom = 0; AdjustWindowRect(&rNewWindow, GetWindowLong( hwndDlg, GWL_STYLE), TRUE ); SizeWindow( hwndDlg, HIWORD( lParam ), TRUE ); } break; case WM_NOTIFY: { switch( wParam ) { case IDC_TAB: { LPNMHDR lpnmhdr = (LPNMHDR) lParam; if( lpnmhdr->code == TCN_SELCHANGE ) UpdateTab( hwndDlg ); } break; case IDC_RESULTS: { LPNMHDR lpnmhdr = (LPNMHDR) lParam; if( lpnmhdr->code == LVN_COLUMNCLICK ) { int i; LPNMLISTVIEW lpnmv = (LPNMLISTVIEW) lParam; HCURSOR hCursor; if( lpnmv->iSubItem > 4 ) { MessageBox( hwndDlg, "Fundstellen und Fundpositionen lassen sich nicht sortieren!", "Hinweis", MB_ICONSTOP | MB_OK ); break; } else { hCursor = SetCursor( LoadCursor( NULL, IDC_WAIT ) ); for( i = 0 ; i < 4; i++ ) if( lpnmv->iSubItem == i ) { if( iSort[i] != SORT_DOWN ) // Aktuelle Auswahl iSort[i] = SORT_DOWN; else iSort[i] = SORT_UP; } else iSort[i] = SORT_NONE; // Alle andere SortArray( 0, iNumEntries-1, lpnmv->iSubItem, iSort[lpnmv->iSubItem],g_ThreadParameters.hFileTypesCombo); FillListView(g_ThreadParameters.hResults,g_ThreadParameters.hFileTypesCombo,g_ThreadParameters.hStatusBar); SetCursor( hCursor ); } } else if( lpnmhdr->code == NM_RCLICK ) { POINT p; LPNMLISTVIEW lpnmv = (LPNMLISTVIEW) lParam; if( ListView_GetSelectedCount( GetDlgItem( hwndDlg, IDC_RESULTS ) ) == 1 ) { long i; i = ListView_GetNextItem(GetDlgItem( hwndDlg, IDC_RESULTS ),-1,LVNI_FOCUSED); if( i >= 0 ) { GetCursorPos( &p ); DoExplorerMenu (hwndDlg, List[i].szPath, List[i].lPos, p); } } } else if( lpnmhdr->code == NM_DBLCLK ) { POINT p; LPNMLISTVIEW lpnmv = (LPNMLISTVIEW) lParam; if( ListView_GetSelectedCount( GetDlgItem( hwndDlg, IDC_RESULTS ) ) == 1 ) { long i; i = ListView_GetNextItem(GetDlgItem( hwndDlg, IDC_RESULTS ),-1,LVNI_FOCUSED); if( i >= 0 ) { GetCursorPos( &p ); ShellExecute(hwndDlg, "open", List[i].szPath, NULL, //LPCTSTR lpParameters, NULL, //LPCTSTR lpDirectory, SW_SHOWNORMAL ); } } } } break; } } break; case WM_COMMAND: { switch( LOWORD( wParam ) ) { case IDCANCEL: SaveParameters( hwndDlg ); StopSuche( &g_ThreadParameters, TRUE ); EndDialog( hwndDlg, 0 ); PostQuitMessage( 0 ); break; case IDC_ALLEDATEIEN: case IDC_DATEIDATUM: case IDC_ZWISCHEN: case IDC_LETZTEMONATE: case IDC_LETZTETAGE: if( HIWORD( wParam ) == BN_CLICKED ) SetDate( hwndDlg ); break; case IDC_DURCHSUCHEN: { char szNewDir[256]; BROWSEINFO bi; LPITEMIDLIST lppidl; bi.hwndOwner = hwndDlg; bi.pidlRoot = NULL; bi.pszDisplayName = szNewDir; bi.lpszTitle = "Ordner suchen"; bi.ulFlags = BIF_RETURNONLYFSDIRS; bi.lpfn = NULL; bi.lParam = 0; bi.iImage = 0; lppidl = SHBrowseForFolder( &bi ); if( lppidl ) { char szPath[MAX_PATH]; SHGetPathFromIDList( lppidl, szPath ); SetWindowText( GetDlgItem( hwndDlg, IDC_COMBOSUCHENIN ), szPath ); ShellFree( lppidl ); } } break; case IDC_COMBONAME: if( HIWORD( wParam ) == CBN_EDITCHANGE ) { //char c[2]; //if( GetWindowText( GetDlgItem( hwndDlg, IDC_COMBONAME ), c, 2) ) // SendMessage( GetDlgItem( hwndDlg, IDC_COMBOTYP ), CB_SETCURSEL, 0, 0 ); } break; case IDC_COMBOTYP: if( HIWORD( wParam ) == CBN_SELCHANGE ) if( SendMessage( GetDlgItem( hwndDlg, IDC_COMBOTYP ), CB_GETCURSEL, 0, 0 ) ) SetWindowText( GetDlgItem( hwndDlg, IDC_COMBONAME ), "" ); break; case IDC_SUCHESTARTEN: { char szPattern[1024]; long ft; RECT rTab, rWindow; char szText[200]; SYSTEMTIME tvon, tbis; char szTitle[512]; int i; GetWindowText( GetDlgItem( hwndDlg, IDC_COMBOSUCHENIN ), g_ThreadParameters.szDirectory, sizeof(g_ThreadParameters.szDirectory) ); GetWindowText( GetDlgItem( hwndDlg, IDC_COMBONAME ), g_ThreadParameters.szName, sizeof(g_ThreadParameters.szName)); if( lstrlen( g_ThreadParameters.szDirectory ) == 0 ) { MessageBox( hwndDlg, "Bitte geben Sie ein Such-Verzeichnis an", "Fehler!", MB_ICONSTOP | MB_OK ); SetTab( hwndDlg, 0 ); SetFocus( GetDlgItem( hwndDlg, IDC_COMBOSUCHENIN ) ); break; } g_ThreadParameters.bRecurseDirectories = ( SendMessage( GetDlgItem( hwndDlg, IDC_RECURSEDIR ), BM_GETCHECK,0,0 ) & BST_CHECKED ) ? true : false; g_ThreadParameters.bUpperCase = ( SendMessage( GetDlgItem( hwndDlg, IDC_GROSSKLEIN ), BM_GETCHECK,0,0 ) & BST_CHECKED ) ? true : false; g_ThreadParameters.bUnicode = ( SendMessage( GetDlgItem( hwndDlg, IDC_UNICODE ), BM_GETCHECK,0,0 ) & BST_CHECKED ) ? true : false; g_ThreadParameters.bWindowsSemantic = ( SendMessage( GetDlgItem( hwndDlg, IDC_WINDOWSSYNTAX ), BM_GETCHECK,0,0 ) & BST_CHECKED ) ? true : false; g_ThreadParameters.Pattern = NULL; if( GetWindowText( GetDlgItem( hwndDlg, IDC_COMBOMUSTER ), szPattern, sizeof( szPattern ) ) ) { if( g_ThreadParameters.bUpperCase ) CharUpperBuff( szPattern, lstrlen( szPattern ) ); i = 0; g_ThreadParameters.Pattern = MakePattern( szPattern, &i, 0, g_ThreadParameters.bWindowsSemantic, g_ThreadParameters.bUnicode ); if( !g_ThreadParameters.Pattern ) { // xxx MessageBox( hwndDlg, "Das angegebene Muster enthΣlt einen Fehler! Die Eingabemarke befindet sich an der Stelle, an der der Fehler entdeckt wurde! ", "Fehler!", MB_ICONSTOP ); SendMessage( GetDlgItem( hwndDlg, IDC_COMBOMUSTER ),CB_SETEDITSEL,0,MAKELPARAM( i, i ) ); SetTab( hwndDlg, 0 ); SetFocus( GetDlgItem( hwndDlg, IDC_COMBOMUSTER ) ); break; } } g_ThreadParameters.bDate = ( SendMessage( GetDlgItem( hwndDlg, IDC_DATEIDATUM ), BM_GETCHECK,0,0 ) & BST_CHECKED ) ? true : false; if( g_ThreadParameters.bDate ) { // Zwischen if( SendMessage( GetDlgItem( hwndDlg, IDC_ZWISCHEN ), BM_GETCHECK,0,0 ) & BST_CHECKED ) { if( !GetDate( hwndDlg, GetDlgItem( hwndDlg, IDC_EDITVON ), &tvon ) ) { SetTab( hwndDlg, 1 ); SetFocus( GetDlgItem( hwndDlg, IDC_EDITVON ) ); break; } if( !GetDate( hwndDlg, GetDlgItem( hwndDlg, IDC_EDITBIS ), &tbis) ) { SetTab( hwndDlg, 1 ); SetFocus( GetDlgItem( hwndDlg, IDC_EDITBIS ) ); break; } } else if( SendMessage( GetDlgItem( hwndDlg, IDC_LETZTEMONATE ), BM_GETCHECK,0,0 ) & BST_CHECKED ) { int i, v; SYSTEMTIME s, sp; TIME_ZONE_INFORMATION tz; long l; GetSystemTime( &s ); GetTimeZoneInformation( &tz ); SystemTimeToTzSpecificLocalTime( &tz, &s, &sp ); memset( &tbis, 0, sizeof( SYSTEMTIME ) ); tbis.wDay = sp.wDay; tbis.wMonth = sp.wMonth; tbis.wYear = sp.wYear; GetWindowText( GetDlgItem( hwndDlg, IDC_EDITLETZTEMONATE ), szText, sizeof( szText) ); i=0; if( !GetDigit( szText, &i, &v ) ) { MessageBox( hwndDlg, "Bitte geben Sie eine Zahl ein!", "Fehler!", MB_ICONSTOP ); SetTab( hwndDlg, 1 ); SetFocus( GetDlgItem( hwndDlg, IDC_EDITLETZTEMONATE ) ); break; } if( ( v == 0 ) || ( v > 999 ) ) { MessageBox( hwndDlg, "Bitte geben Sie einen Wert zwischen 1 und 999 ein!", "Fehler!", MB_ICONSTOP ); SetTab( hwndDlg, 1 ); SetFocus( GetDlgItem( hwndDlg, IDC_EDITLETZTEMONATE ) ); break; } CalDayToJulianDay( &l, tbis.wDay, tbis.wMonth, tbis.wYear ); JulianDayToCalDay( l, &tbis ); l -= (long)((float)v * 30.6001); JulianDayToCalDay( l, &tvon ); } else if( SendMessage( GetDlgItem( hwndDlg, IDC_LETZTETAGE ), BM_GETCHECK,0,0 ) & BST_CHECKED ) { int i, v; SYSTEMTIME s, sp; TIME_ZONE_INFORMATION tz; long l; GetSystemTime( &s ); GetTimeZoneInformation( &tz ); SystemTimeToTzSpecificLocalTime( &tz, &s, &sp ); memset( &tbis, 0, sizeof( SYSTEMTIME ) ); tbis.wDay = sp.wDay; tbis.wMonth = sp.wMonth; tbis.wYear = sp.wYear; GetWindowText( GetDlgItem( hwndDlg, IDC_EDITLETZTETAGE ), szText, sizeof( szText) ); i=0; if( !GetDigit( szText, &i, &v ) ) { MessageBox( hwndDlg, "Bitte geben Sie eine Zahl ein!", "Fehler!", MB_ICONSTOP ); SetTab( hwndDlg, 1 ); SetFocus( GetDlgItem( hwndDlg, IDC_EDITLETZTETAGE ) ); break; } if( ( v == 0 ) || ( v > 999 ) ) { MessageBox( hwndDlg, "Bitte geben Sie einen Wert zwischen 1 und 999 ein!", "Fehler!", MB_ICONSTOP ); SetTab( hwndDlg, 1 ); SetFocus( GetDlgItem( hwndDlg, IDC_EDITLETZTEMONATE ) ); break; } CalDayToJulianDay( &l, tbis.wDay, tbis.wMonth, tbis.wYear ); JulianDayToCalDay( l, &tbis ); l -= v; JulianDayToCalDay( l, &tvon ); } SystemTimeToFileTime( &tvon, &g_ThreadParameters.dateVon ); SystemTimeToFileTime( &tbis, &g_ThreadParameters.dateBis ); } GetWindowText( GetDlgItem( hwndDlg, IDC_EDITGROESSE ), szText, sizeof( szText ) ); g_ThreadParameters.bSize = FALSE; if( lstrlen( szText ) ) { int i, v; i=0; if( !GetDigit( szText, &i, &v ) ) { MessageBox( hwndDlg, "Bitte geben Sie einen positiven Wert ein!", "Fehler!", MB_ICONSTOP ); SetTab( hwndDlg, 2 ); SetFocus( GetDlgItem( hwndDlg, IDC_EDITGROESSE ) ); break; } g_ThreadParameters.bSize = TRUE; switch( SendMessage( GetDlgItem( hwndDlg, IDC_COMBOGROESSE ), CB_GETCURSEL, 0, 0 ) ) { case 0: g_ThreadParameters.bSameSize = 0; // 0 = gleich, -1, minimal, 1 = maximal break; case 1: g_ThreadParameters.bSameSize = -1; // 0 = gleich, -1, minimal, 1 = maximal break; case 2: g_ThreadParameters.bSameSize = 1; // 0 = gleich, -1, minimal, 1 = maximal break; } g_ThreadParameters.lKByte = (DWORD)v; // Gr÷▀e } ft = SendMessage( GetDlgItem( hwndDlg, IDC_COMBOTYP ), CB_GETCURSEL, 0, 0 ); g_ThreadParameters.hFileTypes = GetDlgItem( hwndDlg, IDC_LISTTYP); g_ThreadParameters.hFileTypesCombo = GetDlgItem( hwndDlg, IDC_COMBOTYP); g_ThreadParameters.hFileExtensions = GetDlgItem( hwndDlg, IDC_LISTEXTENSIONS ); GetFirstAndLastFileTypeEntry( g_ThreadParameters.hFileTypes, ft, &g_ThreadParameters.lFileTypeStart, &g_ThreadParameters.lFileTypeEnd ); lstrcpy( szTitle, "Suche nach: " ); if( ft ) { char szType[256]; SendMessage( GetDlgItem( hwndDlg, IDC_COMBOTYP ), CB_GETLBTEXT, ft, (LPARAM)szType ); lstrcat( szTitle, "Dateien vom Typ " ); lstrcat( szTitle, szType ); } if( g_ThreadParameters.szName[0] ) { if( !ft ) lstrcat( szTitle, "Dateien" ); lstrcat( szTitle, " mit Namen " ); lstrcat( szTitle, g_ThreadParameters.szName ); } else { if( !ft ) lstrcat( szTitle, " Allen Dateien" ); } SetWindowText( hwndDlg, szTitle ); CharUpperBuff( g_ThreadParameters.szName, lstrlen(g_ThreadParameters.szName) ); ListView_DeleteAllItems( GetDlgItem( hwndDlg, IDC_RESULTS ) ); EnableWindow( GetDlgItem( hwndDlg, IDC_SUCHESTARTEN ), FALSE ); EnableWindow( GetDlgItem( hwndDlg, IDC_SUCHEANHALTEN ), TRUE ); EnableWindow( GetDlgItem( hwndDlg, IDC_STATICNAME ), FALSE ); EnableWindow( GetDlgItem( hwndDlg, IDC_COMBONAME ), FALSE ); EnableWindow( GetDlgItem( hwndDlg, IDC_STATICMUSTER ), FALSE ); EnableWindow( GetDlgItem( hwndDlg, IDC_COMBOMUSTER ), FALSE ); EnableWindow( GetDlgItem( hwndDlg, IDC_STATICSUCHENIN ), FALSE ); EnableWindow( GetDlgItem( hwndDlg, IDC_COMBOSUCHENIN ), FALSE ); EnableWindow( GetDlgItem( hwndDlg, IDC_DURCHSUCHEN ), FALSE ); EnableWindow( GetDlgItem( hwndDlg, IDC_RECURSEDIR ), FALSE ); EnableWindow( GetDlgItem( hwndDlg, IDC_GROSSKLEIN ), FALSE ); EnableWindow( GetDlgItem( hwndDlg, IDC_UNICODE ), FALSE ); EnableWindow( GetDlgItem( hwndDlg, IDC_WINDOWSSYNTAX ), FALSE ); EnableWindow( GetDlgItem( hwndDlg, IDC_COMBOSUCHENIN ), FALSE ); EnableWindow( GetDlgItem( hwndDlg, IDC_DURCHSUCHEN ), FALSE ); EnableWindow( GetDlgItem( hwndDlg, IDC_RECURSEDIR ), FALSE ); EnableWindow( GetDlgItem( hwndDlg, IDC_GROSSKLEIN ), FALSE ); EnableWindow( GetDlgItem( hwndDlg, IDC_UNICODE ), FALSE ); EnableWindow( GetDlgItem( hwndDlg, IDC_ALLEDATEIEN ), FALSE ); EnableWindow( GetDlgItem( hwndDlg, IDC_DATEIDATUM ), FALSE ); EnableWindow( GetDlgItem( hwndDlg, IDC_ZWISCHEN ), FALSE ); EnableWindow( GetDlgItem( hwndDlg, IDC_EDITVON ), FALSE ); EnableWindow( GetDlgItem( hwndDlg, IDC_STATICUND), FALSE ); EnableWindow( GetDlgItem( hwndDlg, IDC_EDITBIS ), FALSE ); EnableWindow( GetDlgItem( hwndDlg, IDC_LETZTEMONATE ), FALSE ); EnableWindow( GetDlgItem( hwndDlg, IDC_EDITLETZTEMONATE ), FALSE ); EnableWindow( GetDlgItem( hwndDlg, IDC_SPINLETZTEMONATE ), FALSE ); EnableWindow( GetDlgItem( hwndDlg, IDC_STATICLETZTEMONATE ), FALSE ); EnableWindow( GetDlgItem( hwndDlg, IDC_LETZTETAGE ), FALSE ); EnableWindow( GetDlgItem( hwndDlg, IDC_EDITLETZTETAGE ), FALSE ); EnableWindow( GetDlgItem( hwndDlg, IDC_SPINLETZTETAGE ), FALSE ); EnableWindow( GetDlgItem( hwndDlg, IDC_STATICLETZTETAGE ), FALSE ); EnableWindow( GetDlgItem( hwndDlg, IDC_STATICTYP ), FALSE ); EnableWindow( GetDlgItem( hwndDlg, IDC_COMBOTYP ), FALSE ); EnableWindow( GetDlgItem( hwndDlg, IDC_STATICGROESSE ), FALSE ); EnableWindow( GetDlgItem( hwndDlg, IDC_COMBOGROESSE ), FALSE ); EnableWindow( GetDlgItem( hwndDlg, IDC_EDITGROESSE ), FALSE ); EnableWindow( GetDlgItem( hwndDlg, IDC_SPINGROESSE ), FALSE ); EnableWindow( GetDlgItem( hwndDlg, IDC_STATICKB ), FALSE ); g_ThreadParameters.hStatusBar = g_hStatusBar; SendMessage( g_hStatusBar, SB_SIMPLE, TRUE, FALSE ); ShowWindow( g_hStatusBar, SW_SHOW ); GetWindowRect( hwndDlg, &rWindow ); GetClientRect( GetDlgItem( hwndDlg, IDC_TAB ), &rTab ); g_ThreadParameters.hResults = GetDlgItem( hwndDlg, IDC_RESULTS ); if( g_iResultHeight == 0 ) g_iResultHeight = 100; SizeWindow( hwndDlg, g_iResultHeight, FALSE ); g_ThreadParameters.hwndDlg = hwndDlg; iSort[0]=SORT_NONE; iSort[1]=SORT_NONE; iSort[2]=SORT_NONE; iSort[3]=SORT_NONE; iSort[4]=SORT_NONE; iSort[5]=SORT_NONE; AddInputToCombo( hwndDlg ); g_ThreadParameters.hThread = CreateThread(NULL, 1024L*1024L, // Stacksize 1MB SearchThreadProc, (LPVOID)&g_ThreadParameters, 0, &g_ThreadParameters.dwThreadID); } break; case IDC_SUCHEANHALTEN: StopSuche( &g_ThreadParameters, TRUE ); break; case IDC_NEUESUCHE: break; case ID_ANSICHTGROSSESYMBOLE: case ID_ANSICHTKLEINESYMBOLE: case ID_ANSICHTLISTE: case ID_ANSICHTDETAILS: SetView( hwndDlg, LOWORD( wParam ) ); break; } } break; } return FALSE; } void PathRemoveFileSpec( LPSTR lpFileName ) { int i; i = lstrlen( lpFileName ); while( i ) if( lpFileName[i] == '\\' ) break; else i--; lpFileName[i]=0; } int WINAPI WinMain( HINSTANCE hInst, HINSTANCE hPrev, LPSTR lpCmd, int iCmdShow ) { char szModuleName[MAX_PATH]; g_Hinstance = hInst; GetModuleFileName( g_Hinstance, szModuleName, sizeof( szModuleName ) ); PathRemoveFileSpec( szModuleName ); lstrcat( szModuleName, "\\ctxtmenu.dll" ); // Drive-Meldungen SetRegKey( HKEY_CLASSES_ROOT, "Drive\\shellex\\ContextMenuHandlers\\WinGrepMenu", NULL, "{8909E24A-0A30-11d2-AFAA-444553540000}"); // Directory Meldungen SetRegKey( HKEY_CLASSES_ROOT, "Directory\\shellex\\ContextMenuHandlers\\WinGrepMenu", NULL, "{8909E24A-0A30-11d2-AFAA-444553540000}"); SetRegKey( HKEY_CLASSES_ROOT, "CLSID\\{8909E24A-0A30-11d2-AFAA-444553540000}", NULL, "WinGrep ContextMenu"); SetRegKey( HKEY_CLASSES_ROOT, "CLSID\\{8909E24A-0A30-11d2-AFAA-444553540000}\\InprocServer32", NULL, szModuleName ); SetRegKey( HKEY_CLASSES_ROOT, "CLSID\\{8909E24A-0A30-11d2-AFAA-444553540000}\\InprocServer32", "ThreadingModel", "Apartment"); InitCommonControls(); // Common Controls von WIndows 95 initialisieren lstrcpy( g_szDrive, lpCmd ); hArrayMutex = CreateMutex(0,false,NULL ); if( hArrayMutex ) { CoInitialize(NULL); if( RegisterViewer( hInst ) ) { if( SUCCEEDED( SHGetMalloc(&g_SHMalloc ) ) ) { if( SUCCEEDED( SHGetDesktopFolder( &g_DesktopShellFolder ) ) ) { HWND hWnd; MSG msg; hWnd = CreateDialog( hInst, MAKEINTRESOURCE(IDD_WINGREP), NULL, (DLGPROC)WinGrepProc ); ShowWindow( hWnd, SW_SHOW ); while( GetMessage( &msg, NULL,0,0) ) { if( !IsDialogMessage( hWnd, &msg ) ) { TranslateMessage( &msg ); DispatchMessage( &msg ); } } g_DesktopShellFolder->Release(); } else MessageBox( NULL, "Fehler beim Initialisieren der Shell-Objekte", "Programmabbruch", MB_OK|MB_ICONSTOP ); g_SHMalloc->Release(); } else MessageBox( NULL, "Fehler beim Initialisieren des Shell-Speicher-Objektes", "Programmabbruch", MB_OK|MB_ICONSTOP ); UnregisterViewer( hInst ); } CoUninitialize(); CloseHandle( hArrayMutex ); } else MessageBox( NULL, "Fehler beim Erzeugen des Array-Mutex!", "Programmabbruch", MB_OK|MB_ICONSTOP ); return 0; }