home *** CD-ROM | disk | FTP | other *** search
/ PC Professionell 1999 October / PCpro_1999_10.ISO / Tools / wingrep / Source / WinGrep.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  1998-06-22  |  116.6 KB  |  3,711 lines

  1. #include <windows.h>
  2. #include <commctrl.h>
  3. #include <shlobj.h>
  4. #include <math.h>
  5. #include "view.h"
  6. #include "resource.h"
  7.  
  8. // 10000 Linit
  9. HANDLE hArrayMutex;
  10. char g_szDrive[MAX_PATH];
  11.  
  12. #define SORT_NONE 0
  13. #define SORT_UP 1
  14. #define SORT_DOWN 2
  15.  
  16. int iSort[5];
  17.  
  18. #define MAX_FIND 25
  19. typedef struct tagLISTENTRY
  20. {
  21.   char szPath[MAX_PATH];
  22.   char szFind[MAX_FIND+1];
  23.   long lPath;
  24.   long lFileNameStart; // Wo beginnt der Dateiname?
  25.   long lSize;
  26.   int iType;
  27.   FILETIME Time;
  28.   long lPos;
  29.   int iIcon;
  30. } LISTENTRY;
  31.  
  32. int iNumEntries;
  33. LISTENTRY List[10000];
  34.  
  35. // Fⁿⁿge die Eingaben aus den Eingabefeldern in die Kombinationsfelder ein, falls diese noch
  36. // nciht dort verfⁿgbar sind
  37.  
  38. bool IsInCombo( LPSTR lpText, HWND hwndCombo )
  39. {       
  40.   int iCount, i, iLen1, iLen2;
  41.   char szText[256];
  42.  
  43.   iLen1 = lstrlen( lpText );
  44.   iCount = SendMessage( hwndCombo, CB_GETCOUNT, 0, 0 );
  45.   for( i = 0; i < iCount; i++ )
  46.   {
  47.     iLen2 = SendMessage( hwndCombo, CB_GETLBTEXT, i, (LPARAM)szText );
  48.     if( iLen2 != CB_ERR )
  49.       if( CompareString( LOCALE_USER_DEFAULT, 
  50.                          NORM_IGNORECASE|SORT_STRINGSORT,
  51.                          lpText, iLen1, szText, iLen2 ) == 2 ) return true;
  52.  
  53.   }
  54.   return false;
  55. }
  56.  
  57. void TestAndAddTextToCombo( HWND hwndCombo, int iMax )
  58. {
  59.   char szText[255];
  60.   int iLen;
  61.   iLen = GetWindowText( hwndCombo, szText, sizeof( szText ) );
  62.   if( iLen )
  63.   {
  64.     if( !IsInCombo( szText, hwndCombo ) )
  65.     {
  66.       SendMessage( hwndCombo, CB_INSERTSTRING, 0, (LPARAM)szText );
  67.       while( SendMessage( hwndCombo, CB_GETCOUNT, 0, 0 ) > iMax )
  68.       {
  69.         SendMessage( hwndCombo, 
  70.                      CB_DELETESTRING, 
  71.                      SendMessage( hwndCombo, CB_GETCOUNT, 0, 0 )-1, 
  72.                      0 );
  73.       }
  74.     }
  75.   }
  76. }
  77.  
  78. void AddInputToCombo( HWND hwndDlg )
  79. {
  80.   TestAndAddTextToCombo( GetDlgItem( hwndDlg, IDC_COMBONAME ), 10 );
  81.   TestAndAddTextToCombo( GetDlgItem( hwndDlg, IDC_COMBOMUSTER ), 10 );
  82.   TestAndAddTextToCombo( GetDlgItem( hwndDlg, IDC_COMBOSUCHENIN ), 10 );
  83. }
  84.  
  85. bool SetRegKey( HKEY hRoot, LPSTR lpSubKey, LPSTR lpValueName, LPSTR lpValue )
  86. {
  87.   HKEY hKeyStack[256], hKey;
  88.   int i, iKeyStart, iStack;
  89.   char szText[256];
  90.  
  91.   hKey = hRoot;
  92.   iKeyStart = 0;
  93.   iStack = 0;
  94.  
  95.   while( TRUE )
  96.   {
  97.     i = 0;
  98.     while( ( lpSubKey[i+iKeyStart] ) && ( lpSubKey[i+iKeyStart] != '\\' ) )
  99.     {
  100.       szText[i] = lpSubKey[i+iKeyStart];
  101.       i++;
  102.     }
  103.     szText[i]=0;  
  104.     if( i )
  105.     {
  106.       if( RegCreateKey( hKey, lpSubKey, &hKeyStack[iStack] ) == ERROR_SUCCESS )
  107.       {
  108.         iStack++;
  109.         iKeyStart += i + 1;
  110.       }
  111.       else
  112.         goto cleanup;
  113.     }
  114.     else
  115.     {
  116.       if( iKeyStart == 0 ) return false;  // lpSubKey = ""
  117.       break;  // Ende des Keys erreicht
  118.     }
  119.   }
  120.   
  121.   RegSetValueEx( hKeyStack[iStack-1], lpValueName, 0, REG_SZ,  (CONST BYTE*)lpValue, lstrlen(lpValue) + 1 );
  122.  
  123. cleanup:
  124.   while( iStack )
  125.   {
  126.     iStack--;
  127.     RegCloseKey( hKeyStack[iStack] );
  128.   }
  129.   return true;
  130. }
  131.  
  132. bool LoadComboFromRegistry( HWND hwndCombo, HKEY hRoot, LPSTR lpSubKey, int iMax )
  133. {
  134.   HKEY  hKeyStack[256], hKey;
  135.   int iStack = 0, i, iCount,iKeyStart;
  136.   char szText[256], szNumber[13];
  137.   DWORD dwSize, dwType;
  138.   LONG lSize;
  139.  
  140.   hKey = hRoot;
  141.   iKeyStart = 0;
  142.  
  143.   while( TRUE )
  144.   {
  145.     i = 0;
  146.     while( ( lpSubKey[i+iKeyStart] ) && ( lpSubKey[i+iKeyStart] != '\\' ) )
  147.     {
  148.       szText[i] = lpSubKey[i+iKeyStart];
  149.       i++;
  150.     }
  151.     szText[i]=0;  
  152.     if( i )
  153.     {
  154.       if( RegCreateKey( hKey, lpSubKey, &hKeyStack[iStack] ) == ERROR_SUCCESS )
  155.       {
  156.         iStack++;
  157.         iKeyStart +=i+1;
  158.       }
  159.       else
  160.         goto cleanup;
  161.     }
  162.     else
  163.     {
  164.       if( iKeyStart == 0 ) return false;  // lpSubKey = ""
  165.       break;  // Ende des Keys erreicht
  166.     }
  167.   }
  168.  
  169.   lSize = lstrlen( szNumber );
  170.   iCount = 0;
  171.   if( RegQueryValue( hKeyStack[iStack-1], NULL, szNumber, &lSize ) == ERROR_SUCCESS )
  172.     iCount = atol( szNumber );
  173.  
  174.   if( iCount > iMax ) iCount = iMax;
  175.  
  176.   SendMessage( hwndCombo, CB_RESETCONTENT, 0, 0 );
  177.   i = 0;
  178.   while( i < iCount )
  179.   {
  180.     wsprintf( szNumber,"%ld", i );
  181.  
  182.     dwSize = sizeof( szText);
  183.     dwType = REG_SZ;
  184.     if( RegQueryValueEx( hKeyStack[iStack-1], 
  185.                         szNumber, 
  186.                         NULL,
  187.                         &dwType,    
  188.                         (LPBYTE)szText, 
  189.                         &dwSize ) == ERROR_SUCCESS )
  190.       SendMessage( hwndCombo, CB_ADDSTRING, 0, (LPARAM)szText );
  191.     i++;
  192.   }
  193.  
  194.   
  195.  
  196. cleanup:
  197.   while( iStack )
  198.   {
  199.     iStack--;
  200.     RegCloseKey( hKeyStack[iStack] );
  201.   }
  202.   return true;
  203. }
  204.  
  205. bool SaveComboToRegistry( HWND hwndCombo, HKEY hRoot, LPSTR lpSubKey, int iMax )
  206. {
  207.   HKEY  hKeyStack[256], hKey;
  208.   int iStack = 0, i, iCount,iKeyStart;
  209.   char szText[256], szNumber[13];
  210.   LONG lSize;
  211.  
  212.   hKey = hRoot;
  213.   iKeyStart = 0;
  214.  
  215.   while( TRUE )
  216.   {
  217.     i = 0;
  218.     while( ( lpSubKey[i+iKeyStart] ) && ( lpSubKey[i+iKeyStart] != '\\' ) )
  219.     {
  220.       szText[i] = lpSubKey[i+iKeyStart];
  221.       i++;
  222.     }
  223.     szText[i]=0;  
  224.     if( i )
  225.     {
  226.       if( RegCreateKey( hKey, lpSubKey, &hKeyStack[iStack] ) == ERROR_SUCCESS )
  227.       {
  228.         iStack++;
  229.         iKeyStart += i+1;
  230.       }
  231.       else
  232.         goto cleanup;
  233.     }
  234.     else
  235.     {
  236.       if( iKeyStart == 0 ) return false;  // lpSubKey = ""
  237.       break;  // Ende des Keys erreicht
  238.     }
  239.   }
  240.  
  241.   lSize = lstrlen( szNumber );
  242.   if( RegQueryValue( hKeyStack[iStack-1], "", szNumber, &lSize ) == ERROR_SUCCESS )
  243.   {
  244.     iCount = atol( szNumber );
  245.     for( i = 0; i < iCount; i++ )
  246.     {
  247.       wsprintf( szNumber, "%ld", i );
  248.       RegDeleteValue( hKeyStack[iStack-1], szNumber );
  249.     }  
  250.   }
  251.  
  252.   iCount = SendMessage( hwndCombo, CB_GETCOUNT, 0, 0 );
  253.   if( iCount > iMax ) iCount = iMax;
  254.  
  255.   wsprintf( szNumber, "%ld", iCount );
  256.   RegSetValue( hKeyStack[iStack-1],
  257.               NULL, 
  258.               REG_SZ, 
  259.               (LPCTSTR)szNumber, 
  260.               lstrlen(szNumber) + 1 );
  261.         
  262.   for( i = 0; i < iCount; i++ )
  263.   {
  264.     SendMessage( hwndCombo, CB_GETLBTEXT, i, (LPARAM)szText );
  265.     wsprintf( szNumber, "%ld", i );
  266.     RegSetValueEx( hKeyStack[iStack-1], 
  267.                    szNumber, 
  268.                    0,
  269.                    REG_SZ, 
  270.                    (LPBYTE)szText, 
  271.                    lstrlen( szText ) + 1 );
  272.   }
  273.  
  274. cleanup:
  275.   while( iStack )
  276.   {
  277.     iStack--;
  278.     RegCloseKey( hKeyStack[iStack] );
  279.   }
  280.   return true;
  281. }
  282.  
  283. bool SaveEditToRegistry( HWND hwndEdit, HKEY hRoot, LPSTR lpSubKey  )
  284. {
  285.   HKEY  hKeyStack[256], hKey;
  286.   int iStack = 0, i, iKeyStart;
  287.   char szText[256];
  288.  
  289.   hKey = hRoot;
  290.   iKeyStart = 0;
  291.   while( TRUE )
  292.   {
  293.     i = 0;
  294.     while( ( lpSubKey[i+iKeyStart] ) && ( lpSubKey[i+iKeyStart] != '\\' ) )
  295.     {
  296.       szText[i] = lpSubKey[i+iKeyStart];
  297.       i++;
  298.     }
  299.     szText[i]=0;  
  300.     if( i )
  301.     {
  302.       if( RegCreateKey( hKey, lpSubKey, &hKeyStack[iStack] ) == ERROR_SUCCESS )
  303.       {
  304.         iStack++;
  305.         iKeyStart +=i+1;
  306.       }
  307.       else
  308.         goto cleanup;
  309.     }
  310.     else
  311.     {
  312.       if( iKeyStart == 0 ) return false;  // lpSubKey = ""
  313.       break;  // Ende des Keys erreicht
  314.     }
  315.   }
  316.  
  317.   RegDeleteValue( hKeyStack[iStack-1], "" );
  318.   GetWindowText( hwndEdit, szText, sizeof(szText) );
  319.   RegSetValueEx( hKeyStack[iStack-1], 
  320.                  "", 
  321.                  0, 
  322.                  REG_SZ, 
  323.                  (LPBYTE)szText, 
  324.                  lstrlen( szText ) + 1 );
  325.  
  326. cleanup:
  327.   while( iStack )
  328.   {
  329.     iStack--;
  330.     RegCloseKey( hKeyStack[iStack] );
  331.   }
  332.   return true;
  333. }
  334.  
  335.  
  336. bool LoadEditFromRegistry( HWND hwndEdit, HKEY hRoot, LPSTR lpSubKey  )
  337. {
  338.   HKEY  hKeyStack[256], hKey;
  339.   int iStack = 0, i, iKeyStart;
  340.   char szText[256];
  341.   LONG lSize;
  342.  
  343.   hKey = hRoot;
  344.   iKeyStart = 0;
  345.   while( TRUE )
  346.   {
  347.     i = 0;
  348.     while( ( lpSubKey[i+iKeyStart] ) && ( lpSubKey[i+iKeyStart] != '\\' ) )
  349.     {
  350.       szText[i] = lpSubKey[i+iKeyStart];
  351.       i++;
  352.     }
  353.     szText[i]=0;  
  354.     if( i )
  355.     {
  356.       if( RegCreateKey( hKey, lpSubKey, &hKeyStack[iStack] ) == ERROR_SUCCESS )
  357.       {
  358.         iStack++;
  359.         iKeyStart +=i+1;
  360.       }
  361.       else
  362.         goto cleanup;
  363.     }
  364.     else
  365.     {
  366.       if( iKeyStart == 0 ) return false;  // lpSubKey = ""
  367.       break;  // Ende des Keys erreicht
  368.     }
  369.   }
  370.  
  371.   lSize = sizeof( szText );
  372.   RegQueryValue( hKeyStack[iStack-1], "", szText, &lSize );
  373.   SetWindowText( hwndEdit, szText );
  374.  
  375. cleanup:
  376.   while( iStack )
  377.   {
  378.     iStack--;
  379.     RegCloseKey( hKeyStack[iStack] );
  380.   }
  381.   return true;
  382. }
  383.  
  384.  
  385. bool SaveCheckboxToRegistry( HWND hwndCheckbox, HKEY hRoot, LPSTR lpSubKey  )
  386. {
  387.   HKEY  hKeyStack[256], hKey;
  388.   int iStack = 0, i, iKeyStart;
  389.   DWORD dwVal;
  390.   char szText[256];
  391.   
  392.   
  393.   hKey = hRoot;
  394.   iKeyStart = 0;
  395.   while( TRUE )
  396.   {
  397.     i = 0;
  398.     while( ( lpSubKey[i+iKeyStart] ) && ( lpSubKey[i+iKeyStart] != '\\' ) )
  399.     {
  400.       szText[i] = lpSubKey[i+iKeyStart];
  401.       i++;
  402.     }
  403.     szText[i]=0;  
  404.     if( i )
  405.     {
  406.       if( RegCreateKey( hKey, lpSubKey, &hKeyStack[iStack] ) == ERROR_SUCCESS )
  407.       {
  408.         iStack++;
  409.         iKeyStart +=i+1;
  410.       }
  411.       else
  412.         goto cleanup;
  413.     }
  414.     else
  415.     {
  416.       if( iKeyStart == 0 ) return false;  // lpSubKey = ""
  417.       break;  // Ende des Keys erreicht
  418.     }
  419.   }
  420.  
  421.   RegDeleteValue( hKeyStack[iStack-1], "" );
  422.   dwVal = SendMessage( hwndCheckbox, BM_GETCHECK,0,0 ); 
  423.   wsprintf(szText, "%ld", dwVal );
  424.   RegSetValueEx( hKeyStack[iStack-1], 
  425.                  "", 
  426.                  0, 
  427.                  REG_SZ, 
  428.                  (LPBYTE)szText, 
  429.                  lstrlen(szText)+1);
  430.  
  431. cleanup:
  432.   while( iStack )
  433.   {
  434.     iStack--;
  435.     RegCloseKey( hKeyStack[iStack] );
  436.   }
  437.   return true;
  438. }
  439.  
  440.  
  441. bool LoadCheckboxFromRegistry( HWND hwndCheckbox, HKEY hRoot, LPSTR lpSubKey  )
  442. {
  443.   HKEY  hKeyStack[256], hKey;
  444.   int iStack = 0, i, iKeyStart;
  445.   char szText[256];
  446.   LONG lSize;
  447.  
  448.   hKey = hRoot;
  449.   iKeyStart = 0;
  450.   while( TRUE )
  451.   {
  452.     i = 0;
  453.     while( ( lpSubKey[i+iKeyStart] ) && ( lpSubKey[i+iKeyStart] != '\\' ) )
  454.     {
  455.       szText[i] = lpSubKey[i+iKeyStart];
  456.       i++;
  457.     }
  458.     szText[i]=0;  
  459.     if( i )
  460.     {
  461.       if( RegCreateKey( hKey, lpSubKey, &hKeyStack[iStack] ) == ERROR_SUCCESS )
  462.       {
  463.         iStack++;
  464.         iKeyStart +=i+1;
  465.       }
  466.       else
  467.         goto cleanup;
  468.     }
  469.     else
  470.     {
  471.       if( iKeyStart == 0 ) return false;  // lpSubKey = ""
  472.       break;  // Ende des Keys erreicht
  473.     }
  474.   }
  475.  
  476.   lSize = sizeof( szText );
  477.   RegQueryValue( hKeyStack[iStack-1], "", szText, &lSize );
  478.   SendMessage( hwndCheckbox, BM_SETCHECK,atol(szText),0 ); 
  479.  
  480. cleanup:
  481.   while( iStack )
  482.   {
  483.     iStack--;
  484.     RegCloseKey( hKeyStack[iStack] );
  485.   }
  486.   return true;
  487. }
  488.  
  489.  
  490. void SaveParameters( HWND hwndDlg )
  491. {
  492.   SaveComboToRegistry( GetDlgItem( hwndDlg, IDC_COMBONAME ), HKEY_LOCAL_MACHINE, "SOFTWARE\\PCPRO\\WINGREP\\NAME", 10);
  493.   SaveComboToRegistry( GetDlgItem( hwndDlg, IDC_COMBOMUSTER ), HKEY_LOCAL_MACHINE, "SOFTWARE\\PCPRO\\WINGREP\\MUSTER", 10);
  494.   SaveComboToRegistry( GetDlgItem( hwndDlg, IDC_COMBOSUCHENIN ), HKEY_LOCAL_MACHINE, "SOFTWARE\\PCPRO\\WINGREP\\SUCHENIN", 10);
  495.  
  496.   SaveEditToRegistry( GetDlgItem( hwndDlg, IDC_EDITBIS ), HKEY_LOCAL_MACHINE, "SOFTWARE\\PCPRO\\WINGREP\\BIS");
  497.   SaveEditToRegistry( GetDlgItem( hwndDlg, IDC_EDITVON ), HKEY_LOCAL_MACHINE, "SOFTWARE\\PCPRO\\WINGREP\\VON");
  498.   SaveEditToRegistry( GetDlgItem( hwndDlg, IDC_EDITLETZTEMONATE ), HKEY_LOCAL_MACHINE, "SOFTWARE\\PCPRO\\WINGREP\\LETZTETAGE");
  499.   SaveEditToRegistry( GetDlgItem( hwndDlg, IDC_EDITLETZTETAGE ), HKEY_LOCAL_MACHINE, "SOFTWARE\\PCPRO\\WINGREP\\LETZTEMONATE");
  500.   SaveEditToRegistry( GetDlgItem( hwndDlg, IDC_EDITGROESSE ), HKEY_LOCAL_MACHINE, "SOFTWARE\\PCPRO\\WINGREP\\GROESSE");
  501.  
  502.   SaveCheckboxToRegistry( GetDlgItem( hwndDlg, IDC_RECURSEDIR ),HKEY_LOCAL_MACHINE, "SOFTWARE\\PCPRO\\WINGREP\\RECURSEDIR" );
  503.     SaveCheckboxToRegistry( GetDlgItem( hwndDlg, IDC_GROSSKLEIN ),HKEY_LOCAL_MACHINE, "SOFTWARE\\PCPRO\\WINGREP\\GROSSKLEIN" );
  504.     SaveCheckboxToRegistry( GetDlgItem( hwndDlg, IDC_UNICODE ), HKEY_LOCAL_MACHINE, "SOFTWARE\\PCPRO\\WINGREP\\UNICODE"  );
  505.   SaveCheckboxToRegistry( GetDlgItem( hwndDlg, IDC_WINDOWSSYNTAX ),HKEY_LOCAL_MACHINE, "SOFTWARE\\PCPRO\\WINGREP\\WINSYNTAX" );
  506. }
  507.  
  508. void LoadParameters( HWND hwndDlg )
  509. {
  510.   LoadComboFromRegistry( GetDlgItem( hwndDlg, IDC_COMBONAME ), HKEY_LOCAL_MACHINE, "SOFTWARE\\PCPRO\\WINGREP\\NAME", 10);
  511.   LoadComboFromRegistry( GetDlgItem( hwndDlg, IDC_COMBOMUSTER ), HKEY_LOCAL_MACHINE, "SOFTWARE\\PCPRO\\WINGREP\\MUSTER", 10);
  512.   LoadComboFromRegistry( GetDlgItem( hwndDlg, IDC_COMBOSUCHENIN ), HKEY_LOCAL_MACHINE, "SOFTWARE\\PCPRO\\WINGREP\\SUCHENIN", 10);
  513.  
  514.   LoadEditFromRegistry( GetDlgItem( hwndDlg, IDC_EDITBIS ), HKEY_LOCAL_MACHINE, "SOFTWARE\\PCPRO\\WINGREP\\BIS");
  515.   LoadEditFromRegistry( GetDlgItem( hwndDlg, IDC_EDITVON ), HKEY_LOCAL_MACHINE, "SOFTWARE\\PCPRO\\WINGREP\\VON");
  516.   LoadEditFromRegistry( GetDlgItem( hwndDlg, IDC_EDITLETZTEMONATE ), HKEY_LOCAL_MACHINE, "SOFTWARE\\PCPRO\\WINGREP\\LETZTETAGE");
  517.   LoadEditFromRegistry( GetDlgItem( hwndDlg, IDC_EDITLETZTETAGE ), HKEY_LOCAL_MACHINE, "SOFTWARE\\PCPRO\\WINGREP\\LETZTEMONATE");
  518.   LoadEditFromRegistry( GetDlgItem( hwndDlg, IDC_EDITGROESSE ), HKEY_LOCAL_MACHINE, "SOFTWARE\\PCPRO\\WINGREP\\GROESSE");
  519.  
  520.   LoadCheckboxFromRegistry( GetDlgItem( hwndDlg, IDC_RECURSEDIR ),HKEY_LOCAL_MACHINE, "SOFTWARE\\PCPRO\\WINGREP\\RECURSEDIR" );
  521.     LoadCheckboxFromRegistry( GetDlgItem( hwndDlg, IDC_GROSSKLEIN ),HKEY_LOCAL_MACHINE, "SOFTWARE\\PCPRO\\WINGREP\\GROSSKLEIN" );
  522.     LoadCheckboxFromRegistry( GetDlgItem( hwndDlg, IDC_UNICODE ),HKEY_LOCAL_MACHINE, "SOFTWARE\\PCPRO\\WINGREP\\UNICODE" );
  523.   LoadCheckboxFromRegistry( GetDlgItem( hwndDlg, IDC_WINDOWSSYNTAX ),HKEY_LOCAL_MACHINE, "SOFTWARE\\PCPRO\\WINGREP\\WINSYNTAX" );
  524. }
  525.  
  526. int GetTypeString( HWND hFileTypesCombo, LISTENTRY *le, LPSTR lpText )
  527. {
  528.   lpText[0]=0;
  529.   if( le->iType >= 0 )
  530.     return SendMessage( hFileTypesCombo, CB_GETLBTEXT, le->iType, (LPARAM)lpText );
  531.   else
  532.   {
  533.     int i,j;
  534.     
  535.     i = lstrlen( le->szPath )-1;
  536.     j=0;
  537.     while( i > 0 )
  538.     {
  539.       if( le->szPath[i]=='.' )
  540.       {
  541.         lstrcpy( lpText, &le->szPath[i+1] );
  542.         CharUpperBuff( lpText, j );
  543.         lstrcat( lpText, " Datei");
  544.         return  j + 6;
  545.       }
  546.       i--;
  547.       j++;
  548.     }
  549.   }
  550.  
  551.   return 0;
  552. }
  553.  
  554. void _SortArray( long l, long r, int iKey, int iDir, HWND hFileTypesCombo )
  555. {
  556.   long i,j;
  557.   LISTENTRY x,w;
  558.   static long lTypeString1, lTypeString2;
  559.   static char szTypeString1[ MAX_PATH * 2 ];
  560.   static char szTypeString2[ MAX_PATH * 2 ];
  561.  
  562.   i = l;
  563.   j = r;
  564.  
  565.   x = List[(l+r)/2];
  566.   
  567.   if( iKey == 3 ) // Bei Sortierung nach Typ besteht das Sorierkriterium aus
  568.   {               // dem Dateityp gefolgt vom Dateinamen
  569.     lTypeString1 = GetTypeString( hFileTypesCombo, &x, szTypeString1 );
  570.     lstrcat( szTypeString1, x.szPath );
  571.     lTypeString1 += x.lPath;
  572.   }
  573.  
  574.   do
  575.   {
  576.     switch( iKey )
  577.     {
  578.       case 0: // Dateiname
  579.       {
  580.         if( iDir == SORT_UP )
  581.         {
  582.           while( CompareString( LOCALE_USER_DEFAULT, 
  583.                                 NORM_IGNORECASE|SORT_STRINGSORT,
  584.                                 &List[i].szPath[List[i].lFileNameStart], 
  585.                                 List[i].lPath-List[i].lFileNameStart, 
  586.                                 &x.szPath[x.lFileNameStart], 
  587.                                 x.lPath-x.lFileNameStart ) == 1 ) i++;
  588.  
  589.           while( CompareString( LOCALE_USER_DEFAULT, 
  590.                                 NORM_IGNORECASE|SORT_STRINGSORT,
  591.                                 &List[j].szPath[List[j].lFileNameStart], 
  592.                                 List[j].lPath-List[j].lFileNameStart, 
  593.                                 &x.szPath[x.lFileNameStart], 
  594.                                 x.lPath-x.lFileNameStart ) == 3 ) j--;
  595.         }
  596.         else
  597.         {
  598.           while( CompareString( LOCALE_USER_DEFAULT, 
  599.                                 NORM_IGNORECASE|SORT_STRINGSORT,
  600.                                 &List[i].szPath[List[i].lFileNameStart], 
  601.                                 List[i].lPath-List[i].lFileNameStart, 
  602.                                 &x.szPath[x.lFileNameStart], 
  603.                                 x.lPath-x.lFileNameStart ) == 3 ) i++;
  604.  
  605.           while( CompareString( LOCALE_USER_DEFAULT, 
  606.                                 NORM_IGNORECASE|SORT_STRINGSORT,
  607.                                 &List[j].szPath[List[j].lFileNameStart], 
  608.                                 List[j].lPath-List[j].lFileNameStart, 
  609.                                 &x.szPath[x.lFileNameStart], 
  610.                                 x.lPath-x.lFileNameStart ) == 1 ) j--;
  611.         }
  612.       }
  613.       break;
  614.  
  615.       case 1: // Pfad
  616.       {
  617.         if( iDir == SORT_UP )
  618.         {
  619.           while( CompareString( LOCALE_USER_DEFAULT, 
  620.                                 NORM_IGNORECASE|SORT_STRINGSORT,
  621.                                 List[i].szPath, 
  622.                                 List[i].lPath, 
  623.                                 x.szPath, 
  624.                                 x.lPath ) == 1 ) i++;
  625.  
  626.           while( CompareString( LOCALE_USER_DEFAULT, 
  627.                                 NORM_IGNORECASE|SORT_STRINGSORT,
  628.                                 List[j].szPath, 
  629.                                 List[j].lPath, 
  630.                                 x.szPath, 
  631.                                 x.lPath ) == 3 ) j--;
  632.         }
  633.         else
  634.         {
  635.           while( CompareString( LOCALE_USER_DEFAULT, 
  636.                                 NORM_IGNORECASE|SORT_STRINGSORT,
  637.                                 List[i].szPath, 
  638.                                 List[i].lPath, 
  639.                                 x.szPath, 
  640.                                 x.lPath ) == 3 ) i++;
  641.  
  642.           while( CompareString( LOCALE_USER_DEFAULT, 
  643.                                 NORM_IGNORECASE|SORT_STRINGSORT,
  644.                                 List[j].szPath, 
  645.                                 List[j].lPath, 
  646.                                 x.szPath, 
  647.                                 x.lPath ) == 1 ) j--;
  648.         }
  649.       }
  650.       break;
  651.       case 2: // Groesse
  652.       {
  653.         if( iDir == SORT_UP )
  654.         {
  655.           while( List[i].lSize < x.lSize ) i++;
  656.           while( List[j].lSize > x.lSize ) j--;
  657.         }
  658.         else
  659.         {
  660.           while( List[i].lSize > x.lSize ) i++;
  661.           while( List[j].lSize < x.lSize ) j--;
  662.         }
  663.       }
  664.       break;
  665.       case 3: // Type
  666.       {
  667.         if( iDir == SORT_UP )
  668.         {
  669.           while( TRUE )
  670.           {
  671.             lTypeString2 = GetTypeString( hFileTypesCombo, &List[i], szTypeString2 );
  672.             lstrcat( szTypeString2, List[i].szPath );
  673.             lTypeString2 += List[i].lPath;
  674.  
  675.             if( CompareString( LOCALE_USER_DEFAULT, 
  676.                                NORM_IGNORECASE|SORT_STRINGSORT,
  677.                                szTypeString1, 
  678.                                lTypeString1, 
  679.                                szTypeString2, 
  680.                                lTypeString2 ) == 1 ) i++;
  681.             else
  682.               break;
  683.           }
  684.  
  685.           while( TRUE )
  686.           {
  687.             lTypeString2 = GetTypeString( hFileTypesCombo, &List[j], szTypeString2 );
  688.             lstrcat( szTypeString2, List[j].szPath );
  689.             lTypeString2 += List[j].lPath;
  690.  
  691.             if( CompareString( LOCALE_USER_DEFAULT, 
  692.                                NORM_IGNORECASE|SORT_STRINGSORT,
  693.                                szTypeString1, 
  694.                                lTypeString1, 
  695.                                szTypeString2, 
  696.                                lTypeString2 ) == 3 ) j--;
  697.             else
  698.               break;
  699.           }
  700.         }
  701.         else
  702.         {
  703.           while( TRUE )
  704.           {
  705.             lTypeString2 = GetTypeString( hFileTypesCombo, &List[i], szTypeString2 );
  706.             lstrcat( szTypeString2, List[i].szPath );
  707.             lTypeString2 += List[i].lPath;
  708.  
  709.             if( CompareString( LOCALE_USER_DEFAULT, 
  710.                                NORM_IGNORECASE|SORT_STRINGSORT,
  711.                                szTypeString1, 
  712.                                lTypeString1, 
  713.                                szTypeString2, 
  714.                                lTypeString2 ) == 3 ) i++;
  715.             else
  716.               break;
  717.           }
  718.  
  719.           while( TRUE )
  720.           {
  721.             lTypeString2 = GetTypeString( hFileTypesCombo, &List[j], szTypeString2 );
  722.             lstrcat( szTypeString2, List[j].szPath );
  723.             lTypeString2 += List[j].lPath;
  724.  
  725.             if( CompareString( LOCALE_USER_DEFAULT, 
  726.                                NORM_IGNORECASE|SORT_STRINGSORT,
  727.                                szTypeString1, 
  728.                                lTypeString1, 
  729.                                szTypeString2, 
  730.                                lTypeString2 ) == 1 ) j--;
  731.             else
  732.               break;
  733.           }
  734.         }
  735.       }
  736.       break;
  737.       case 4:
  738.       {
  739.         if( iDir == SORT_UP )
  740.         {
  741.           while( CompareFileTime(&List[i].Time, &x.Time ) < 0 ) i++;
  742.           while( CompareFileTime(&List[j].Time, &x.Time ) > 0 ) j--;
  743.         }
  744.         else
  745.         {
  746.           while( CompareFileTime(&List[i].Time, &x.Time ) > 0 ) i++;
  747.           while( CompareFileTime(&List[j].Time, &x.Time ) < 0 ) j--;
  748.         }
  749.       }
  750.       break;
  751.  
  752.     } 
  753.     if( i <= j )
  754.     {
  755.       w = List[i];
  756.       List[i]=List[j];
  757.       List[j]=w;
  758.       i++;
  759.       j--;
  760.     }
  761.   }
  762.   while( i <= j );
  763.  
  764.   if( l < j ) _SortArray( l,j,iKey,iDir,hFileTypesCombo );
  765.   if( i < r ) _SortArray( i,r,iKey,iDir,hFileTypesCombo );
  766. }
  767.  
  768. void SortArray( long l, long r, int iKey, int iDir, HWND hFileTypesCombo )
  769. {
  770.   WaitForSingleObject( hArrayMutex, INFINITE );
  771.   _SortArray( l, r, iKey, iDir, hFileTypesCombo );
  772.   ReleaseMutex( hArrayMutex );
  773. }
  774.  
  775. #define ID_FIRSTCONTEXTMENU 9899
  776. #define ID_LASTCONTEXTMENU 9999
  777.  
  778. // Registry 10 Muster
  779. // Registry 10 Directories
  780.  
  781. HINSTANCE     g_Hinstance;
  782. LPSHELLFOLDER g_DesktopShellFolder;
  783. LPMALLOC      g_SHMalloc;
  784. int           g_iResultHeight;   // H÷he der Result-Listbox
  785. HANDLE        g_hStopSempahore;  // Mutex zum Beenden des Thread
  786.  
  787. HWND g_hStatusBar;
  788. HIMAGELIST g_hImageListIcon; 
  789. HIMAGELIST g_hImageListSmallIcon; 
  790.  
  791. #define FREEANDEXIT { \
  792.                         if( lpAct ) delete lpAct; \
  793.                         if( lpFirst ) delete lpFirst; \
  794.                         return NULL; \
  795.                     }
  796.  
  797. // Das folgende Makro erzeugt eine Instanz der in type angegebenen 
  798. // Klasse. SchlΣgt das fehl, wird der saugbere ausstirg vorbereitet
  799. #define CREATENODETYPE(type)    {  \
  800.                                     lpAct = new type;\
  801.                                     if( !lpAct )     \
  802.                                         FREEANDEXIT \
  803.                                 }
  804.  
  805.  
  806. void GetFirstAndLastFileTypeEntry( HWND hWnd, long lType, long *lStart, long *lEnd )
  807. {
  808.   char szMask[10];
  809.   char szFind[256];
  810.   int i;
  811.  
  812.   *lStart = 0;
  813.   *lEnd = -1;
  814.  
  815.   wsprintf( szMask, "%06ld", lType );
  816.  
  817.   i = SendMessage( hWnd, LB_FINDSTRING, -1, (LPARAM)szMask );
  818.   if( i != CB_ERR )
  819.   {
  820.     while( (i-1) >= 0 )
  821.     {
  822.       SendMessage( hWnd, LB_GETTEXT, i-1, (LPARAM)szFind );    
  823.       if( ( szFind[5] != szMask[5] ) ||
  824.           ( szFind[4] != szMask[4] ) ||
  825.           ( szFind[3] != szMask[3] ) ||
  826.           ( szFind[2] != szMask[2] ) ||
  827.           ( szFind[1] != szMask[1] ) ||
  828.           ( szFind[0] != szMask[0] ) )
  829.             break;
  830.         i--;
  831.     }
  832.     *lStart = i;
  833.  
  834.     while( i < SendMessage( hWnd, LB_GETCOUNT, 0, 0 ) )
  835.     {
  836.       SendMessage( hWnd, LB_GETTEXT, i, (LPARAM)szFind );    
  837.       if( ( szFind[5] != szMask[5] ) ||
  838.           ( szFind[4] != szMask[4] ) ||
  839.           ( szFind[3] != szMask[3] ) ||
  840.           ( szFind[2] != szMask[2] ) ||
  841.           ( szFind[1] != szMask[1] ) ||
  842.           ( szFind[0] != szMask[0] ) )
  843.             break;
  844.       i++;
  845.     }
  846.     *lEnd = i;
  847.   }
  848. }
  849.  
  850. void AddFileTypesToCombo( HWND hWndCombo, HWND hWndList, HWND hWndExtensions )
  851. {
  852.   DWORD dwIndex;
  853.   long lSize;
  854.   char szExtension[MAX_PATH+1];
  855.   char szClass[MAX_PATH+1];
  856.   char szDisplayName[MAX_PATH+1];
  857.  
  858.   // Zuerst alle Anwendungstypen einfⁿgen
  859.   dwIndex = 0;
  860.   while( RegEnumKey( HKEY_CLASSES_ROOT, dwIndex++,szExtension, MAX_PATH+1 ) == ERROR_SUCCESS )
  861.   {
  862.     if( szExtension[0]=='.' )
  863.     {
  864.       lSize = sizeof( szClass );
  865.       if( RegQueryValue(HKEY_CLASSES_ROOT, szExtension, szClass, &lSize ) == ERROR_SUCCESS )
  866.       {
  867.         lSize = sizeof( szDisplayName );
  868.         if( RegQueryValue(HKEY_CLASSES_ROOT, szClass, szDisplayName, &lSize ) == ERROR_SUCCESS )
  869.         {
  870.           if( szDisplayName[0] )
  871.             if( SendMessage( hWndCombo, CB_FINDSTRINGEXACT, -1, (LPARAM) szDisplayName ) == CB_ERR )
  872.               SendMessage( hWndCombo, CB_ADDSTRING, 0, (LPARAM) szDisplayName );
  873.         }
  874.       } 
  875.     }
  876.   }
  877.   SendMessage( hWndCombo, CB_INSERTSTRING, 0, (LPARAM) "Alle Dateien und Ordner");
  878.   SendMessage( hWndCombo, CB_SETCURSEL, 0, 0L);
  879.  
  880.   dwIndex = 0;
  881.   // Listbox mit Dateiendungen erzeugen
  882.   while( RegEnumKey( HKEY_CLASSES_ROOT, dwIndex++,szExtension, MAX_PATH+1 ) == ERROR_SUCCESS )
  883.   {
  884.     if( szExtension[0]=='.' )
  885.     {
  886.       lSize = sizeof( szClass );
  887.       if( RegQueryValue(HKEY_CLASSES_ROOT, szExtension, szClass, &lSize ) == ERROR_SUCCESS )
  888.       {
  889.         lSize = sizeof( szDisplayName );
  890.         if( RegQueryValue(HKEY_CLASSES_ROOT, szClass, szDisplayName, &lSize ) == ERROR_SUCCESS )
  891.         {
  892.           if( szDisplayName[0] )
  893.           {
  894.             int i;
  895.             i = SendMessage( hWndCombo, CB_FINDSTRINGEXACT, -1, (LPARAM) szDisplayName );
  896.             if( i != CB_ERR )
  897.             {
  898.               int k;
  899.               wsprintf( szDisplayName, "%06ld %s", i, szExtension );
  900.               SendMessage( hWndList, LB_ADDSTRING, 0, (LPARAM) szDisplayName );
  901.  
  902.               CharUpperBuff(szExtension, lstrlen(szExtension));
  903.               k = SendMessage( hWndExtensions, LB_ADDSTRING, 0, (LPARAM) szExtension );
  904.               if( k != LB_ERR )
  905.                 SendMessage( hWndExtensions, LB_SETITEMDATA, k, i);
  906.             }
  907.           }
  908.         }
  909.       } 
  910.     }
  911.   }
  912. }
  913.  
  914. void ShellFree( LPVOID lpMem )
  915. {
  916.   g_SHMalloc->Free( lpMem );
  917. }
  918.  
  919. LPITEMIDLIST GetNextItem (LPITEMIDLIST pidl)
  920. {
  921.   USHORT nLen;
  922.   if ((nLen = pidl->mkid.cb) == 0)
  923.     return NULL;
  924.   return (LPITEMIDLIST) (((LPBYTE) pidl) + nLen);
  925. }
  926.  
  927. UINT GetItemCount (LPITEMIDLIST pidl)
  928. {
  929.   USHORT nLen;
  930.   UINT nCount;
  931.  
  932.   nCount = 0;
  933.   while ((nLen = pidl->mkid.cb) != 0) 
  934.   {
  935.     pidl = GetNextItem (pidl);
  936.     nCount++;
  937.   }
  938.   return nCount;
  939. }
  940.  
  941. LPITEMIDLIST DuplicateItem(LPITEMIDLIST pidl)
  942. {
  943.   USHORT nLen;
  944.   LPITEMIDLIST pidlNew;
  945.  
  946.   nLen = pidl->mkid.cb;
  947.   if (nLen == 0)
  948.     return NULL;
  949.  
  950.   pidlNew = (LPITEMIDLIST) g_SHMalloc->Alloc (nLen + sizeof (USHORT));
  951.   if (pidlNew == NULL)
  952.     return NULL;
  953.  
  954.   CopyMemory (pidlNew, pidl, nLen);
  955.   *((USHORT*) (((LPBYTE) pidlNew) + nLen)) = 0;
  956.  
  957.   return pidlNew;
  958. }
  959.  
  960. void CopyStrRet(LPITEMIDLIST pidl, LPSTRRET lpStr, LPSTR lpPath) 
  961.   switch (lpStr->uType) 
  962.   {
  963.     case STRRET_WSTR: 
  964.     {
  965.       int cch;
  966.       cch = WideCharToMultiByte( CP_ACP, 
  967.                                  0, 
  968.                                  lpStr->pOleStr, 
  969.                                  -1, 
  970.                                  NULL, 
  971.                                  0, 
  972.                                  NULL, 
  973.                                  NULL); 
  974.       WideCharToMultiByte( CP_ACP, 
  975.                            0, 
  976.                            lpStr->pOleStr, 
  977.                            -1, 
  978.                            lpPath, 
  979.                            cch, 
  980.                            NULL, 
  981.                            NULL); 
  982.       }
  983.       break; 
  984.       case STRRET_OFFSET: 
  985.       {
  986.         int i;
  987.         LPSTR lpSrc = ((char *) pidl) + lpStr->uOffset;
  988.         i = 0;
  989.         while( lpSrc[i] )
  990.           lpPath[i]=lpSrc[i++];
  991.         lpPath[i]=0;
  992.       }
  993.       break; 
  994.       case STRRET_CSTR: 
  995.       {
  996.         int i;
  997.         LPSTR lpSrc = lpStr->cStr;
  998.         i = 0;
  999.         while( lpSrc[i] )
  1000.           lpPath[i]=lpSrc[i++];
  1001.         lpPath[i]=0;
  1002.       }
  1003.    } 
  1004. }
  1005.  
  1006. int GetDisplayNameOfPidl( LPITEMIDLIST pidl, LPSTR lpResult )
  1007. {
  1008.   LPITEMIDLIST p;
  1009.   LPSHELLFOLDER pFolder; 
  1010.  
  1011.   pFolder = g_DesktopShellFolder;
  1012.   pFolder->AddRef();
  1013.   
  1014.   lpResult[0]=0;
  1015.  
  1016.   for (p = pidl; pidl != NULL; p = GetNextItem(p)) 
  1017.   { 
  1018.     STRRET sName; 
  1019.     LPSHELLFOLDER pSubFolder; 
  1020.     LPITEMIDLIST pidlCopy; 
  1021.  
  1022.     if ((pidlCopy = DuplicateItem(pidl)) == NULL) 
  1023.       break; 
  1024.  
  1025.     if (SUCCEEDED(pFolder->GetDisplayNameOf( pidlCopy, 
  1026.                                              SHGDN_INFOLDER, 
  1027.                                              &sName))) 
  1028.       CopyStrRet(pidlCopy, &sName, &lpResult[lstrlen(lpResult)]); 
  1029.  
  1030.     if (!SUCCEEDED(pFolder->BindToObject( pidlCopy, 
  1031.                                           NULL, 
  1032.                                           IID_IShellFolder, 
  1033.                                           (LPVOID*)&pSubFolder))) 
  1034.     { 
  1035.       //ShellFree( pidlCopy); 
  1036.       //break; 
  1037.     } 
  1038.     else
  1039.     {
  1040.       pFolder->Release();
  1041.       pFolder = pSubFolder; 
  1042.     }
  1043.     ShellFree( pidlCopy); 
  1044.   } 
  1045.   pFolder->Release(); 
  1046.   return lstrlen( lpResult );
  1047.  
  1048. BOOL DoExplorerMenu (HWND hwnd, LPCTSTR pszPath, long lFilePos, POINT point)
  1049. {
  1050.   LPSHELLFOLDER psfFolder, psfNextFolder;
  1051.   LPITEMIDLIST pidlMain, pidlItem, pidlNextItem, *ppidl;
  1052.   LPCONTEXTMENU pContextMenu;
  1053.   CMINVOKECOMMANDINFO ici;
  1054.   ULONG ulCount, ulAttr;
  1055.   TCHAR tchPath[MAX_PATH];
  1056.   WCHAR wchPath[MAX_PATH];    
  1057.   UINT nCount, nCmd;
  1058.   BOOL bResult;
  1059.   HMENU hMenu;
  1060.  
  1061.   GetFullPathName(pszPath,sizeof(tchPath)/sizeof(TCHAR),tchPath,NULL);
  1062.  
  1063.   if (IsTextUnicode (tchPath, lstrlen (tchPath), NULL))
  1064.    lstrcpy ((char *) wchPath, tchPath);
  1065.   else
  1066.    MultiByteToWideChar (CP_ACP, 0, pszPath, -1, wchPath, sizeof (wchPath) / sizeof (WCHAR));
  1067.  
  1068.   bResult = FALSE;
  1069.   psfFolder = g_DesktopShellFolder;
  1070.   
  1071.   psfFolder->AddRef();
  1072.   if (SUCCEEDED (psfFolder->ParseDisplayName (hwnd,
  1073.                                               NULL, 
  1074.                                               wchPath, 
  1075.                                               &ulCount, 
  1076.                                               &pidlMain, 
  1077.                                               &ulAttr)) && 
  1078.                                               (pidlMain != NULL)) 
  1079.   {
  1080.     if (nCount = GetItemCount (pidlMain)) 
  1081.     { 
  1082.       pidlItem = pidlMain;
  1083.  
  1084.       while (--nCount) 
  1085.       {
  1086.         pidlNextItem = DuplicateItem (pidlItem);
  1087.         if (pidlNextItem == NULL) 
  1088.         {
  1089.           ShellFree(pidlMain);
  1090.           psfFolder->Release();
  1091.           return bResult;
  1092.         }
  1093.  
  1094.         if(FAILED(psfFolder->BindToObject(pidlNextItem, NULL, IID_IShellFolder, (LPVOID*)&psfNextFolder))) 
  1095.         {
  1096.           ShellFree( pidlNextItem);
  1097.           ShellFree( pidlMain);
  1098.           psfFolder->Release();
  1099.           return bResult;
  1100.         }
  1101.  
  1102.         psfFolder->Release ();
  1103.         psfFolder = psfNextFolder;
  1104.  
  1105.         ShellFree( pidlNextItem);
  1106.         pidlItem = GetNextItem (pidlItem);
  1107.       }
  1108.  
  1109.       ppidl = &pidlItem;
  1110.       if (SUCCEEDED (psfFolder->GetUIObjectOf(hwnd, 1, (LPCITEMIDLIST*)ppidl, IID_IContextMenu, NULL, (LPVOID*)&pContextMenu))) 
  1111.       {
  1112.         hMenu = CreatePopupMenu ();
  1113.         if (SUCCEEDED (pContextMenu->QueryContextMenu (hMenu, 0, 1, 0x7FF0, CMF_NORMAL|CMF_VERBSONLY))) 
  1114.         {
  1115.           int iIndex;
  1116.           
  1117.           iIndex = GetMenuItemCount( hMenu );
  1118.           ::InsertMenu(hMenu, iIndex++, MF_STRING | MF_BYPOSITION|MF_SEPARATOR, 0x7FF1, "");
  1119.           ::InsertMenu(hMenu, iIndex++, MF_STRING | MF_BYPOSITION, 0x7FF2, "&Betrachten");
  1120.           nCmd = TrackPopupMenu (hMenu, TPM_LEFTALIGN | TPM_LEFTBUTTON | TPM_RIGHTBUTTON | TPM_RETURNCMD, point.x, point.y, 0, hwnd, NULL);
  1121.           if (nCmd == 0x7ff2 )
  1122.           {
  1123.             HWND hwndViewer;
  1124.             if( CreateViewer( g_Hinstance, 
  1125.                               &hwndViewer, 
  1126.                               pszPath, 
  1127.                               lFilePos ) )
  1128.               ShowWindow( hwndViewer, SW_SHOW );
  1129.           }
  1130.           else
  1131.           if( nCmd )
  1132.           {
  1133.             ici.cbSize          = sizeof (CMINVOKECOMMANDINFO);
  1134.             ici.fMask           = 0;
  1135.             ici.hwnd            = hwnd;
  1136.             ici.lpVerb          = MAKEINTRESOURCE (nCmd - 1);
  1137.             ici.lpParameters    = NULL;
  1138.             ici.lpDirectory     = NULL;
  1139.             ici.nShow           = SW_SHOWNORMAL;
  1140.             ici.dwHotKey        = 0;
  1141.             ici.hIcon           = NULL;
  1142.  
  1143.             if (SUCCEEDED ( pContextMenu->InvokeCommand(&ici)))
  1144.                 bResult = TRUE;
  1145.           }
  1146.         }
  1147.         DestroyMenu (hMenu);
  1148.         pContextMenu->Release ();
  1149.       }
  1150.       ShellFree(pidlMain);
  1151.     }
  1152.   }
  1153.   psfFolder->Release ();
  1154.   return bResult;
  1155. }
  1156.  
  1157.  
  1158. // xx wan anhalten erlaubt ist. signal!!!
  1159. int iMonth[12]={31,28,31,30,31,30,31,31,30,31,30,31};
  1160.  
  1161. BOOL ValidDay( int day, int month, int year )
  1162. {
  1163.   if( year < 51 ) // 50 == 2050, 51 == 1951
  1164.       year += 2000;
  1165.   else
  1166.       if( year < 100 )
  1167.           year += 1900;
  1168.  
  1169.   if( year >= 2100 )
  1170.         return FALSE;
  1171.  
  1172.   iMonth[1]=28;  // Moinatsarray auf Korrekten Februar setzen 
  1173.     if( !( year % 4 ) )  // Teilbar durch 4
  1174.     {
  1175.         if( ( year % 100 ) == 0 )    // Alle Hundertjahre fΣllt das Schaltjahr aus 
  1176.         {
  1177.             if( (year % 400 ) == 0 )   // Alle vierhunderter allerdings dann doch wieder
  1178.         iMonth[1]=29; // Tausender sind doich Schaltjahre
  1179.         }
  1180.         else
  1181.             iMonth[1]=29;
  1182.     }
  1183.  
  1184.     month--;
  1185.   day--;
  1186.     if( ( month >= 0 ) && ( month < 11 ) )
  1187.         if( ( day >= 0 ) && ( day < iMonth[month] ) )
  1188.             if( ( year >= -4173 ) && ( year <= 2100 ) )
  1189.         return TRUE;
  1190.  
  1191.   return FALSE;
  1192. }
  1193.  
  1194. BOOL CalDayToJulianDay( long *l, int day, int month, int year )
  1195. {
  1196.   double month1, year1;
  1197.   double a, b, c ,d;
  1198.  
  1199.   if( !ValidDay( day, month, year ) )
  1200.     return FALSE;
  1201.  
  1202.   month1 = (double)month;
  1203.   year1 = (double)year;
  1204.  
  1205.   if( year1 < 0 ) year1++;
  1206.  
  1207.   if( month < 3 )
  1208.   {
  1209.     month1 = month + 12.0f; 
  1210.     year1--;
  1211.   }
  1212.   
  1213.   a = floor( year1 / 100.0 ); // division schneidet nachkomma ab
  1214.   b = 2 - a + floor( a / 4.0 );
  1215.  
  1216.   if( year < 1582 ) // Kleiner als Reformdatum
  1217.     b = 0;
  1218.   if( ( year == 1582 ) && ( month < 10 ) ) // diese tage gibt es nicht!
  1219.     b = 0;
  1220.   if( ( year == 1582 ) && ( month == 10 ) && ( day < 15 ) ) // diese tage gibt es nicht!
  1221.     b = 0;
  1222.  
  1223.   if( year1 < 0 )
  1224.     c = ceil((365.25 * year1) - 0.75) - 694025.0;
  1225.   else
  1226.     c = floor(365.25 * year1) - 694025.0;
  1227.  
  1228.   d = floor( 30.6001 * ( month1 + 1 ) );
  1229.  
  1230.   // 1.1.4713 v.Chr. == 0
  1231.   // 1.1.1900 v.Chr. == 2415021
  1232.  
  1233.   *l = (long)(b + c + d + day) + 2415020L;
  1234.   return TRUE;
  1235. }
  1236.  
  1237. BOOL JulianDayToCalDay( long julday, SYSTEMTIME *s )
  1238. {
  1239.   double a, b, c, d, f, g, i, mn, dy, yr;
  1240.  
  1241.   julday -= 2415020L;
  1242.  
  1243.   d = julday + 0.5;
  1244.   i = floor( d );
  1245.   f = d - i;
  1246.   if( f == 1.0 ) 
  1247.   {
  1248.     f = 0;
  1249.     i += 1.0;
  1250.   }
  1251.  
  1252.   if( i > -115860L)  
  1253.   {
  1254.     a = floor((i/36524.25)+0.99835726) + 14.0;
  1255.     i = i+1.0+a-floor(a/4.0);
  1256.   }
  1257.   b = floor((i/365.25)+0.802601);
  1258.   c = i - floor((365.25*b)+0.750001)+416.0;
  1259.   g = floor(c/30.6001);
  1260.   
  1261.   dy = c - floor(30.6001*g)+f;
  1262.  
  1263.   if( g >13.5) 
  1264.     mn = g - 13.0;
  1265.   else
  1266.     mn = g - 1.0;
  1267.     
  1268.   if( mn < 2.5 ) 
  1269.     yr = b + 1900.0;
  1270.   else
  1271.     yr = b + 1899.0;
  1272.  
  1273.   if( yr < 1 ) yr = yr - 1.0;
  1274.   
  1275.   memset( s, 0, sizeof( SYSTEMTIME ) );
  1276.   s->wDay = (short)dy;
  1277.   s->wMonth = (short)mn;
  1278.   s->wYear = (short)yr;
  1279.   return TRUE;
  1280. }
  1281.  
  1282.  
  1283.  
  1284. class CHARACTERPOOL
  1285. {
  1286. public:
  1287.   BOOL          bUpperCase;
  1288.   HANDLE        hFile;
  1289.   unsigned char cReadPuffer[2 * 4096];
  1290.   long          lBufStartPos;
  1291.   long          lReadPos;
  1292.   long          lFileSize;          // Datei lΣnge
  1293.  
  1294.   long              lFileStack[1000];   // aktuelle Leseposition speichern 
  1295.   int           iStackPtr;
  1296.  
  1297.   CHARACTERPOOL()
  1298.   {
  1299.     hFile = INVALID_HANDLE_VALUE;
  1300.     lBufStartPos = 0L;
  1301.     lReadPos = 0L;
  1302.     
  1303.     lFileSize = 0L;
  1304.  
  1305.     iStackPtr = 0;
  1306.     bUpperCase = FALSE;
  1307.   }
  1308.  
  1309.   bool getchar(unsigned char *c )
  1310.   {
  1311.     // Der Puffer darf verΣndert werden, wenn sich WinGrep nicht
  1312.     // in einer Rekursion befindet
  1313.     if( !iStackPtr ) // Neuen Teil des Puffers einlesen
  1314.     {
  1315.       if( ( ( lReadPos + sizeof(cReadPuffer)/2 ) >= lBufStartPos + sizeof(cReadPuffer) ) && 
  1316.             ( lBufStartPos + sizeof(cReadPuffer) < lFileSize ) )
  1317.       {
  1318.         DWORD dwRead;
  1319.         memcpy( &cReadPuffer[0], 
  1320.                 &cReadPuffer[sizeof(cReadPuffer)/2],
  1321.                 sizeof(cReadPuffer)/2 );
  1322.         lBufStartPos += sizeof(cReadPuffer)/2;
  1323.         ReadFile( hFile, 
  1324.                   &cReadPuffer[sizeof(cReadPuffer)/2], 
  1325.                   sizeof(cReadPuffer)/2,
  1326.                   &dwRead,
  1327.                   NULL );
  1328.         if( bUpperCase )
  1329.           CharUpperBuff( (char*)&cReadPuffer[sizeof(cReadPuffer)/2], sizeof(cReadPuffer)/2 );
  1330.       }
  1331.     }
  1332.  
  1333.     if( lReadPos < lFileSize )
  1334.     {
  1335.       *c = cReadPuffer[ lReadPos - lBufStartPos ];
  1336.       
  1337.       lReadPos++;
  1338.       return true;
  1339.     }
  1340.     return false;
  1341.   }
  1342.  
  1343.   bool push()
  1344.   {
  1345.     if( iStackPtr < ( sizeof( lFileStack ) / sizeof( long ) ) )
  1346.     {
  1347.       lFileStack[iStackPtr] = lReadPos;
  1348.       iStackPtr++;
  1349.       return true;
  1350.     }
  1351.     return false;
  1352.   }
  1353.  
  1354.   bool restore()
  1355.   {
  1356.     if( iStackPtr  )
  1357.     {
  1358.           --iStackPtr;
  1359.           lReadPos = lFileStack[iStackPtr];
  1360.       return true;
  1361.     }
  1362.     return false;
  1363.   }
  1364.  
  1365.   bool pop()
  1366.   {
  1367.     if( iStackPtr  )
  1368.     {
  1369.       --iStackPtr;
  1370.       return true;
  1371.     }
  1372.     return false;
  1373.   }
  1374.  
  1375.   bool open( LPSTR lpFileName, BOOL bUpperCaseStream )
  1376.   {
  1377.     if( hFile != INVALID_HANDLE_VALUE ) return FALSE;
  1378.  
  1379.     bUpperCase = bUpperCaseStream;
  1380.     lBufStartPos = 0L;
  1381.     lReadPos = 0L;
  1382.     lFileSize = 0L;
  1383.     iStackPtr = 0;
  1384.  
  1385.     hFile = CreateFile( lpFileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0L, NULL );
  1386.     if( hFile  != INVALID_HANDLE_VALUE )
  1387.     {
  1388.       DWORD dwRead;
  1389.       lFileSize = GetFileSize( hFile, NULL );
  1390.       dwRead = lFileSize < sizeof(cReadPuffer) ? lFileSize : sizeof(cReadPuffer);
  1391.       ReadFile( hFile, cReadPuffer, dwRead, &dwRead, NULL );
  1392.       if( bUpperCase )
  1393.         CharUpperBuff( (char*)cReadPuffer, dwRead );
  1394.     }
  1395.         return hFile != INVALID_HANDLE_VALUE;
  1396.   }
  1397.  
  1398.   void close()
  1399.   {
  1400.     if( hFile != INVALID_HANDLE_VALUE ) 
  1401.     {
  1402.       CloseHandle(hFile);
  1403.       hFile = INVALID_HANDLE_VALUE;
  1404.     }
  1405.   }
  1406. };
  1407.  
  1408. class GREPNODE
  1409. {
  1410.   public:
  1411.     GREPNODE *lpNext;
  1412.     int iMinMatch,  // diese Node mu▀ mindestens iMinMatch-mal gefunden werden,
  1413.         iMaxMatch;  // aber darf nur maximal iMaxMatch-mal vorkommen
  1414.     
  1415.     virtual bool matchchar(CHARACTERPOOL *cp) // das ⁿbergebene Zeichen pa▀t
  1416.     {
  1417.        return false;
  1418.     }   
  1419.  
  1420.     GREPNODE()
  1421.     {
  1422.        lpNext = NULL;
  1423.        iMinMatch = 1; // Genau einmal
  1424.        iMaxMatch = 1;
  1425.     }
  1426.     ~GREPNODE()
  1427.     {
  1428.       if( lpNext ) delete lpNext;
  1429.       lpNext = NULL;
  1430.     }
  1431.  
  1432.     bool match( CHARACTERPOOL *cp )
  1433.     {
  1434.       int i;
  1435.       // Diese Treffer mⁿssen sein
  1436.       if( !cp->push() ) return false;
  1437.       for( i = 0; i < iMinMatch; i++ )
  1438.       if( !matchchar( cp ) )
  1439.       {
  1440.         if( !cp->restore() ) return false;
  1441.         return false;
  1442.       }
  1443.  
  1444.       // Diese Treffer dⁿrfen sein
  1445.       while( ( i < iMaxMatch ) || ( iMaxMatch == -1 ) )
  1446.       {
  1447.         if( lpNext )
  1448.         {
  1449.           if( !cp->push() ) return false;
  1450.           if( lpNext->match( cp ) ) 
  1451.           {
  1452.             if( !cp->pop() ) return false;
  1453.             return true;
  1454.           }
  1455.           if( !cp->restore() ) return false;
  1456.         }
  1457.  
  1458.         if( !matchchar( cp ) )
  1459.         {
  1460.           if( !cp->restore() ) return false;
  1461.           return false;
  1462.         }
  1463.         i++;
  1464.       }
  1465.       if( !cp->pop() ) return false;
  1466.  
  1467.       if( lpNext )
  1468.         return lpNext->match( cp );
  1469.       return true;
  1470.     }
  1471. };
  1472.  
  1473. class CHARNODE:public GREPNODE
  1474. {
  1475.   public:
  1476.     unsigned char cCharacter;
  1477.     virtual bool matchchar(CHARACTERPOOL *cp) // das ⁿbergebene Zeichen pa▀t
  1478.     {
  1479.       unsigned char c;
  1480.       if( !cp->getchar( &c ) ) return false;
  1481.       return c == cCharacter;
  1482.     }   
  1483. };
  1484.  
  1485. // End Of Line
  1486. class EOLNODE:public GREPNODE
  1487. {
  1488.   public:
  1489. };
  1490.  
  1491. // Start Of Line
  1492. class SOLNODE:public GREPNODE
  1493. {
  1494.   public:
  1495. };
  1496.  
  1497. // "Unternoide" fⁿr Sub-Expressions (Klammerausdrⁿcke)
  1498. class SUBNODE:public GREPNODE
  1499. {
  1500.   public:
  1501.     GREPNODE *lpSubNode;
  1502.     SUBNODE()
  1503.     {
  1504.       lpSubNode = NULL;
  1505.     }
  1506.     ~SUBNODE()
  1507.     {
  1508.       if( lpSubNode )
  1509.         delete lpSubNode;
  1510.     }
  1511.     virtual bool matchchar(CHARACTERPOOL *cp) // das ⁿbergebene Zeichen pa▀t
  1512.     {
  1513.       return lpSubNode->match( cp );
  1514.     }   
  1515. };
  1516.  
  1517.  
  1518. // Zeichenklasse. Jedes Zeichen der Klasse wird durch ein Bit 
  1519. // innerhalb eines Bit-Arrays reprΣsentiert
  1520. unsigned char BitMask[8]={1,2,4,8,16,32,64,128};
  1521.  
  1522. class CLASSNODE:public GREPNODE
  1523. {
  1524.   public:
  1525.     char Bits[256/8];
  1526.  
  1527.     CLASSNODE()
  1528.     {
  1529.        memset( Bits,0,sizeof(Bits));
  1530.     }
  1531.         
  1532.     void SetBit( char c ) // Bit fⁿr das angegebenebe Zeichen setzen
  1533.     {
  1534.       Bits[c/8] |= BitMask[c & 7];
  1535.     }
  1536.     void InvertAllBits( )
  1537.     {
  1538.       for( int i = 0; i < 256/8;i++) Bits[i] ^= 0xFF;
  1539.     }
  1540.     bool IsSet( char c )
  1541.     {
  1542.       return (Bits[c/8] & BitMask[(c & 7)]) ? true : false;
  1543.     }
  1544.         
  1545.     virtual bool matchchar(CHARACTERPOOL *cp) // das ⁿbergebene Zeichen pa▀t
  1546.     {
  1547.       unsigned char c;
  1548.       if( !cp->getchar( &c ) ) return FALSE;
  1549.       return IsSet( c );
  1550.     }   
  1551. };
  1552.  
  1553. // Irgendein Zeichen
  1554. class ANYNODE:public CLASSNODE
  1555. {
  1556.   public:
  1557.  
  1558.     ANYNODE():CLASSNODE()
  1559.     {
  1560.       SetBit( '\n' );   // Alles au▀er CR und LF
  1561.       SetBit( '\r' );
  1562.       InvertAllBits();
  1563.     }
  1564. };
  1565.  
  1566. // Diese Parameter werden an den Worker-Thread ⁿbergeben:
  1567. class THREADPARAMETERS                                  
  1568. {
  1569.   public:
  1570.     HWND        hwndDlg;                // Handle des Dialogfensters
  1571.     HANDLE      hThread;                // Handle des Such-Threads
  1572.     DWORD       dwThreadID;             // ID des Suchthreads
  1573.     GREPNODE   *Pattern;                // zu suchendes Muster
  1574.     char        szName[MAX_PATH];       // zu suchender Dateiname 
  1575.     char        szDirectory[MAX_PATH];  // Startpfad
  1576.     bool        bRecurseDirectories;    // Unterverzeichnisse durchsuchen?
  1577.     HWND        hStatusBar;             // Handle des Statusfensters
  1578.     HWND        hResults;               // Handle der Ergebnisliste
  1579.     bool        bUpperCase;             // Gro▀/Kleinschreibung durch verwendung von Grossbuchstaben ignorieren
  1580.     bool        bUnicode;               // Unicode-Zeichen
  1581.     bool        bWindowsSemantic;       // Muster-Suche mit * und ?
  1582.  
  1583.     CHARACTERPOOL cp;                   //  Struktur zum Einlesen der Zeichen aus den zu durchsuchenden Datei
  1584.  
  1585.         BOOL          bDate;                // Nur Dateien innerhalb eines Zeitraums berⁿcksichtigen
  1586.         FILETIME      dateVon,              // Start und Enddatum
  1587.                   dateBis;  
  1588.     
  1589.     BOOL bSize;                         // Nur Dateien einer bestimmten Gr÷▀e berⁿcksichtigen
  1590.     int  bSameSize;                     // 0 = gleich, -1, minimal, 1 = maximal
  1591.     DWORD lKByte;                       // Gr÷▀e
  1592.     
  1593.     long lFileTypeStart,                // Nur Dateien eines Bestimmten, registrierten Dateityps berⁿcksichtigen
  1594.          lFileTypeEnd;                
  1595.     HWND hFileTypes;
  1596.     HWND hFileExtensions;
  1597.     HWND hFileTypesCombo;
  1598. };                                      // Fenster mit registrierten Dateitypen
  1599.  
  1600. // globale Parameter - nur ein Suchthread pro Anwendung
  1601. THREADPARAMETERS g_ThreadParameters;  
  1602.  
  1603. // Holt den nΣchsten Buchstaben aus dem Muster-String 
  1604. // Escape-Sequenzen und Hex-Digits werden automatisch aufgel÷st
  1605. bool GetPatternCharacter( unsigned char *c, 
  1606.                           LPSTR lpPattern, 
  1607.                           int *iPos,
  1608.                           bool bInCharacterClass,
  1609.                           bool bWindowsSemantic )
  1610. {
  1611.   switch( lpPattern[*iPos] )
  1612.   {
  1613.     case '\\':
  1614.       (*iPos)++;
  1615.       switch( lpPattern[*iPos] )
  1616.       {
  1617.         case 'n': *c = '\n'; (*iPos)++; return true;
  1618.         case 'r': *c = '\r'; (*iPos)++; return true;
  1619.         case 't': *c = '\t'; (*iPos)++; return true;
  1620.         case '[': *c = '['; (*iPos)++; return true;
  1621.         case ']': *c = ']'; (*iPos)++; return true;
  1622.         case '(': *c = '('; (*iPos)++; return true;
  1623.         case ')': *c = ')'; (*iPos)++; return true;
  1624.         case '{': *c = '{'; (*iPos)++; return true;
  1625.         case '}': *c = '}'; (*iPos)++; return true;
  1626.         case '.': *c = '.'; (*iPos)++; return true;
  1627.         case '\\': *c = '\\'; (*iPos)++; return true;
  1628.         case '$':  *c = '$'; (*iPos)++; return true;
  1629.         case '^':  *c = '^'; (*iPos)++; return true;
  1630.         case '*':  *c = '*'; (*iPos)++; return true;
  1631.         case '+':  *c = '+'; (*iPos)++; return true;
  1632.         case '?':  *c = '?'; (*iPos)++; return true;
  1633.         
  1634.         case '-':
  1635.           if( bInCharacterClass )
  1636.           {
  1637.             // die Escapesequenz \- ist nur innerhalb einer characterklasse erlaubt
  1638.             *c = '-';
  1639.             (*iPos)++; 
  1640.             return true;
  1641.           }
  1642.           return false;
  1643.  
  1644.           // dreistelle Oktalzahl
  1645.         case '0':case '1':case '2':case '3':case '4':
  1646.         case '5':case '6':case '7':case '8':case '9':
  1647.         {
  1648.           int iVal;
  1649.           iVal = lpPattern[*iPos] - '0';
  1650.           (*iPos)++;
  1651.  
  1652.           if( !isdigit(lpPattern[*iPos]) )
  1653.           {
  1654.             // bisherigen wert ⁿbernehmen
  1655.             *c = (unsigned char) iVal;
  1656.             return true;
  1657.           }
  1658.         
  1659.           iVal *= 8;
  1660.           iVal += lpPattern[*iPos] - '0';
  1661.           (*iPos)++;
  1662.  
  1663.           if( !isdigit(lpPattern[*iPos]) )
  1664.           {
  1665.             // bisherigen wert ⁿbernehmen
  1666.             *c = (unsigned char) iVal;
  1667.             return true;
  1668.           }
  1669.           iVal *= 8;
  1670.           iVal += lpPattern[*iPos] - '0';
  1671.                     
  1672.           (*iPos)++;
  1673.           *c = (unsigned char) iVal;
  1674.           return true;
  1675.         }
  1676.           // zweistellige Hex-Ziffer
  1677.         case 'x': case 'X': 
  1678.         {
  1679.           int iVal,nVal;
  1680.           if( isdigit(lpPattern[*iPos]) )
  1681.             iVal = lpPattern[*iPos]-'0';
  1682.           else
  1683.           if( (lpPattern[*iPos]>='a') && (lpPattern[*iPos]<='f') )
  1684.             iVal = 10 + lpPattern[*iPos]-'a';
  1685.           else
  1686.           if( (lpPattern[*iPos]>='A') && (lpPattern[*iPos]<='F') )
  1687.             iVal = 10 + lpPattern[*iPos]-'A';
  1688.           else return false;
  1689.  
  1690.           (*iPos)++;
  1691.           if( isdigit(lpPattern[*iPos]) )
  1692.             nVal = lpPattern[*iPos]-'0';
  1693.           else
  1694.           if( (lpPattern[*iPos]>='a') && (lpPattern[*iPos]<='f') )
  1695.             nVal = 10 + lpPattern[*iPos]-'a';
  1696.           else
  1697.           if( (lpPattern[*iPos]>='A') && (lpPattern[*iPos]<='F') )
  1698.             nVal = 10 + lpPattern[*iPos]-'A';
  1699.           else 
  1700.           {
  1701.             // bisherigen wert ⁿbernehmen
  1702.             *c = (unsigned char) iVal;
  1703.             return true;
  1704.           }
  1705.  
  1706.           iVal += nVal;
  1707.           (*iPos)++;
  1708.           *c = (unsigned char) iVal;
  1709.           return true;
  1710.         }
  1711.         default:
  1712.           *c = lpPattern[*iPos];
  1713.           (*iPos)++;
  1714.           return true;
  1715.       }
  1716.       break;
  1717.  
  1718.     // die folgenden Zeichen dⁿrfen nicht "unescaped" auftauchen
  1719.     case '[': case ']': case '(': case ')': case '{':        
  1720.     case '}': case '$': case '^': case '.': case '\0':
  1721.     case '*': case '?': case '+': 
  1722.       return bWindowsSemantic;
  1723.     case '-':   // ausserhalb einer zeichenklasse erlaubt!
  1724.       if( bInCharacterClass ) 
  1725.         return bWindowsSemantic;
  1726.     default:
  1727.       *c = lpPattern[*iPos];
  1728.       (*iPos)++;
  1729.       return true;
  1730.   }
  1731. }             
  1732.  
  1733. GREPNODE *MakePattern( LPSTR lpPattern, int *iPos, int iLevel, bool bWindowsSemantic, bool bUnicode )
  1734. {
  1735.   GREPNODE *lpFirst, 
  1736.             *lpLast, 
  1737.             *lpAct;
  1738.   bool bCloseureAllowed; // an LastNode darf eine Closeure gehangen werden!
  1739.   bool bAppendAny;
  1740.  
  1741.   lpFirst = NULL;
  1742.   lpLast = NULL;
  1743.   bCloseureAllowed = FALSE;
  1744.  
  1745.   while( lpPattern[*iPos] )
  1746.   {
  1747.     lpAct = NULL;
  1748.     bAppendAny = false; // eine Anynode fⁿr UNicode-Erkennung einfⁿgen?
  1749.  
  1750.     if( bWindowsSemantic ) // Nur * und ? als Wildcard zulassen
  1751.     {
  1752.       switch( lpPattern[*iPos] )
  1753.       {
  1754.         // Any - jedes Zeichen gilt
  1755.         case '?':
  1756.           CREATENODETYPE(ANYNODE); // Characterklasse mit leeren zeichen 
  1757.                   (*iPos)++;
  1758.           bCloseureAllowed = true;
  1759.           bAppendAny = bUnicode;
  1760.         break;
  1761.         case '*':
  1762.           CREATENODETYPE(ANYNODE); // Characterklasse mit leeren zeichen 
  1763.           lpAct->iMinMatch = 0;
  1764.           lpAct->iMaxMatch = -1; // Beliebig oft
  1765.           (*iPos)++;
  1766.           bCloseureAllowed = true;
  1767.           bAppendAny = bUnicode;
  1768.         break;
  1769.         default:
  1770.           CREATENODETYPE(CHARNODE); // Characterklasse mit leeren zeichen 
  1771.           if( !GetPatternCharacter( &((CHARNODE*)lpAct)->cCharacter, lpPattern, iPos, false, bWindowsSemantic ) )
  1772.             FREEANDEXIT;
  1773.           bCloseureAllowed = true;
  1774.           bAppendAny = bUnicode;
  1775.         break;
  1776.       }    
  1777.     }
  1778.     else
  1779.     {
  1780.       switch( lpPattern[*iPos] )
  1781.       {
  1782.         // Die geshlossene runde Klammer taucht nur bei einem 
  1783.         // Subexpression uaf. Eine RUnde Klammer auf oberster Ebene
  1784.         // ist ein Syntax-Fehler
  1785.         case ')':
  1786.         {
  1787.           if( iLevel ) 
  1788.           {
  1789.             (*iPos)++;
  1790.             return lpFirst;
  1791.           }
  1792.           else
  1793.           {
  1794.             FREEANDEXIT;
  1795.             return NULL;
  1796.           }
  1797.         }
  1798.         break;
  1799.         // Sub - Die ge÷ffnete runde Klammer leitet einen Subexpression ein
  1800.         case '(':
  1801.         {
  1802.           CREATENODETYPE(SUBNODE);
  1803.           (*iPos)++;
  1804.           ((SUBNODE*)lpAct)->lpSubNode = MakePattern( lpPattern, iPos, iLevel+1, bWindowsSemantic, bUnicode );
  1805.            if( !((SUBNODE*)lpAct)->lpSubNode )
  1806.             FREEANDEXIT;
  1807.            bCloseureAllowed = TRUE;
  1808.         }
  1809.         break;
  1810.         // Class - Die eckigen Klammern stehen fⁿr eine Zeichenklasse
  1811.         case '[':
  1812.         {
  1813.           unsigned char a,b;
  1814.                  
  1815.           (*iPos)++;
  1816.           if( lpPattern[*iPos] == ']' ) return NULL;
  1817.  
  1818.           CREATENODETYPE(CLASSNODE);
  1819.           bAppendAny = bUnicode;
  1820.  
  1821.           while( lpPattern[*iPos] != ']' )
  1822.           {
  1823.             bool bInvert;
  1824.  
  1825.             if( lpPattern[*iPos] == '\0' )  // vorzeitiges Ende des Patternstrings?
  1826.               FREEANDEXIT;
  1827.                     
  1828.             bInvert = FALSE;
  1829.             if( lpPattern[*iPos] == '^' )  
  1830.             {
  1831.               bInvert = true;
  1832.               (*iPos)++;
  1833.             }
  1834.                         
  1835.             if( !GetPatternCharacter( &a, lpPattern, iPos, true, bWindowsSemantic ) )
  1836.               FREEANDEXIT;
  1837.             if( lpPattern[*iPos] == '-' )
  1838.             {
  1839.               (*iPos)++;
  1840.               if( !GetPatternCharacter( &b, lpPattern, iPos, true, bWindowsSemantic ) )
  1841.                 FREEANDEXIT;
  1842.               if( b < a )
  1843.               {
  1844.                 FREEANDEXIT;
  1845.                 return false;
  1846.               }
  1847.               while( a <= b )
  1848.                 ((CLASSNODE*)lpAct)->SetBit( a++ );
  1849.             }
  1850.             else
  1851.               ((CLASSNODE*)lpAct)->SetBit( a );
  1852.             if( bInvert )
  1853.               ((CLASSNODE*)lpAct)->InvertAllBits();
  1854.           }
  1855.           (*iPos)++;
  1856.           bCloseureAllowed = true;
  1857.         }
  1858.         break;
  1859.         // Any - jedes Zeichen gilt
  1860.         case '.':
  1861.           CREATENODETYPE(ANYNODE); // Characterklasse mit leeren zeichen 
  1862.                   (*iPos)++;
  1863.           bCloseureAllowed = true;
  1864.           bAppendAny = bUnicode;
  1865.         break;
  1866.  
  1867.         default:
  1868.           CREATENODETYPE(CHARNODE); // Characterklasse mit leeren zeichen 
  1869.           if( !GetPatternCharacter( &((CHARNODE*)lpAct)->cCharacter, lpPattern, iPos, false, bWindowsSemantic ) )
  1870.             FREEANDEXIT;
  1871.           bCloseureAllowed = true;
  1872.           bAppendAny = bUnicode;
  1873.         break;
  1874.         // EOL - Ende der Zeile
  1875.         case '$':
  1876.           CREATENODETYPE(EOLNODE); // Characterklasse mit leeren zeichen 
  1877.                   (*iPos)++;
  1878.           bCloseureAllowed = FALSE;
  1879.         break;
  1880.         // SOL - Start der Zeile
  1881.         case '^':
  1882.           CREATENODETYPE(SOLNODE); // Characterklasse mit leeren zeichen 
  1883.                   (*iPos)++;
  1884.           bCloseureAllowed = false;
  1885.         break;
  1886.         // Closure - die letzte Node beliebig oft wiederholen
  1887.         case '*':
  1888.           (*iPos)++;
  1889.           if( !bCloseureAllowed )
  1890.           {
  1891.             FREEANDEXIT;
  1892.             return NULL;
  1893.           }
  1894.           bCloseureAllowed = false;
  1895.           if( !lpLast ) FREEANDEXIT;
  1896.  
  1897.           lpLast->iMinMatch = 0;
  1898.           lpLast->iMaxMatch = -1; // Beliebig oft
  1899.         break;
  1900.         case '+':
  1901.           (*iPos)++;
  1902.           if( !bCloseureAllowed )
  1903.           {
  1904.             FREEANDEXIT;
  1905.             return NULL;
  1906.           }
  1907.           bCloseureAllowed = false;
  1908.           if( !lpLast ) FREEANDEXIT;
  1909.  
  1910.           lpLast->iMinMatch = 1;
  1911.           lpLast->iMaxMatch = -1; // Beliebig oft
  1912.         break;
  1913.         // Count - Anzahl der Wiederholungen {1,2} {,2} {1}
  1914.         case '{':
  1915.         {
  1916.           int iVal;
  1917.           if( !bCloseureAllowed )
  1918.           {
  1919.             FREEANDEXIT;
  1920.             return NULL;
  1921.           }
  1922.           bCloseureAllowed = false;
  1923.           if( !lpLast ) FREEANDEXIT;
  1924.  
  1925.           (*iPos)++;
  1926.                 
  1927.           iVal = 0;
  1928.           while( isdigit(lpPattern[*iPos] ) )
  1929.           {
  1930.             iVal*=10;
  1931.             iVal+= lpPattern[*iPos] - '0';
  1932.             (*iPos)++;
  1933.           }
  1934.           lpLast->iMinMatch = iVal;
  1935.                 
  1936.           if( lpPattern[*iPos]==',' )
  1937.           {
  1938.             (*iPos)++;
  1939.                 
  1940.             iVal = 0;
  1941.             while( isdigit(lpPattern[*iPos] ) )
  1942.             {
  1943.               iVal*=10;
  1944.               iVal+= lpPattern[*iPos] - '0';
  1945.               (*iPos)++;
  1946.             }
  1947.             lpLast->iMaxMatch = iVal;
  1948.           } 
  1949.           else
  1950.             lpLast->iMaxMatch = lpLast->iMinMatch;
  1951.                   if( lpPattern[*iPos] == '}' )
  1952.                       (*iPos)++;
  1953.                   else
  1954.                       FREEANDEXIT;
  1955.         }
  1956.         break;
  1957.       }
  1958.     }        
  1959.     if( lpAct )
  1960.     {
  1961.       if( lpLast )
  1962.       {
  1963.         lpLast->lpNext = lpAct;
  1964.         lpLast = lpLast->lpNext;
  1965.       }
  1966.       else
  1967.       {
  1968.         lpFirst = lpLast = lpAct;
  1969.       }
  1970.     }
  1971.  
  1972.     // Unicode-Zusatznode einfⁿgen
  1973.     if( bAppendAny )
  1974.     {
  1975.       CREATENODETYPE(ANYNODE); // Characterklasse mit leeren zeichen 
  1976.       if( lpAct )
  1977.       {
  1978.         if( lpLast )
  1979.         {
  1980.           lpLast->lpNext = lpAct;
  1981.           lpLast = lpLast->lpNext;
  1982.         }
  1983.         else
  1984.         {
  1985.           lpFirst = lpLast = lpAct;
  1986.         }
  1987.       }
  1988.     }
  1989.   }
  1990.   return lpFirst;
  1991. }
  1992.  
  1993. void SetDate( HWND hwndDlg )
  1994. {
  1995.     BOOL bAlleDateien;
  1996.     BOOL bControl;
  1997.  
  1998.     bAlleDateien = FALSE;
  1999.     if( !( SendMessage( GetDlgItem( hwndDlg, IDC_DATEIDATUM ), BM_GETCHECK, 0, 0L ) & BST_CHECKED ) )
  2000.         bAlleDateien = TRUE;
  2001.   
  2002.   EnableWindow( GetDlgItem( hwndDlg, IDC_ALLEDATEIEN ), TRUE );
  2003.     SendMessage( GetDlgItem( hwndDlg, IDC_ALLEDATEIEN ), BM_SETCHECK, bAlleDateien ? BST_CHECKED : BST_UNCHECKED, 0L );
  2004.     EnableWindow( GetDlgItem( hwndDlg, IDC_DATEIDATUM ), TRUE );
  2005.   SendMessage( GetDlgItem( hwndDlg, IDC_DATEIDATUM ), BM_SETCHECK, bAlleDateien ? BST_UNCHECKED : BST_CHECKED, 0L );
  2006.   
  2007.  
  2008.     if( (!( SendMessage( GetDlgItem( hwndDlg, IDC_ZWISCHEN),
  2009.                        BM_GETCHECK, 0, 0L ) & BST_CHECKED ))  &&
  2010.         (!( SendMessage( GetDlgItem( hwndDlg, IDC_LETZTEMONATE ),
  2011.                        BM_GETCHECK, 0, 0L ) & BST_CHECKED )) &&
  2012.         (!( SendMessage( GetDlgItem( hwndDlg, IDC_LETZTETAGE ),
  2013.                        BM_GETCHECK, 0, 0L ) & BST_CHECKED )))
  2014.         SendMessage( GetDlgItem( hwndDlg, IDC_ZWISCHEN), BM_SETCHECK, BST_CHECKED, 0L ) ;
  2015.  
  2016.   EnableWindow( GetDlgItem( hwndDlg, IDC_ZWISCHEN ), !bAlleDateien );
  2017.  
  2018.   bControl = FALSE;
  2019.   if( SendMessage( GetDlgItem( hwndDlg, IDC_ZWISCHEN), BM_GETCHECK, 0, 0L ) & BST_CHECKED ) 
  2020.     bControl = !bAlleDateien;
  2021.  
  2022.   EnableWindow( GetDlgItem( hwndDlg, IDC_EDITVON ), bControl );
  2023.   EnableWindow( GetDlgItem( hwndDlg, IDC_STATICUND ), bControl );
  2024.   EnableWindow( GetDlgItem( hwndDlg, IDC_EDITBIS ), bControl );
  2025.  
  2026.   EnableWindow( GetDlgItem( hwndDlg, IDC_LETZTEMONATE ), !bAlleDateien );
  2027.   bControl = FALSE;
  2028.   if( SendMessage( GetDlgItem( hwndDlg, IDC_LETZTEMONATE ), BM_GETCHECK, 0, 0L ) & BST_CHECKED ) 
  2029.     bControl = !bAlleDateien;
  2030.  
  2031.   EnableWindow( GetDlgItem( hwndDlg, IDC_EDITLETZTEMONATE ), bControl );
  2032.   EnableWindow( GetDlgItem( hwndDlg, IDC_SPINLETZTEMONATE ), bControl );
  2033.   EnableWindow( GetDlgItem( hwndDlg, IDC_STATICLETZTEMONATE ), bControl );
  2034.  
  2035.   EnableWindow( GetDlgItem( hwndDlg, IDC_LETZTETAGE ), !bAlleDateien );
  2036.     bControl = FALSE;
  2037.     if( SendMessage( GetDlgItem( hwndDlg, IDC_LETZTETAGE ),
  2038.                      BM_GETCHECK, 0, 0L ) & BST_CHECKED ) 
  2039.         bControl = !bAlleDateien;
  2040.  
  2041.     EnableWindow( GetDlgItem( hwndDlg, IDC_EDITLETZTETAGE ), bControl );
  2042.     EnableWindow( GetDlgItem( hwndDlg, IDC_SPINLETZTETAGE ), bControl );
  2043.     EnableWindow( GetDlgItem( hwndDlg, IDC_STATICLETZTETAGE ), bControl );
  2044. }
  2045.  
  2046. void StopSuche(THREADPARAMETERS *p, bool bStopThread)
  2047. {
  2048.   char szText[100];
  2049.   int i;
  2050.  
  2051.   if( bStopThread )
  2052.   {
  2053.     if( p->hThread != INVALID_HANDLE_VALUE )
  2054.     {
  2055.       //g_hStopSempahore = CreateSemaphore( NULL, 0,1, NULL ); // Semaphore erzeugen und signalisieren
  2056.       
  2057.       //if( g_hStopSempahore )
  2058.       //{
  2059.       //  WaitForSingleObject( g_hStopSempahore, INFINITE ); // Auf freigabe durch Thread warten
  2060.       //  CloseHandle( g_hStopSempahore );
  2061.       //  g_hStopSempahore = NULL;
  2062.       //}
  2063.  
  2064.       TerminateThread( p->hThread, 0 );
  2065.       p->hThread = INVALID_HANDLE_VALUE;
  2066.     }
  2067.     p->cp.close(); // Characterpool aufrΣumen (das dortige hFile ist nicht an den Thread gebunden!)
  2068.   }
  2069.   if( p->Pattern )
  2070.   {
  2071.     delete p->Pattern;
  2072.     p->Pattern = NULL;
  2073.   }
  2074.  
  2075.   EnableWindow( GetDlgItem( p->hwndDlg, IDC_SUCHESTARTEN ), TRUE );
  2076.   EnableWindow( GetDlgItem( p->hwndDlg, IDC_SUCHEANHALTEN ), FALSE );
  2077.  
  2078.   EnableWindow( GetDlgItem( p->hwndDlg, IDC_STATICNAME ), TRUE );
  2079.   EnableWindow( GetDlgItem( p->hwndDlg, IDC_COMBONAME ), TRUE );
  2080.   EnableWindow( GetDlgItem( p->hwndDlg, IDC_STATICMUSTER ), TRUE );
  2081.   EnableWindow( GetDlgItem( p->hwndDlg, IDC_COMBOMUSTER ), TRUE );
  2082.   EnableWindow( GetDlgItem( p->hwndDlg, IDC_STATICSUCHENIN ), TRUE );
  2083.   EnableWindow( GetDlgItem( p->hwndDlg, IDC_COMBOSUCHENIN ), TRUE );
  2084.   EnableWindow( GetDlgItem( p->hwndDlg, IDC_DURCHSUCHEN ), TRUE );
  2085.   EnableWindow( GetDlgItem( p->hwndDlg, IDC_RECURSEDIR ), TRUE );
  2086.     EnableWindow( GetDlgItem( p->hwndDlg, IDC_GROSSKLEIN ), TRUE );
  2087.     EnableWindow( GetDlgItem( p->hwndDlg, IDC_UNICODE ), TRUE );
  2088.   EnableWindow( GetDlgItem( p->hwndDlg, IDC_WINDOWSSYNTAX ), TRUE );
  2089.   //EnableWindow( GetDlgItem( p->hwndDlg, IDC_ALLEDATEIEN ), TRUE );
  2090.   //EnableWindow( GetDlgItem( p->hwndDlg, IDC_DATEIDATUM ), TRUE );
  2091.   //EnableWindow( GetDlgItem( p->hwndDlg, IDC_ZWISCHEN ), TRUE );
  2092.   //EnableWindow( GetDlgItem( p->hwndDlg, IDC_EDITVON ), TRUE );
  2093.   //EnableWindow( GetDlgItem( p->hwndDlg, IDC_STATICUND ), TRUE );
  2094.   //EnableWindow( GetDlgItem( p->hwndDlg, IDC_EDITBIS ), TRUE );
  2095.   //EnableWindow( GetDlgItem( p->hwndDlg, IDC_LETZTEMONATE ), TRUE );
  2096.   //EnableWindow( GetDlgItem( p->hwndDlg, IDC_EDITLETZTEMONATE ), TRUE );
  2097.   //EnableWindow( GetDlgItem( p->hwndDlg, IDC_SPINLETZTEMONATE   ), TRUE );
  2098.   //EnableWindow( GetDlgItem( p->hwndDlg, IDC_STATICLETZTEMONATE ), TRUE );
  2099.   //EnableWindow( GetDlgItem( p->hwndDlg, IDC_LETZTETAGE ), TRUE );
  2100.   //EnableWindow( GetDlgItem( p->hwndDlg, IDC_EDITLETZTETAGE ), TRUE );
  2101.   //EnableWindow( GetDlgItem( p->hwndDlg, IDC_SPINLETZTETAGE ), TRUE );
  2102.   //EnableWindow( GetDlgItem( p->hwndDlg, IDC_STATICLETZTETAGE ), TRUE );
  2103.   SetDate( p->hwndDlg );
  2104.  
  2105.   EnableWindow( GetDlgItem( p->hwndDlg, IDC_STATICTYP ), TRUE );
  2106.   EnableWindow( GetDlgItem( p->hwndDlg, IDC_COMBOTYP ), TRUE );
  2107.   EnableWindow( GetDlgItem( p->hwndDlg, IDC_STATICGROESSE ), TRUE );
  2108.   EnableWindow( GetDlgItem( p->hwndDlg, IDC_COMBOGROESSE ), TRUE );
  2109.   EnableWindow( GetDlgItem( p->hwndDlg, IDC_EDITGROESSE ), TRUE );
  2110.   EnableWindow( GetDlgItem( p->hwndDlg, IDC_SPINGROESSE ), TRUE );
  2111.   EnableWindow( GetDlgItem( p->hwndDlg, IDC_STATICKB ), TRUE );
  2112.  
  2113.   i = ListView_GetItemCount(p->hResults );
  2114.   if( i == 1 )
  2115.     wsprintf( szText, "1 Vorkommnis gefunden" );
  2116.   else
  2117.     wsprintf( szText, "%ld Vorkommnisse gefunden", i );
  2118.  
  2119.   SendMessage( p->hStatusBar, SB_SETTEXT, 255, (LPARAM)szText );
  2120.  
  2121. void AppendDirSep( LPSTR szPath )
  2122. {
  2123.   int i;
  2124.   i = lstrlen( szPath );
  2125.   if( i )
  2126.     if( szPath[i-1] != '\\' )  
  2127.     { 
  2128.       szPath[i]='\\'; 
  2129.       szPath[i+1]=0; 
  2130.     }
  2131. }
  2132.  
  2133. #define  ISDELIMITER(c) (((c) ==':')||((c)==',')||((c) == ';')||((c)==0))
  2134.  
  2135. bool CompareWildcard( LPSTR szFilename, LPSTR szWildPattern )
  2136. {
  2137.   // LOCALE_SYSTEM_DEFAULT = Sprache der Windows-Installation
  2138.   // LOCALE_USER_DEFAULT = aktuelle vom Anwender ausgewΣhlte Sprache (s. Systemeinstellungen)
  2139.   
  2140.   while( !ISDELIMITER( *szWildPattern ) )
  2141.   { 
  2142.     switch( *szWildPattern )
  2143.     {
  2144.       case '*':
  2145.         szWildPattern++;
  2146.         if( !(*szWildPattern ) ) return true;
  2147.         while( CompareString( LOCALE_USER_DEFAULT, NORM_IGNORECASE|SORT_STRINGSORT, szFilename, 1, szWildPattern, 1 ) != 2 ) // 2 == EQUAL
  2148.         {
  2149.           szFilename++;
  2150.           if(!( *szFilename )) return false;
  2151.         }
  2152.       break;
  2153.       case '?':
  2154.         szWildPattern++;
  2155.         szFilename++;
  2156.       break;
  2157.       default:
  2158.         if( CompareString( LOCALE_USER_DEFAULT, NORM_IGNORECASE|SORT_STRINGSORT, szFilename, 1, szWildPattern, 1 ) == 2 ) // 2 == EQUAL
  2159.         {
  2160.           szFilename++;
  2161.           szWildPattern++;
  2162.         }
  2163.         else
  2164.           return false;
  2165.     }
  2166.   }
  2167.   if( *szFilename ) return false;
  2168.   return true;
  2169. }
  2170.  
  2171.  
  2172. void InsertItem( HWND hWnd, HWND hFileTypesCombo, LISTENTRY *le )
  2173. {
  2174.   char szText[256];
  2175.   LVITEM lvi;
  2176.   char c;
  2177.   SYSTEMTIME st;
  2178.  
  2179.   WaitForSingleObject( hArrayMutex, INFINITE );
  2180.   // Darstelluingsview
  2181.   lvi.mask        = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM | LVIF_STATE; 
  2182.   lvi.iItem       = ListView_GetItemCount(hWnd); // Am Ende
  2183.   lvi.iSubItem    = 0;
  2184.   lvi.state       = 0;  
  2185.   lvi.stateMask   = 0; 
  2186.   lvi.pszText     = &le->szPath[le->lFileNameStart]; 
  2187.   lvi.cchTextMax  = lstrlen(lvi.pszText);
  2188.   lvi.iImage      = le->iIcon;
  2189.   lvi.lParam      = 0;
  2190.   lvi.iIndent     = 0;
  2191.   lvi.iItem       = ListView_InsertItem(hWnd,&lvi);
  2192.  
  2193.   c = le->szPath[le->lFileNameStart];
  2194.   le->szPath[le->lFileNameStart] = 0;
  2195.     lvi.mask = LVIF_TEXT; 
  2196.   lvi.pszText = le->szPath; 
  2197.   lvi.cchTextMax = le->lFileNameStart;
  2198.   lvi.iSubItem = 1;
  2199.   ListView_SetItem(hWnd,&lvi);
  2200.   le->szPath[le->lFileNameStart] = c;
  2201.  
  2202.   if( le->lSize < 1024 )
  2203.     lvi.cchTextMax = wsprintf( szText, "%ld Bytes", le->lSize );
  2204.   else
  2205.     lvi.cchTextMax = wsprintf( szText, "%ld KB", (le->lSize +1023)/1024); 
  2206.   lvi.pszText = szText; 
  2207.   lvi.iSubItem = 2;
  2208.   ListView_SetItem(hWnd, &lvi );
  2209.  
  2210.   lvi.cchTextMax = GetTypeString( hFileTypesCombo, le, szText );
  2211.   lvi.pszText = szText; 
  2212.   lvi.iSubItem = 3;
  2213.   ListView_SetItem(hWnd, &lvi );
  2214.   
  2215.   FileTimeToSystemTime( &le->Time, &st );
  2216.     lvi.cchTextMax = wsprintf( szText, 
  2217.                              "%02d.%02d.%02d %02d:%02d",
  2218.                                       st.wDay,
  2219.                                       st.wMonth,
  2220.                                       st.wYear,
  2221.                                       st.wHour,
  2222.                                       st.wMinute );
  2223.   lvi.pszText = szText; 
  2224.   lvi.iSubItem = 4;
  2225.   ListView_SetItem(hWnd, &lvi );
  2226.  
  2227.   lvi.pszText = le->szFind; 
  2228.   lvi.cchTextMax = lstrlen(lvi.pszText);
  2229.   lvi.iSubItem = 5;
  2230.   ListView_SetItem(hWnd, &lvi );
  2231.  
  2232.     lvi.cchTextMax = wsprintf( szText, "%ld", le->lPos );
  2233.     lvi.pszText = szText; 
  2234.   lvi.iSubItem = 6;
  2235.   ListView_SetItem(hWnd, &lvi );
  2236.   ReleaseMutex( hArrayMutex );
  2237. }
  2238.  
  2239. bool InsertMatch( THREADPARAMETERS *p, WIN32_FIND_DATA *lpwfd, LPSTR lpPath, LPSTR lpFind, long lFilePos )
  2240. {
  2241.     SHFILEINFO sfi;
  2242.   int i;
  2243.  
  2244.   if( iNumEntries == 10000 )
  2245.   {
  2246.     MessageBox( p->hwndDlg, "Mehr als 10.000 EintrΣge. Bitte SchrΣnken SIe das Suchergebnis ein!", "", MB_ICONSTOP | MB_OK );
  2247.     return false;
  2248.   }
  2249.  
  2250.   lstrcpy( List[iNumEntries].szPath, lpPath);
  2251.   AppendDirSep( List[iNumEntries].szPath );
  2252.   List[iNumEntries].lFileNameStart = lstrlen(List[iNumEntries].szPath); 
  2253.     lstrcat( List[iNumEntries].szPath, lpwfd->cFileName );
  2254.   
  2255.   lstrcpy( List[iNumEntries].szFind, lpFind);
  2256.   List[iNumEntries].lPath = List[iNumEntries].lFileNameStart + lstrlen( lpwfd->cFileName );
  2257.   List[iNumEntries].lSize = lpwfd->nFileSizeLow;
  2258.   
  2259.   
  2260.   i = lstrlen( lpwfd->cFileName );
  2261.   CharUpperBuff(lpwfd->cFileName, i);
  2262.   i--;
  2263.  
  2264.   List[iNumEntries].iType = -1;
  2265.   while( i > 0 )
  2266.   {
  2267.     if( lpwfd->cFileName[i] == '.' )
  2268.     {
  2269.       int iItem;
  2270.  
  2271.       iItem = SendMessage( p->hFileExtensions, LB_FINDSTRING, -1, (LPARAM)&lpwfd->cFileName[i] );
  2272.       if( iItem != LB_ERR )
  2273.         List[iNumEntries].iType = SendMessage( p->hFileExtensions, LB_GETITEMDATA, iItem, 0L );
  2274.       break;
  2275.     }
  2276.     i--;
  2277.   }
  2278.     
  2279.   SHGetFileInfo(List[iNumEntries].szPath,0,&sfi,sizeof(sfi),SHGFI_SYSICONINDEX);
  2280.   List[iNumEntries].iIcon = sfi.iIcon;
  2281.  
  2282.     FileTimeToLocalFileTime( &lpwfd->ftLastWriteTime, &List[iNumEntries].Time );
  2283.   List[iNumEntries].lPos = lFilePos;
  2284.  
  2285.   InsertItem( p->hResults, p->hFileTypesCombo, &List[iNumEntries] );
  2286.  
  2287.   iNumEntries++;
  2288.   return true;
  2289. }
  2290.  
  2291. void FillListView( HWND hWndList, HWND hFileTypesCombo, HWND hStatusBar )
  2292. {
  2293.   int i;
  2294.   char szText[256];
  2295.  
  2296.   WaitForSingleObject( hArrayMutex, INFINITE );
  2297.   ListView_DeleteAllItems( hWndList );
  2298.   for( i = 0; i < iNumEntries; i++ )
  2299.     InsertItem( hWndList, hFileTypesCombo, &List[i] );    
  2300.   ReleaseMutex( hArrayMutex );
  2301.  
  2302.   i = ListView_GetItemCount(hWndList);
  2303.   if( i == 1 )
  2304.     wsprintf( szText, "1 Vorkommnis gefunden" );
  2305.   else
  2306.     wsprintf( szText, "%ld Vorkommnisse gefunden", i );
  2307.  
  2308.   SendMessage( hStatusBar, SB_SETTEXT, 255, (LPARAM)szText );
  2309. }
  2310.  
  2311. void SearchDirectory( THREADPARAMETERS *p, LPSTR lpPath )
  2312. {
  2313.   char szPath[MAX_PATH+1];
  2314.   char szPath2[MAX_PATH + 20]; // kleine Sicherheitsa┤marge fⁿr Text
  2315.   
  2316.   HANDLE hDir;
  2317.   WIN32_FIND_DATA wfd, wfd2;
  2318.  
  2319.   lstrcpy( szPath, lpPath );
  2320.   AppendDirSep( szPath );
  2321.  
  2322.   lstrcpy( szPath2, "Suche ");
  2323.   lstrcat( szPath2, szPath);
  2324.   SendMessage( p->hStatusBar, SB_SETTEXT, 255, (LPARAM)szPath2 );
  2325.  
  2326.   lstrcat( szPath, "*.*" ); // xxx
  2327.   hDir = FindFirstFile( szPath, &wfd );
  2328.  
  2329.   if( hDir != INVALID_HANDLE_VALUE )
  2330.   {                             
  2331.     do
  2332.     {
  2333.       if( g_hStopSempahore )
  2334.         break;
  2335.  
  2336.       if( wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY )
  2337.       {
  2338.         if( p->bRecurseDirectories )
  2339.         {
  2340.           if( wfd.cFileName[0] != '.' )  // "." und ".." ignorieren
  2341.           {
  2342.             lstrcpy( szPath2, lpPath );
  2343.             AppendDirSep( szPath2 );
  2344.             lstrcat( szPath2, wfd.cFileName );
  2345.             SearchDirectory( p, szPath2 );
  2346.           }
  2347.         }
  2348.       }
  2349.       else
  2350.       {
  2351.         if( p->bDate )
  2352.         {
  2353.           FILETIME ft;
  2354.           FileTimeToLocalFileTime( &wfd.ftCreationTime, &ft );
  2355.           if( CompareFileTime( &ft, &p->dateVon ) < 0 )
  2356.             continue; // aktuelle Datei skippen
  2357.           if( CompareFileTime( &ft, &p->dateBis ) > 0 )
  2358.             continue; // aktuelle Datei skippen
  2359.         }
  2360.  
  2361.         if( p->bSize )
  2362.         {
  2363.           switch( p->bSameSize )  // 0 = gleich, -1, minimal, 1 = maximal
  2364.           {
  2365.             case 0:
  2366.               // Binary shift wΣre effizienter
  2367.               if( ( (wfd.nFileSizeLow + 1023L) / 1024L ) != p->lKByte )
  2368.                 continue;
  2369.             break;
  2370.             case -1:
  2371.               // minmal (kleinere dateien fallen raus)
  2372.               if( ( (wfd.nFileSizeLow + 1023L) / 1024L ) < p->lKByte )
  2373.                 continue;
  2374.             break;
  2375.             case 1:
  2376.               // maximal (gr÷▀ere dateien fallen raus)
  2377.               if( ( (wfd.nFileSizeLow + 1023L) / 1024L ) > p->lKByte )
  2378.                 continue;
  2379.             break;
  2380.           }
  2381.         }
  2382.  
  2383.         if( p->lFileTypeEnd > p->lFileTypeStart )
  2384.         {
  2385.           long l;
  2386.           long sl1, sl2, i1, i2;
  2387.           BOOL bFound;
  2388.         
  2389.           sl1 = lstrlen( wfd.cFileName );
  2390.  
  2391.           bFound = FALSE;
  2392.           for( l = p->lFileTypeStart; (l < p->lFileTypeEnd) && (!bFound); l++ )
  2393.           {
  2394.             char szMask[256];
  2395.           
  2396.             sl2 = SendMessage( p->hFileTypes, LB_GETTEXT, l, (LPARAM)szMask );
  2397.             i1 = sl1-1;
  2398.             i2 = sl2-1;
  2399.  
  2400.             while( (i1>=0) && (i2>=0) )
  2401.             {
  2402.               if( toupper( szMask[i2] ) != toupper( wfd.cFileName[i1] ) )
  2403.                 break;
  2404.               if( szMask[i2] == '.' ) 
  2405.               {
  2406.                 bFound = TRUE;
  2407.                 break;
  2408.               }
  2409.               i1--;
  2410.               i2--;
  2411.             }
  2412.           }
  2413.           if( !bFound ) 
  2414.             continue;
  2415.         }
  2416.  
  2417.         if( p->szName[0] )
  2418.         {
  2419.           int i;
  2420.           bool bFound;
  2421.           i = 0;
  2422.           bFound = false;
  2423.           wfd2 = wfd;
  2424.           CharUpperBuff( wfd2.cFileName, lstrlen(wfd.cFileName) );
  2425.           
  2426.           while( p->szName[i] )
  2427.           {
  2428.             if( CompareWildcard( wfd2.cFileName, &p->szName[i] ) )
  2429.             {
  2430.               bFound = true;
  2431.               break;
  2432.             }
  2433.             while( !ISDELIMITER( p->szName[i] ) ) i++;
  2434.             if( p->szName[i] ) i++;
  2435.           }
  2436.           if( !bFound ) 
  2437.             continue;
  2438.         }
  2439.  
  2440.         //FILETIME ftCreationTime; 
  2441.         //FILETIME ftLastAccessTime; 
  2442.         //FILETIME ftLastWriteTime; 
  2443.         //DWORD    nFileSizeHigh; 
  2444.         //DWORD    nFileSizeLow; 
  2445.         //DWORD    dwReserved0; 
  2446.         //DWORD    dwReserved1; 
  2447.         //TCHAR    cFileName[ MAX_PATH ]; 
  2448.         //TCHAR    cAlternateFileName[ 14 ]; 
  2449.         //} WIN32_FIND_DATA;             
  2450.  
  2451.         lstrcpy( szPath2, lpPath );
  2452.         AppendDirSep( szPath2 );
  2453.         lstrcat( szPath2, wfd.cFileName );
  2454.  
  2455.         if( p->Pattern )
  2456.         {
  2457.           if( p->cp.open( szPath2, p->bUpperCase ) )
  2458.           {
  2459.             unsigned char c;
  2460.             DWORD lPerc;
  2461.             char szPerc[10];
  2462.             long lFilePos;
  2463.  
  2464.             wsprintf( szPerc, " (%ld%%)", 0);
  2465.  
  2466.             lstrcpy( szPath2, "Suche ");
  2467.             lstrcat( szPath2, lpPath);
  2468.                       AppendDirSep( szPath2 );
  2469.                       lstrcat( szPath2, wfd.cFileName );
  2470.                       lstrcat( szPath2, szPerc );
  2471.                       SendMessage( p->hStatusBar, SB_SETTEXT, 255, (LPARAM)szPath2 );
  2472.                       lPerc = 0;
  2473.  
  2474.             while(true)
  2475.             {
  2476.                           if( wfd.nFileSizeLow )
  2477.                               if( ( ( p->cp.lReadPos * 100 ) / wfd.nFileSizeLow ) != lPerc )
  2478.                               {
  2479.                                   lPerc = ( p->cp.lReadPos * 100 ) / wfd.nFileSizeLow;
  2480.                                   wsprintf( szPerc, " (%ld%%)", lPerc);
  2481.                                   lstrcpy( szPath2, "Suche ");
  2482.                                   lstrcat( szPath2, lpPath);
  2483.                                   AppendDirSep( szPath2 );
  2484.                                   lstrcat( szPath2, wfd.cFileName );
  2485.                                   lstrcat( szPath2, szPerc );
  2486.                                   SendMessage( p->hStatusBar, SB_SETTEXT, 255, (LPARAM)szPath2 );
  2487.                               }
  2488.               lFilePos = p->cp.lReadPos;
  2489.               if( p->Pattern->match( &p->cp ) ) // Len
  2490.               {
  2491.                 char szFind[256];
  2492.                 long lSavePos;
  2493.                 DWORD dwRead;
  2494.                 DWORD i;
  2495.  
  2496.                 lSavePos = SetFilePointer( p->cp.hFile, 0, NULL, FILE_CURRENT );
  2497.  
  2498.                 SetFilePointer( p->cp.hFile, lFilePos, NULL, FILE_BEGIN );
  2499.                 dwRead = 25;
  2500.                 if( !ReadFile( p->cp.hFile, szFind, dwRead, (DWORD*)&dwRead, NULL ) )
  2501.                   dwRead = 0L;
  2502.                 SetFilePointer( p->cp.hFile, lSavePos, NULL, FILE_BEGIN );
  2503.  
  2504.                 szFind[dwRead]=0;
  2505.                 for( i = 0; i < dwRead; i++ )
  2506.                   if( !isprint(szFind[i]) )
  2507.                     szFind[i] = '.';
  2508.  
  2509.                 if( !InsertMatch( p, &wfd, lpPath, szFind, lFilePos ) )
  2510.                 {
  2511.                   p->cp.close();
  2512.                   FindClose( hDir );
  2513.                   if( g_hStopSempahore )
  2514.                     ReleaseSemaphore( g_hStopSempahore,1,NULL );
  2515.                   return;
  2516.                 }
  2517.               }
  2518.  
  2519.               if( !p->cp.getchar(&c) ) 
  2520.                 break;
  2521.             }
  2522.             p->cp.close();
  2523.           }
  2524.         }
  2525.         else
  2526.         {
  2527.           if( !InsertMatch( p, &wfd, lpPath, "", 0 ) )
  2528.           {
  2529.             FindClose( hDir );                  
  2530.             if( g_hStopSempahore )
  2531.               ReleaseSemaphore( g_hStopSempahore,1,NULL );
  2532.             return;
  2533.           }
  2534.         }
  2535.       }
  2536.     }
  2537.     while( FindNextFile( hDir, &wfd ) );
  2538.     FindClose( hDir );
  2539.   }
  2540.   
  2541.   if( g_hStopSempahore )
  2542.     ReleaseSemaphore( g_hStopSempahore,1,NULL );
  2543. }
  2544.  
  2545. DWORD WINAPI SearchThreadProc( LPVOID lpParameter )
  2546. {
  2547.   THREADPARAMETERS *p;
  2548.  
  2549.   p = (THREADPARAMETERS*) lpParameter;
  2550.   
  2551.   iNumEntries = 0;  // Keine EintrΣge
  2552.   SearchDirectory( p, p->szDirectory);
  2553.   StopSuche( p, FALSE );
  2554.   
  2555.   return 1;
  2556. }
  2557.  
  2558.  
  2559. void UpdateTab( HWND hwndDlg )
  2560. {
  2561.   int iActTab;
  2562.   iActTab = SendMessage( GetDlgItem( hwndDlg, IDC_TAB ), TCM_GETCURSEL, 0, 0 );
  2563.   if( iActTab < 0 ) iActTab = 0;
  2564.  
  2565.   ShowWindow( GetDlgItem( hwndDlg, IDC_STATICNAME ), iActTab == 0 );
  2566.   ShowWindow( GetDlgItem( hwndDlg, IDC_COMBONAME ), iActTab == 0 );
  2567.   ShowWindow( GetDlgItem( hwndDlg, IDC_STATICMUSTER ), iActTab == 0 );
  2568.   ShowWindow( GetDlgItem( hwndDlg, IDC_COMBOMUSTER ), iActTab == 0 );
  2569.   ShowWindow( GetDlgItem( hwndDlg, IDC_STATICSUCHENIN ),iActTab == 0 );
  2570.   ShowWindow( GetDlgItem( hwndDlg, IDC_DURCHSUCHEN ), iActTab == 0 );
  2571.   ShowWindow( GetDlgItem( hwndDlg, IDC_COMBOSUCHENIN ), iActTab == 0 );
  2572.   ShowWindow( GetDlgItem( hwndDlg, IDC_RECURSEDIR ), iActTab == 0 );
  2573.     ShowWindow( GetDlgItem( hwndDlg, IDC_GROSSKLEIN ), iActTab == 0 );
  2574.     ShowWindow( GetDlgItem( hwndDlg, IDC_UNICODE ), iActTab == 0 );
  2575.   ShowWindow( GetDlgItem( hwndDlg, IDC_WINDOWSSYNTAX ), iActTab == 0 );
  2576.  
  2577.     ShowWindow( GetDlgItem( hwndDlg, IDC_ALLEDATEIEN ), iActTab == 1 );
  2578.     ShowWindow( GetDlgItem( hwndDlg, IDC_DATEIDATUM ), iActTab == 1 );
  2579.     ShowWindow( GetDlgItem( hwndDlg, IDC_ZWISCHEN ), iActTab == 1 );
  2580.     ShowWindow( GetDlgItem( hwndDlg, IDC_EDITVON ), iActTab == 1 );
  2581.     ShowWindow( GetDlgItem( hwndDlg, IDC_EDITBIS ), iActTab == 1 );
  2582.     ShowWindow( GetDlgItem( hwndDlg, IDC_LETZTEMONATE ), iActTab == 1 );
  2583.     ShowWindow( GetDlgItem( hwndDlg, IDC_EDITLETZTEMONATE ), iActTab == 1 );
  2584.     ShowWindow( GetDlgItem( hwndDlg, IDC_SPINLETZTEMONATE ), iActTab == 1 );
  2585.     ShowWindow( GetDlgItem( hwndDlg, IDC_LETZTETAGE ), iActTab == 1 );
  2586.     ShowWindow( GetDlgItem( hwndDlg, IDC_EDITLETZTETAGE ), iActTab == 1 );
  2587.     ShowWindow( GetDlgItem( hwndDlg, IDC_LETZTETAGE ), iActTab == 1 );
  2588.     ShowWindow( GetDlgItem( hwndDlg, IDC_SPINLETZTETAGE ), iActTab == 1 );
  2589.     ShowWindow( GetDlgItem( hwndDlg, IDC_STATICUND ), iActTab == 1 );
  2590.     ShowWindow( GetDlgItem( hwndDlg, IDC_STATICLETZTEMONATE ), iActTab == 1 );
  2591.     ShowWindow( GetDlgItem( hwndDlg, IDC_STATICLETZTETAGE ), iActTab == 1 );
  2592.  
  2593.     ShowWindow( GetDlgItem( hwndDlg, IDC_STATICTYP ), iActTab == 2 );
  2594.     ShowWindow( GetDlgItem( hwndDlg, IDC_COMBOTYP ), iActTab == 2 );
  2595.     ShowWindow( GetDlgItem( hwndDlg, IDC_STATICGROESSE ), iActTab == 2 );
  2596.     ShowWindow( GetDlgItem( hwndDlg, IDC_COMBOGROESSE ), iActTab == 2 );
  2597.     ShowWindow( GetDlgItem( hwndDlg, IDC_EDITGROESSE ), iActTab == 2 );
  2598.     ShowWindow( GetDlgItem( hwndDlg, IDC_SPINGROESSE ), iActTab == 2 );
  2599.     ShowWindow( GetDlgItem( hwndDlg, IDC_STATICKB ), iActTab == 2 );
  2600. }
  2601.  
  2602. void SetTab( HWND hwndDlg, int i )
  2603. {
  2604.   SendMessage( GetDlgItem( hwndDlg, IDC_TAB ), TCM_SETCURSEL, i, 0 );
  2605.   UpdateTab( hwndDlg );
  2606. }
  2607.  
  2608. BOOL GetDigit( LPSTR szText, int *i, int *v )
  2609. {
  2610.     BOOL bDigit;
  2611.     bDigit = FALSE;
  2612.     *v = 0;
  2613.     while( isdigit( szText[*i] ) )
  2614.     {
  2615.         *v *= 10;
  2616.         *v += szText[*i] - '0';
  2617.         (*i)++;
  2618.         bDigit = TRUE;
  2619.     }
  2620.     return bDigit;
  2621. }
  2622.  
  2623. BOOL GetDate( HWND hwndDlg, HWND hwndDateEdit, SYSTEMTIME *st )
  2624. {
  2625.     int i,d,m,y;
  2626.     BOOL bCorrect;
  2627.   char szDate[256];
  2628.  
  2629.   memset( st, 0, sizeof( SYSTEMTIME ) );
  2630.  
  2631.   if( !GetWindowText( hwndDateEdit, szDate, sizeof(szDate)) ) 
  2632.   {
  2633.     MessageBox( hwndDlg, "Bitte geben Sie ein gⁿltiges Datum bzw. einen gⁿltigen Datumsbereich ein!", "Dasteien suchen", MB_OK | MB_ICONSTOP );
  2634.         SetTab( hwndDlg, 1 );
  2635.     SetFocus( hwndDateEdit );
  2636.         return FALSE;
  2637.   }
  2638.  
  2639.     i=0;
  2640.     bCorrect = FALSE;
  2641.     if( GetDigit( szDate, &i, &d ) ) // Tag
  2642.         if( szDate[i]=='.' )
  2643.         {
  2644.             i++;
  2645.             if( GetDigit( szDate, &i, &m ) ) // Monat
  2646.                 if( szDate[i]=='.' )
  2647.                 {    
  2648.                     i++;
  2649.                     if( GetDigit( szDate, &i, &y ) ) // Jahr
  2650.                         bCorrect = TRUE;
  2651.                 }
  2652.         }
  2653.  
  2654.     if( !bCorrect )
  2655.     {
  2656.         MessageBox( hwndDlg, "Bitte geben Sie ein gⁿltiges Datum bzw. einen gⁿltigen Datumsbereich ein!", "Dasteien suchen", MB_OK | MB_ICONSTOP );
  2657.         SetTab( hwndDlg, 1 );
  2658.     SetFocus( hwndDateEdit );
  2659.         return FALSE;
  2660.     }
  2661.     
  2662.   st->wYear = y; 
  2663.   if( st->wYear < 51 ) // 50 == 2050, 51 == 1951
  2664.       st->wYear+= 2000;
  2665.   else
  2666.       if( st->wYear < 100 )
  2667.           st->wYear += 1900;
  2668.  
  2669.   if( st->wYear < 1980 )
  2670.   {
  2671.         MessageBox( hwndDlg, "Bitte wΣhlen Sie ein Datum ab dem 1.1.1980!" , "Dateien suchen", MB_OK | MB_ICONSTOP );
  2672.         SetTab( hwndDlg, 1 );
  2673.     SetFocus( hwndDateEdit );
  2674.         return FALSE;
  2675.   }
  2676.  
  2677.   if( st->wYear >= 2100 )
  2678.   {
  2679.         MessageBox( hwndDlg, "Bitte wΣhlen Sie ein Datum bis zum 31.12.2099!" , "Dateien suchen", MB_OK | MB_ICONSTOP );
  2680.         SetTab( hwndDlg, 1 );
  2681.     SetFocus( hwndDateEdit );
  2682.         return FALSE;
  2683.   }
  2684.  
  2685.   iMonth[1]=28;  // Moinatsarray auf Korrekten Februar setzen 
  2686.     if( !( y % 4 ) )  // Teilbar durch 4
  2687.     {
  2688.         if( ( y % 100 ) == 0 )    // Alle Hundertjahre fΣllt das Schaltjahr aus 
  2689.         {
  2690.             if( (y % 400 ) == 0 )   // Alle vierhunderter allerdings dann doch wieder
  2691.         iMonth[1]=29; // Tausender sind doich Schaltjahre
  2692.         }
  2693.         else
  2694.             iMonth[1]=29;
  2695.     }
  2696.  
  2697.     m--;
  2698.     if( ( m >= 0 ) && ( m < 11 ) )
  2699.     {
  2700.         d--;
  2701.         if( ( d >= 0 ) && ( d < iMonth[m] ) )
  2702.         {
  2703.             if( ( y >= 1980 ) && ( y <= 2100 ) )
  2704.             {                            
  2705.                 st->wMonth        = m + 1; 
  2706.                 st->wDayOfWeek    = 0; 
  2707.                 st->wDay          = d + 1; 
  2708.                 st->wHour         = 0; 
  2709.                 st->wMinute       = 0; 
  2710.                 st->wSecond       = 0; 
  2711.                 st->wMilliseconds = 0; 
  2712.                 bCorrect = TRUE;
  2713.             }
  2714.         }
  2715.     else
  2716.     {
  2717.       MessageBox( hwndDlg, "Ungⁿltige Tagesangabe!" , "Dateien suchen", MB_OK | MB_ICONSTOP );
  2718.       SetTab( hwndDlg, 1 );
  2719.       SetFocus( hwndDateEdit );
  2720.           return FALSE;
  2721.     }
  2722.     }
  2723.   else
  2724.   {
  2725.     MessageBox( hwndDlg, "Ungⁿltige Monatsangabe!" , "Dateien suchen", MB_OK | MB_ICONSTOP );
  2726.         SetTab( hwndDlg, 1 );
  2727.     SetFocus( hwndDateEdit );
  2728.         return FALSE;
  2729.   }
  2730.     return bCorrect;
  2731. }
  2732.  
  2733. void SizeWindow( HWND hwndDlg, int iResultHeight, BOOL bCalcResultHeight )
  2734. {
  2735.   RECT rWindow, rButton, rTab, rControl, rNewWindow;
  2736.   int w, h, dlux, dluy, x, y,xx;
  2737.     
  2738.   GetClientRect( hwndDlg, &rWindow );
  2739.   w = rWindow.right - rWindow.left;
  2740.   h = rWindow.bottom - rWindow.top;
  2741.   
  2742.   dlux = LOWORD( GetDialogBaseUnits() );
  2743.   dluy = HIWORD( GetDialogBaseUnits() );
  2744.  
  2745.   GetClientRect( GetDlgItem( hwndDlg, IDC_SUCHESTARTEN ), &rButton );
  2746.   x = ( w - ( 7 * dlux ) / 4 ) - ( rButton.right - rButton.left );
  2747.   y = (7 + 7) * dluy/8;
  2748.   MoveWindow( GetDlgItem( hwndDlg, IDC_SUCHESTARTEN ), x, y, ( rButton.right - rButton.left ), 12*dluy/8, TRUE );
  2749.  
  2750.   y += (12+4) * dluy/8;
  2751.   GetClientRect( GetDlgItem( hwndDlg, IDC_SUCHEANHALTEN ), &rButton );
  2752.   MoveWindow( GetDlgItem( hwndDlg, IDC_SUCHEANHALTEN ), x, y, ( rButton.right - rButton.left ), 12*dluy/8, TRUE );
  2753.  
  2754.   y += (12+4) * dluy/8;
  2755.   GetClientRect( GetDlgItem( hwndDlg, IDC_NEUESUCHE ), &rButton );
  2756.   MoveWindow( GetDlgItem( hwndDlg, IDC_NEUESUCHE ), x, y, ( rButton.right - rButton.left ), 12*dluy/8, TRUE );
  2757.     
  2758.   GetClientRect( GetDlgItem( hwndDlg, IDC_SUCHESTARTEN ), &rButton );
  2759.     
  2760.   rTab.left = 7 * dlux/4;
  2761.   rTab.top = 4 * dluy/8;
  2762.   rTab.right = x - 7*dlux/4;
  2763.   rTab.bottom = rTab.top + ((5+8*14)*dluy/8);
  2764.   MoveWindow( GetDlgItem( hwndDlg, IDC_TAB ), rTab.left, rTab.top, rTab.right - rTab.left,rTab.bottom -rTab.top, TRUE );
  2765.  
  2766.   // Tab 0
  2767.   GetWindowRect( GetDlgItem( hwndDlg, IDC_STATICNAME ), &rControl );
  2768.   x = rTab.left + 7 * dlux/4;
  2769.   y = rTab.top + (5+14)*dluy/8;
  2770.   MoveWindow( GetDlgItem( hwndDlg,IDC_STATICNAME ), x, y, rControl.right-rControl.left,12*dluy/8,TRUE );
  2771.  
  2772.   x += rControl.right-rControl.left + 7*dlux/4;
  2773.   MoveWindow( GetDlgItem( hwndDlg,IDC_COMBONAME ), x, y,(rTab.right - 7*dlux/4)-x,5*12*dluy/8, TRUE);
  2774.  
  2775.   GetWindowRect( GetDlgItem( hwndDlg, IDC_STATICMUSTER ), &rControl );
  2776.   x = rTab.left + 7 * dlux/4;
  2777.   y = rTab.top + (5+2*14)*dluy/8;
  2778.   MoveWindow( GetDlgItem( hwndDlg,IDC_STATICMUSTER ), x, y, rControl.right-rControl.left,12*dluy/8,TRUE );
  2779.  
  2780.   x += rControl.right-rControl.left + 7*dlux/4;
  2781.   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
  2782.  
  2783.   GetWindowRect( GetDlgItem( hwndDlg, IDC_STATICSUCHENIN ), &rControl );
  2784.     
  2785.   GetWindowRect( GetDlgItem( hwndDlg, IDC_DURCHSUCHEN ), &rButton );
  2786.   x = rTab.right -7 * dlux/4 - ( rButton.right - rButton.left );
  2787.   y = rTab.top + (5+3*14)*dluy/8;
  2788.   MoveWindow( GetDlgItem( hwndDlg, IDC_DURCHSUCHEN ), x,y,rButton.right-rButton.left, 12*dluy/8, TRUE);
  2789.   rButton.left = x;
  2790.  
  2791.   x = rTab.left + 7 * dlux/4;
  2792.   MoveWindow( GetDlgItem( hwndDlg,IDC_STATICSUCHENIN ), x, y, (rControl.right-rControl.left),12*dluy/8,TRUE );
  2793.  
  2794.   x += rControl.right-rControl.left + 7*dlux/4;
  2795.   MoveWindow( GetDlgItem( hwndDlg, IDC_COMBOSUCHENIN ), x, y,(rButton.left - 7*dlux/4) - x, 5 * 12*dluy/8, TRUE);
  2796.  
  2797.   y = rTab.top + (5+4*14)*dluy/8;
  2798.   xx = x;
  2799.   GetWindowRect( GetDlgItem( hwndDlg, IDC_RECURSEDIR ), &rControl );
  2800.   MoveWindow( GetDlgItem( hwndDlg, IDC_RECURSEDIR ), x, y,(rControl.right-rControl.left), 12*dluy/8, TRUE);
  2801.  
  2802.   y = rTab.top + (5+4*14 + 12)*dluy/8;
  2803.   GetWindowRect( GetDlgItem( hwndDlg, IDC_GROSSKLEIN ), &rControl );
  2804.   MoveWindow( GetDlgItem( hwndDlg, IDC_GROSSKLEIN ), x, y,(rControl.right-rControl.left), 12*dluy/8, TRUE);
  2805.  
  2806.   y = rTab.top + (5+4*14 + 24)*dluy/8;
  2807.   GetWindowRect( GetDlgItem( hwndDlg, IDC_UNICODE ), &rControl );
  2808.   MoveWindow( GetDlgItem( hwndDlg, IDC_UNICODE ), x, y,(rControl.right-rControl.left), 12*dluy/8, TRUE);
  2809.  
  2810.   y = rTab.top + (5+4*14 + 36)*dluy/8;
  2811.   GetWindowRect( GetDlgItem( hwndDlg, IDC_WINDOWSSYNTAX ), &rControl );
  2812.   MoveWindow( GetDlgItem( hwndDlg, IDC_WINDOWSSYNTAX ), x, y,(rControl.right-rControl.left), 12*dluy/8, TRUE);
  2813.  
  2814.   // Tab 1
  2815.   x = rTab.left + 7 * dlux/4;
  2816.   y = rTab.top + (5+14)*dluy/8;
  2817.   GetWindowRect( GetDlgItem( hwndDlg, IDC_ALLEDATEIEN ), &rControl );
  2818.   MoveWindow( GetDlgItem( hwndDlg, IDC_ALLEDATEIEN ), x, y, rControl.right-rControl.left,12*dluy/8,TRUE );
  2819.  
  2820.   x = rTab.left + 7 * dlux/4;
  2821.   y += 14*dluy/8;
  2822.   GetWindowRect( GetDlgItem( hwndDlg, IDC_DATEIDATUM ), &rControl );
  2823.   MoveWindow( GetDlgItem( hwndDlg, IDC_DATEIDATUM ), x, y, rControl.right-rControl.left,12*dluy/8,TRUE );
  2824.  
  2825.   x = rTab.left + 14 * dlux/4;
  2826.   y += 14*dluy/8;
  2827.   GetWindowRect( GetDlgItem( hwndDlg, IDC_ZWISCHEN ), &rControl );
  2828.   MoveWindow( GetDlgItem( hwndDlg, IDC_ZWISCHEN ), x, y, rControl.right-rControl.left,12*dluy/8,TRUE );
  2829.  
  2830.   x += rControl.right-rControl.left + dlux/4;
  2831.   GetWindowRect( GetDlgItem( hwndDlg, IDC_EDITVON ), &rControl );
  2832.   MoveWindow( GetDlgItem( hwndDlg, IDC_EDITVON ), x, y, rControl.right-rControl.left,12*dluy/8,TRUE );
  2833.  
  2834.   x += rControl.right-rControl.left + dlux/4;
  2835.   GetWindowRect( GetDlgItem( hwndDlg, IDC_STATICUND ), &rControl );
  2836.   MoveWindow( GetDlgItem( hwndDlg, IDC_STATICUND ), x, y+dluy/3, rControl.right-rControl.left,12*dluy/8,TRUE );
  2837.   x += rControl.right-rControl.left + dlux/4;
  2838.  
  2839.   GetWindowRect( GetDlgItem( hwndDlg, IDC_EDITBIS ), &rControl );
  2840.   MoveWindow( GetDlgItem( hwndDlg, IDC_EDITBIS ), x, y, rControl.right-rControl.left,12*dluy/8,TRUE );
  2841.   xx = x;
  2842.  
  2843.   x = rTab.left + 14 * dlux/4;
  2844.   y += 14*dluy/8;
  2845.   GetWindowRect( GetDlgItem( hwndDlg, IDC_LETZTEMONATE ), &rControl );
  2846.   MoveWindow( GetDlgItem( hwndDlg, IDC_LETZTEMONATE ), x, y, rControl.right-rControl.left,12*dluy/8,TRUE );
  2847.  
  2848.   x += rControl.right-rControl.left + dlux/4;
  2849.   GetWindowRect( GetDlgItem( hwndDlg, IDC_EDITLETZTEMONATE ), &rControl );
  2850.   MoveWindow( GetDlgItem( hwndDlg, IDC_EDITLETZTEMONATE ), x, y, rControl.right-rControl.left,12*dluy/8,TRUE );
  2851.  
  2852.   x += rControl.right-rControl.left + dlux/4;
  2853.   GetWindowRect( GetDlgItem( hwndDlg, IDC_SPINLETZTEMONATE ), &rControl );
  2854.   MoveWindow( GetDlgItem( hwndDlg, IDC_SPINLETZTEMONATE ), x, y, rControl.right-rControl.left,12*dluy/8,TRUE );
  2855.  
  2856.   x = xx; //rControl.right-rControl.left + dlux/4;
  2857.   GetWindowRect( GetDlgItem( hwndDlg, IDC_STATICLETZTEMONATE ), &rControl );
  2858.   MoveWindow( GetDlgItem( hwndDlg, IDC_STATICLETZTEMONATE ), x, y+dluy/3, rControl.right-rControl.left,12*dluy/8,TRUE );
  2859.  
  2860.   x = rTab.left + 14 * dlux/4;
  2861.   y += 14*dluy/8;
  2862.   GetWindowRect( GetDlgItem( hwndDlg, IDC_LETZTETAGE ), &rControl );
  2863.   MoveWindow( GetDlgItem( hwndDlg, IDC_LETZTETAGE ), x, y, rControl.right-rControl.left,12*dluy/8,TRUE );
  2864.  
  2865.   x += rControl.right-rControl.left + dlux/4;
  2866.   GetWindowRect( GetDlgItem( hwndDlg, IDC_EDITLETZTETAGE ), &rControl );
  2867.   MoveWindow( GetDlgItem( hwndDlg, IDC_EDITLETZTETAGE ), x, y, rControl.right-rControl.left,12*dluy/8,TRUE );
  2868.  
  2869.     x += rControl.right-rControl.left + dlux/4;
  2870.     GetWindowRect( GetDlgItem( hwndDlg, IDC_SPINLETZTETAGE ), &rControl );
  2871.     MoveWindow( GetDlgItem( hwndDlg, IDC_SPINLETZTETAGE ), x, y, rControl.right-rControl.left,12*dluy/8,TRUE );
  2872.  
  2873.     x = xx; //rControl.right-rControl.left + dlux/4;
  2874.     GetWindowRect( GetDlgItem( hwndDlg, IDC_STATICLETZTETAGE ), &rControl );
  2875.     MoveWindow( GetDlgItem( hwndDlg, IDC_STATICLETZTETAGE ), x, y+dluy/3, rControl.right-rControl.left,12*dluy/8,TRUE );
  2876.  
  2877.   // Tab 2
  2878.   x = rTab.left + 7 * dlux/4;
  2879.   y = rTab.top + (5+14)*dluy/8;
  2880.     GetWindowRect( GetDlgItem( hwndDlg, IDC_STATICTYP ), &rControl );
  2881.   MoveWindow( GetDlgItem( hwndDlg, IDC_STATICTYP ), x, y, rControl.right-rControl.left,12*dluy/8,TRUE );
  2882.  
  2883.     x += rControl.right-rControl.left + dlux/4;
  2884.     GetWindowRect( GetDlgItem( hwndDlg, IDC_COMBOTYP ), &rControl );
  2885.     MoveWindow( GetDlgItem( hwndDlg, IDC_COMBOTYP ), x, y, rControl.right-rControl.left,6 * 12*dluy/8,TRUE );
  2886.  
  2887.     x = rTab.left + 7 * dlux/4;
  2888.   y += 14*dluy/8;
  2889.     GetWindowRect( GetDlgItem( hwndDlg, IDC_STATICGROESSE ), &rControl );
  2890.   MoveWindow( GetDlgItem( hwndDlg, IDC_STATICGROESSE ), x, y, rControl.right-rControl.left,12*dluy/8,TRUE );
  2891.  
  2892.     x += rControl.right-rControl.left + dlux/4;
  2893.     GetWindowRect( GetDlgItem( hwndDlg, IDC_COMBOGROESSE ), &rControl );
  2894.     MoveWindow( GetDlgItem( hwndDlg, IDC_COMBOGROESSE ), x, y, rControl.right-rControl.left,3 * 12*dluy/8,TRUE );
  2895.  
  2896.     x += rControl.right-rControl.left + dlux/4;
  2897.     GetWindowRect( GetDlgItem( hwndDlg, IDC_EDITGROESSE ), &rControl );
  2898.     MoveWindow( GetDlgItem( hwndDlg, IDC_EDITGROESSE ), x, y, rControl.right-rControl.left,12*dluy/8,TRUE );
  2899.  
  2900.     x += rControl.right-rControl.left + dlux/4;
  2901.     GetWindowRect( GetDlgItem( hwndDlg, IDC_SPINGROESSE ), &rControl );
  2902.     MoveWindow( GetDlgItem( hwndDlg, IDC_SPINGROESSE ), x, y, rControl.right-rControl.left,12*dluy/8,TRUE );
  2903.  
  2904.     x += rControl.right-rControl.left + dlux/4;
  2905.     GetWindowRect( GetDlgItem( hwndDlg, IDC_STATICKB ), &rControl );
  2906.   MoveWindow( GetDlgItem( hwndDlg, IDC_STATICKB ), x, y, rControl.right-rControl.left,12*dluy/8,TRUE );
  2907.  
  2908.   rNewWindow.left = 0;
  2909.   rNewWindow.top = 0;
  2910.   rNewWindow.right = 0;
  2911.   rNewWindow.bottom = 0;
  2912.   AdjustWindowRect(&rNewWindow, GetWindowLong( hwndDlg, GWL_STYLE), TRUE );
  2913.   h = rNewWindow.bottom - rNewWindow.top;
  2914.  
  2915.   rNewWindow.left = 0;
  2916.   rNewWindow.top = 0;
  2917.   rNewWindow.right = w;
  2918.   rNewWindow.bottom = rTab.bottom +  4*dluy/8;
  2919.  
  2920.   if( bCalcResultHeight )
  2921.     iResultHeight -= (rNewWindow.bottom-h);
  2922.  
  2923.   if( iResultHeight < h+20 )
  2924.     iResultHeight = 0;
  2925.  
  2926.   if( iResultHeight )
  2927.   {
  2928.     int iList;
  2929.     int iTop;
  2930.     if( iResultHeight <= 0 ) iResultHeight = 100;
  2931.     iList = iResultHeight - h; // WindowFrame H÷he abziehen
  2932.     iTop = rNewWindow.bottom;
  2933.     rNewWindow.bottom += iList;
  2934.  
  2935.     MoveWindow( g_hStatusBar, 
  2936.                 0,
  2937.                 rNewWindow.bottom-(rControl.bottom- rControl.top),
  2938.                 w,
  2939.                 (rControl.bottom- rControl.top), 
  2940.                 TRUE);
  2941.     iResultHeight = rNewWindow.bottom - iTop + h;
  2942.     
  2943.     if( bCalcResultHeight )
  2944.       g_iResultHeight = iResultHeight;
  2945.  
  2946.     MoveWindow( GetDlgItem( hwndDlg, IDC_RESULTS ),
  2947.                 0,
  2948.                 rTab.bottom + 4 * dluy/8, 
  2949.                 w,
  2950.                 iResultHeight-(h+(rControl.bottom- rControl.top)) + 2 * dluy/8, TRUE );
  2951.  
  2952.     ShowWindow( GetDlgItem( hwndDlg, IDC_RESULTS ), SW_SHOW );
  2953.     ShowWindow( g_hStatusBar, SW_SHOW );
  2954.   }
  2955.   else
  2956.   {
  2957.     ShowWindow( GetDlgItem( hwndDlg, IDC_RESULTS ), SW_HIDE );
  2958.     ShowWindow( g_hStatusBar, SW_HIDE );
  2959.   }
  2960.  
  2961.   AdjustWindowRect(&rNewWindow, GetWindowLong( hwndDlg, GWL_STYLE), TRUE );
  2962.   GetWindowRect( hwndDlg, &rWindow );
  2963.   MoveWindow( hwndDlg, rWindow.left, rWindow.top,  rNewWindow.right-rNewWindow.left, rNewWindow.bottom-rNewWindow.top, TRUE );
  2964. }
  2965.  
  2966. void SetView( HWND hwndDlg, int id )
  2967. {
  2968.   DWORD dwStyle;
  2969.  
  2970.   dwStyle = GetWindowLong( GetDlgItem( hwndDlg, IDC_RESULTS ), GWL_STYLE );
  2971.   dwStyle &= ~(LVS_ICON|LVS_LIST|LVS_REPORT|LVS_SMALLICON);
  2972.   switch( id )
  2973.   {
  2974.     case ID_ANSICHTGROSSESYMBOLE:
  2975.       dwStyle |= LVS_ICON;
  2976.     break;
  2977.     case ID_ANSICHTKLEINESYMBOLE:
  2978.       dwStyle |= LVS_SMALLICON;
  2979.     break;
  2980.     case ID_ANSICHTLISTE:
  2981.       dwStyle |= LVS_LIST;
  2982.     break;
  2983.     case ID_ANSICHTDETAILS:
  2984.       dwStyle |= LVS_REPORT;
  2985.     break;
  2986.   }
  2987.   SetWindowLong( GetDlgItem( hwndDlg, IDC_RESULTS ), GWL_STYLE, dwStyle );
  2988.   CheckMenuItem( GetMenu( hwndDlg), ID_ANSICHTGROSSESYMBOLE,MF_BYCOMMAND | (ID_ANSICHTGROSSESYMBOLE==id) ? MF_CHECKED : MF_UNCHECKED );
  2989.   CheckMenuItem( GetMenu( hwndDlg), ID_ANSICHTKLEINESYMBOLE,MF_BYCOMMAND | (ID_ANSICHTKLEINESYMBOLE==id) ? MF_CHECKED : MF_UNCHECKED );
  2990.   CheckMenuItem( GetMenu( hwndDlg), ID_ANSICHTLISTE,MF_BYCOMMAND | (ID_ANSICHTLISTE==id) ? MF_CHECKED : MF_UNCHECKED );
  2991.   CheckMenuItem( GetMenu( hwndDlg), ID_ANSICHTDETAILS,MF_BYCOMMAND | (ID_ANSICHTDETAILS==id) ? MF_CHECKED : MF_UNCHECKED );
  2992. }
  2993.  
  2994. BOOL CALLBACK WinGrepProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam )
  2995. {
  2996.   switch( uMsg )
  2997.   {
  2998.     case WM_INITDIALOG:
  2999.     {
  3000.       TCITEM tci;
  3001.       LVCOLUMN lvc;
  3002.             SHFILEINFO sfi;
  3003.       RECT r;
  3004.       
  3005.       GetClientRect( hwndDlg , &r ); 
  3006.       SizeWindow( hwndDlg, r.bottom-r.top, TRUE );
  3007.  
  3008.       AddFileTypesToCombo( GetDlgItem( hwndDlg, IDC_COMBOTYP ), 
  3009.                            GetDlgItem( hwndDlg, IDC_LISTTYP ),
  3010.                            GetDlgItem( hwndDlg, IDC_LISTEXTENSIONS ) );
  3011.  
  3012.       SetWindowText( GetDlgItem( hwndDlg, IDC_EDITLETZTEMONATE ), "1" );
  3013.       SendMessage( GetDlgItem( hwndDlg, IDC_SPINLETZTEMONATE ), UDM_SETRANGE, 0, (LPARAM) MAKELONG((short) 32767, (short) 1) ); 
  3014.       SetWindowText( GetDlgItem( hwndDlg, IDC_EDITLETZTETAGE ), "1" );
  3015.       SendMessage( GetDlgItem( hwndDlg, IDC_SPINLETZTETAGE ), UDM_SETRANGE, 0, (LPARAM) MAKELONG((short) 32767, (short) 1) ); 
  3016.  
  3017.       SendMessage( GetDlgItem( hwndDlg, IDC_COMBOGROESSE ), CB_INSERTSTRING, 0, (LPARAM)"" );
  3018.       SendMessage( GetDlgItem( hwndDlg, IDC_COMBOGROESSE ), CB_INSERTSTRING, 1, (LPARAM)"Minimal" );
  3019.       SendMessage( GetDlgItem( hwndDlg, IDC_COMBOGROESSE ), CB_INSERTSTRING, 2, (LPARAM)"Maximal" );
  3020.       SetWindowText( GetDlgItem( hwndDlg, IDC_EDITGROESSE ), "" );
  3021.  
  3022.             g_hImageListIcon = (HIMAGELIST)SHGetFileInfo( "",0,&sfi,sizeof(sfi),SHGFI_SYSICONINDEX|SHGFI_ICON );
  3023.             g_hImageListSmallIcon = (HIMAGELIST)SHGetFileInfo( "",0,&sfi,sizeof(sfi),SHGFI_SYSICONINDEX|SHGFI_SMALLICON );
  3024.  
  3025.             ListView_SetImageList(GetDlgItem( hwndDlg, IDC_RESULTS ),g_hImageListIcon,LVSIL_NORMAL);
  3026.             ListView_SetImageList(GetDlgItem( hwndDlg, IDC_RESULTS ),g_hImageListSmallIcon,LVSIL_SMALL);
  3027.  
  3028.       g_iResultHeight = 0;
  3029.  
  3030.       g_ThreadParameters.hThread = INVALID_HANDLE_VALUE;
  3031.       g_hStatusBar = CreateStatusWindow( WS_CHILD,"", hwndDlg, 0 );
  3032.  
  3033.       tci.mask = TCIF_TEXT | TCIF_IMAGE | TCIF_PARAM | TCIF_STATE;
  3034.       tci.dwState = 0;
  3035.       tci.dwStateMask = 0;
  3036.       tci.pszText = "Name / Ort";
  3037.       tci.cchTextMax = lstrlen( tci.pszText );
  3038.       tci.iImage = -1;
  3039.       tci.lParam = 0;
  3040.       SendMessage( GetDlgItem( hwndDlg, IDC_TAB ), TCM_INSERTITEM, 0, (LPARAM)&tci );
  3041.  
  3042.       tci.mask = TCIF_TEXT | TCIF_IMAGE | TCIF_PARAM | TCIF_STATE;
  3043.       tci.dwState = 0;
  3044.       tci.dwStateMask = 0;
  3045.       tci.pszText = "─nderungsdatum";
  3046.       tci.cchTextMax = lstrlen( tci.pszText );
  3047.       tci.iImage = -1;
  3048.       tci.lParam = 0;
  3049.       SendMessage( GetDlgItem( hwndDlg, IDC_TAB ), TCM_INSERTITEM, 1, (LPARAM)&tci );
  3050.  
  3051.       tci.mask = TCIF_TEXT | TCIF_IMAGE | TCIF_PARAM | TCIF_STATE;
  3052.       tci.dwState = 0;
  3053.       tci.dwStateMask = 0;
  3054.       tci.pszText = "Weitere Optionen";
  3055.       tci.cchTextMax = lstrlen( tci.pszText );
  3056.       tci.iImage = -1;
  3057.       tci.lParam = 0;
  3058.       SendMessage( GetDlgItem( hwndDlg, IDC_TAB ), TCM_INSERTITEM, 2, (LPARAM)&tci );
  3059.  
  3060.       lvc.mask = LVCF_FMT | LVCF_TEXT | LVCF_WIDTH;
  3061.       lvc.fmt = LVCFMT_LEFT; 
  3062.       lvc.cx = 100; 
  3063.       lvc.pszText = "Name"; 
  3064.       lvc.cchTextMax = lstrlen(lvc.pszText); 
  3065.       lvc.iSubItem = 0; 
  3066.       lvc.iImage - 1;
  3067.       lvc.iOrder = 0;
  3068.       ListView_InsertColumn( GetDlgItem( hwndDlg, IDC_RESULTS ), 0, &lvc );
  3069.  
  3070.       lvc.mask = LVCF_FMT | LVCF_TEXT | LVCF_WIDTH;
  3071.       lvc.fmt = LVCFMT_LEFT; 
  3072.       lvc.cx = 100; 
  3073.       lvc.pszText = "In Ordner"; 
  3074.       lvc.cchTextMax = lstrlen(lvc.pszText); 
  3075.       lvc.iSubItem = 1; 
  3076.       lvc.iImage - 1;
  3077.       lvc.iOrder = 1;
  3078.       ListView_InsertColumn( GetDlgItem( hwndDlg, IDC_RESULTS ), 1, &lvc );
  3079.  
  3080.       lvc.mask = LVCF_FMT | LVCF_TEXT | LVCF_WIDTH;
  3081.       lvc.fmt = LVCFMT_RIGHT; 
  3082.       lvc.cx = 100; 
  3083.       lvc.pszText = "Gr÷▀e"; 
  3084.       lvc.cchTextMax = lstrlen(lvc.pszText); 
  3085.       lvc.iSubItem = 2; 
  3086.       lvc.iImage - 1;
  3087.       lvc.iOrder = 2;
  3088.       ListView_InsertColumn( GetDlgItem( hwndDlg, IDC_RESULTS ), 2, &lvc );
  3089.  
  3090.       lvc.mask = LVCF_FMT | LVCF_TEXT | LVCF_WIDTH;
  3091.       lvc.fmt = LVCFMT_LEFT; 
  3092.       lvc.cx = 100; 
  3093.       lvc.pszText = "Typ"; 
  3094.       lvc.cchTextMax = lstrlen(lvc.pszText); 
  3095.       lvc.iSubItem = 3; 
  3096.       lvc.iImage - 1;
  3097.       lvc.iOrder = 3;
  3098.       ListView_InsertColumn( GetDlgItem( hwndDlg, IDC_RESULTS ), 3, &lvc );
  3099.  
  3100.       lvc.mask = LVCF_FMT | LVCF_TEXT | LVCF_WIDTH;
  3101.       lvc.fmt = LVCFMT_LEFT; 
  3102.       lvc.cx = 100; 
  3103.       lvc.pszText = "GeΣndert am"; 
  3104.       lvc.cchTextMax = lstrlen(lvc.pszText); 
  3105.       lvc.iSubItem = 4; 
  3106.       lvc.iImage - 1;
  3107.       lvc.iOrder = 4;
  3108.       ListView_InsertColumn( GetDlgItem( hwndDlg, IDC_RESULTS ), 4, &lvc );
  3109.      
  3110.             lvc.mask = LVCF_FMT | LVCF_TEXT | LVCF_WIDTH;
  3111.       lvc.fmt = LVCFMT_RIGHT; 
  3112.       lvc.cx = 100; 
  3113.       lvc.pszText = "Fundtext"; 
  3114.       lvc.cchTextMax = lstrlen(lvc.pszText); 
  3115.       lvc.iSubItem = 5; 
  3116.       lvc.iImage - 1;
  3117.       lvc.iOrder = 5;
  3118.       ListView_InsertColumn( GetDlgItem( hwndDlg, IDC_RESULTS ), 5, &lvc );
  3119.  
  3120.             lvc.mask = LVCF_FMT | LVCF_TEXT | LVCF_WIDTH;
  3121.       lvc.fmt = LVCFMT_RIGHT; 
  3122.       lvc.cx = 100; 
  3123.       lvc.pszText = "Fundstelle"; 
  3124.       lvc.cchTextMax = lstrlen(lvc.pszText); 
  3125.       lvc.iSubItem = 6; 
  3126.       lvc.iImage - 1;
  3127.       lvc.iOrder = 6;
  3128.       ListView_InsertColumn( GetDlgItem( hwndDlg, IDC_RESULTS ), 6, &lvc );
  3129.  
  3130.             SetView( hwndDlg, ID_ANSICHTDETAILS );
  3131.       UpdateTab( hwndDlg );
  3132.             SetDate( hwndDlg );
  3133.       LoadParameters( hwndDlg );
  3134.       SetWindowText( GetDlgItem( hwndDlg, IDC_COMBOSUCHENIN ), g_szDrive );
  3135.     }
  3136.     break;
  3137.     case WM_SIZE: // CLient Area
  3138.     {
  3139.       RECT rNewWindow;
  3140.  
  3141.       rNewWindow.left = 0;
  3142.       rNewWindow.top = 0;
  3143.       rNewWindow.right = 0;
  3144.       rNewWindow.bottom = 0;
  3145.  
  3146.       AdjustWindowRect(&rNewWindow, 
  3147.                        GetWindowLong( hwndDlg, GWL_STYLE), 
  3148.                        TRUE );
  3149.       SizeWindow( hwndDlg, HIWORD( lParam ), TRUE );
  3150.     }
  3151.     break;
  3152.     case WM_NOTIFY:
  3153.     {
  3154.       switch( wParam ) 
  3155.       {
  3156.         case IDC_TAB:
  3157.         {
  3158.           LPNMHDR lpnmhdr = (LPNMHDR) lParam; 
  3159.           if( lpnmhdr->code == TCN_SELCHANGE )
  3160.             UpdateTab( hwndDlg );
  3161.         }
  3162.         break;
  3163.         case IDC_RESULTS:
  3164.         {
  3165.           LPNMHDR lpnmhdr = (LPNMHDR) lParam; 
  3166.           
  3167.           if( lpnmhdr->code == LVN_COLUMNCLICK )
  3168.           { 
  3169.             int i;
  3170.             LPNMLISTVIEW lpnmv = (LPNMLISTVIEW) lParam; 
  3171.             HCURSOR hCursor;
  3172.  
  3173.             if( lpnmv->iSubItem > 4 )
  3174.             {
  3175.               MessageBox( hwndDlg, "Fundstellen und Fundpositionen lassen sich nicht sortieren!", "Hinweis", MB_ICONSTOP | MB_OK );
  3176.               break;
  3177.             }
  3178.             else
  3179.             {
  3180.               hCursor = SetCursor( LoadCursor( NULL, IDC_WAIT ) );
  3181.               for( i = 0 ; i < 4; i++ )
  3182.                 if( lpnmv->iSubItem == i )
  3183.                 {
  3184.                   if( iSort[i] != SORT_DOWN ) // Aktuelle Auswahl
  3185.                     iSort[i] = SORT_DOWN;
  3186.                   else
  3187.                     iSort[i] = SORT_UP;
  3188.                 }
  3189.                 else
  3190.                   iSort[i] = SORT_NONE; // Alle andere 
  3191.  
  3192.               SortArray( 0, iNumEntries-1, lpnmv->iSubItem,  iSort[lpnmv->iSubItem],g_ThreadParameters.hFileTypesCombo); 
  3193.               FillListView(g_ThreadParameters.hResults,g_ThreadParameters.hFileTypesCombo,g_ThreadParameters.hStatusBar); 
  3194.               SetCursor( hCursor );
  3195.             }
  3196.           }
  3197.           else
  3198.           if( lpnmhdr->code == NM_RCLICK )
  3199.           {
  3200.             POINT p;
  3201.             LPNMLISTVIEW lpnmv = (LPNMLISTVIEW) lParam; 
  3202.  
  3203.             if( ListView_GetSelectedCount( GetDlgItem( hwndDlg, IDC_RESULTS ) ) == 1 )
  3204.             {
  3205.               long i;
  3206.               i = ListView_GetNextItem(GetDlgItem( hwndDlg, IDC_RESULTS ),-1,LVNI_FOCUSED);
  3207.               if( i >= 0 )
  3208.               {
  3209.                 GetCursorPos( &p );
  3210.                 DoExplorerMenu (hwndDlg, List[i].szPath, List[i].lPos, p);
  3211.               }
  3212.             }
  3213.           }
  3214.           else
  3215.           if( lpnmhdr->code == NM_DBLCLK )
  3216.           {
  3217.             POINT p;
  3218.             LPNMLISTVIEW lpnmv = (LPNMLISTVIEW) lParam; 
  3219.  
  3220.             if( ListView_GetSelectedCount( GetDlgItem( hwndDlg, IDC_RESULTS ) ) == 1 )
  3221.             {
  3222.               long i;
  3223.               i = ListView_GetNextItem(GetDlgItem( hwndDlg, IDC_RESULTS ),-1,LVNI_FOCUSED);
  3224.               if( i >= 0 )
  3225.               {
  3226.                 GetCursorPos( &p );
  3227.                 ShellExecute(hwndDlg, "open", List[i].szPath,
  3228.                              NULL, //LPCTSTR lpParameters, 
  3229.                              NULL, //LPCTSTR lpDirectory,
  3230.                              SW_SHOWNORMAL );
  3231.               }
  3232.             }
  3233.           }
  3234.         }
  3235.         break;
  3236.       }
  3237.     }
  3238.     break;
  3239.     case WM_COMMAND:
  3240.     {
  3241.       switch( LOWORD( wParam ) )
  3242.       {
  3243.         case IDCANCEL:
  3244.           SaveParameters( hwndDlg );
  3245.           StopSuche( &g_ThreadParameters, TRUE );
  3246.           EndDialog( hwndDlg, 0 );
  3247.           PostQuitMessage( 0 );
  3248.         break;
  3249.  
  3250.         case IDC_ALLEDATEIEN:
  3251.         case IDC_DATEIDATUM:
  3252.         case IDC_ZWISCHEN:
  3253.         case IDC_LETZTEMONATE:
  3254.         case IDC_LETZTETAGE:
  3255.           if( HIWORD( wParam ) == BN_CLICKED )
  3256.             SetDate( hwndDlg );
  3257.         break;
  3258.  
  3259.         case IDC_DURCHSUCHEN:
  3260.         {
  3261.           char szNewDir[256];
  3262.           BROWSEINFO bi;
  3263.           LPITEMIDLIST lppidl;
  3264.  
  3265.           bi.hwndOwner = hwndDlg; 
  3266.           bi.pidlRoot = NULL; 
  3267.           bi.pszDisplayName = szNewDir; 
  3268.                     bi.lpszTitle = "Ordner suchen";
  3269.                     bi.ulFlags = BIF_RETURNONLYFSDIRS;
  3270.                     bi.lpfn = NULL;
  3271.                     bi.lParam = 0;
  3272.                     bi.iImage = 0; 
  3273.                     lppidl = SHBrowseForFolder( &bi );
  3274.                     if( lppidl )
  3275.                     {
  3276.             char szPath[MAX_PATH];
  3277.             SHGetPathFromIDList( lppidl, szPath );
  3278.                         SetWindowText( GetDlgItem( hwndDlg, IDC_COMBOSUCHENIN ), szPath );
  3279.                         ShellFree( lppidl );
  3280.                     }
  3281.                 }
  3282.         break;
  3283.         case IDC_COMBONAME:
  3284.           if( HIWORD( wParam ) == CBN_EDITCHANGE )
  3285.           { 
  3286.             //char c[2];
  3287.             //if( GetWindowText( GetDlgItem( hwndDlg, IDC_COMBONAME ), c, 2) )
  3288.             //  SendMessage( GetDlgItem( hwndDlg, IDC_COMBOTYP ), CB_SETCURSEL, 0, 0 );
  3289.           }
  3290.         break;
  3291.         case IDC_COMBOTYP:
  3292.           if( HIWORD( wParam ) == CBN_SELCHANGE )
  3293.             if( SendMessage( GetDlgItem( hwndDlg, IDC_COMBOTYP ), CB_GETCURSEL, 0, 0 ) )
  3294.               SetWindowText( GetDlgItem( hwndDlg, IDC_COMBONAME ), "" );
  3295.         break;
  3296.         case IDC_SUCHESTARTEN:
  3297.         {
  3298.           char szPattern[1024];
  3299.           long ft;
  3300.           RECT rTab, rWindow;
  3301.           char szText[200];
  3302.           SYSTEMTIME tvon, tbis;
  3303.           char szTitle[512];
  3304.           int i;
  3305.  
  3306.           GetWindowText( GetDlgItem( hwndDlg, IDC_COMBOSUCHENIN ), 
  3307.                          g_ThreadParameters.szDirectory, 
  3308.                          sizeof(g_ThreadParameters.szDirectory) );
  3309.           GetWindowText( GetDlgItem( hwndDlg, IDC_COMBONAME ), 
  3310.                          g_ThreadParameters.szName, 
  3311.                          sizeof(g_ThreadParameters.szName));
  3312.  
  3313.           if( lstrlen( g_ThreadParameters.szDirectory ) == 0 )
  3314.           {
  3315.             MessageBox( hwndDlg, "Bitte geben Sie ein Such-Verzeichnis an", "Fehler!", MB_ICONSTOP | MB_OK );
  3316.             SetTab( hwndDlg, 0 );
  3317.             SetFocus( GetDlgItem( hwndDlg, IDC_COMBOSUCHENIN ) );
  3318.             break;
  3319.           }
  3320.                         
  3321.           g_ThreadParameters.bRecurseDirectories = ( SendMessage( GetDlgItem( hwndDlg, IDC_RECURSEDIR ), BM_GETCHECK,0,0 ) & BST_CHECKED ) ? true : false;
  3322.           g_ThreadParameters.bUpperCase = ( SendMessage( GetDlgItem( hwndDlg, IDC_GROSSKLEIN ), BM_GETCHECK,0,0 ) & BST_CHECKED ) ? true : false;
  3323.           g_ThreadParameters.bUnicode = ( SendMessage( GetDlgItem( hwndDlg, IDC_UNICODE ), BM_GETCHECK,0,0 ) & BST_CHECKED ) ? true : false;
  3324.           g_ThreadParameters.bWindowsSemantic = ( SendMessage( GetDlgItem( hwndDlg, IDC_WINDOWSSYNTAX ), BM_GETCHECK,0,0 ) & BST_CHECKED ) ? true : false;
  3325.           g_ThreadParameters.Pattern = NULL;
  3326.  
  3327.           if( GetWindowText( GetDlgItem( hwndDlg, IDC_COMBOMUSTER ), szPattern, sizeof( szPattern ) ) )
  3328.           {
  3329.             if( g_ThreadParameters.bUpperCase )
  3330.               CharUpperBuff( szPattern, lstrlen( szPattern ) );
  3331.              
  3332.             i = 0;
  3333.             g_ThreadParameters.Pattern = MakePattern( szPattern, &i, 0, g_ThreadParameters.bWindowsSemantic, g_ThreadParameters.bUnicode );
  3334.             if( !g_ThreadParameters.Pattern ) 
  3335.             {
  3336.               // xxx
  3337.               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 );
  3338.               SendMessage( GetDlgItem( hwndDlg, IDC_COMBOMUSTER ),CB_SETEDITSEL,0,MAKELPARAM( i, i ) );
  3339.               SetTab( hwndDlg, 0 );
  3340.               SetFocus( GetDlgItem( hwndDlg, IDC_COMBOMUSTER ) );
  3341.               break;
  3342.             }
  3343.           }
  3344.            
  3345.           g_ThreadParameters.bDate = ( SendMessage( GetDlgItem( hwndDlg, IDC_DATEIDATUM ), BM_GETCHECK,0,0 ) & BST_CHECKED ) ? true : false;
  3346.           if( g_ThreadParameters.bDate )
  3347.           {
  3348.             // Zwischen
  3349.             if( SendMessage( GetDlgItem( hwndDlg, IDC_ZWISCHEN ), BM_GETCHECK,0,0 ) & BST_CHECKED )
  3350.             {
  3351.               if( !GetDate( hwndDlg, GetDlgItem( hwndDlg, IDC_EDITVON ), &tvon ) )
  3352.               {
  3353.                 SetTab( hwndDlg, 1 );
  3354.                 SetFocus( GetDlgItem( hwndDlg, IDC_EDITVON ) );
  3355.                 break;
  3356.               }
  3357.  
  3358.               if( !GetDate( hwndDlg, GetDlgItem( hwndDlg, IDC_EDITBIS ), &tbis) )
  3359.               {
  3360.                 SetTab( hwndDlg, 1 );
  3361.                 SetFocus( GetDlgItem( hwndDlg, IDC_EDITBIS ) );
  3362.                 break;
  3363.               }
  3364.             }
  3365.             else
  3366.             if( SendMessage( GetDlgItem( hwndDlg, IDC_LETZTEMONATE ), BM_GETCHECK,0,0 ) & BST_CHECKED )
  3367.             {
  3368.               int i, v;
  3369.               SYSTEMTIME s, sp;
  3370.               TIME_ZONE_INFORMATION tz;
  3371.               long l;
  3372.  
  3373.               GetSystemTime( &s );
  3374.               GetTimeZoneInformation( &tz );
  3375.               SystemTimeToTzSpecificLocalTime( &tz, &s, &sp );
  3376.               
  3377.               memset( &tbis, 0, sizeof( SYSTEMTIME ) );
  3378.               tbis.wDay = sp.wDay;
  3379.               tbis.wMonth = sp.wMonth;
  3380.               tbis.wYear = sp.wYear;
  3381.  
  3382.               GetWindowText( GetDlgItem( hwndDlg, IDC_EDITLETZTEMONATE ), szText, sizeof( szText) );
  3383.               i=0;
  3384.               if( !GetDigit( szText, &i, &v ) )
  3385.               {
  3386.                 MessageBox( hwndDlg, "Bitte geben Sie eine Zahl ein!", "Fehler!", MB_ICONSTOP );
  3387.                 SetTab( hwndDlg, 1 );
  3388.                 SetFocus( GetDlgItem( hwndDlg, IDC_EDITLETZTEMONATE ) );
  3389.                 break;
  3390.               }
  3391.               if( ( v == 0 ) || ( v > 999 ) )
  3392.               {
  3393.                 MessageBox( hwndDlg, "Bitte geben Sie einen Wert zwischen 1 und 999 ein!", "Fehler!", MB_ICONSTOP );
  3394.                 SetTab( hwndDlg, 1 );
  3395.                 SetFocus( GetDlgItem( hwndDlg, IDC_EDITLETZTEMONATE ) );
  3396.                 break;
  3397.               }
  3398.  
  3399.               CalDayToJulianDay( &l, tbis.wDay, tbis.wMonth, tbis.wYear );
  3400.               
  3401.               JulianDayToCalDay( l, &tbis );
  3402.               l -= (long)((float)v * 30.6001);
  3403.               JulianDayToCalDay( l, &tvon );
  3404.             }
  3405.             else
  3406.             if( SendMessage( GetDlgItem( hwndDlg, IDC_LETZTETAGE ), BM_GETCHECK,0,0 ) & BST_CHECKED )
  3407.             {
  3408.               int i, v;
  3409.               SYSTEMTIME s, sp;
  3410.               TIME_ZONE_INFORMATION tz;
  3411.               long l;
  3412.  
  3413.               GetSystemTime( &s );
  3414.               GetTimeZoneInformation( &tz );
  3415.               SystemTimeToTzSpecificLocalTime( &tz, &s, &sp );
  3416.  
  3417.               memset( &tbis, 0, sizeof( SYSTEMTIME ) );
  3418.               tbis.wDay = sp.wDay;
  3419.               tbis.wMonth = sp.wMonth;
  3420.               tbis.wYear = sp.wYear;
  3421.  
  3422.               GetWindowText( GetDlgItem( hwndDlg, IDC_EDITLETZTETAGE  ), szText, sizeof( szText) );
  3423.               i=0;
  3424.               if( !GetDigit( szText, &i, &v ) )
  3425.               {
  3426.                 MessageBox( hwndDlg, "Bitte geben Sie eine Zahl ein!", "Fehler!", MB_ICONSTOP );
  3427.                 SetTab( hwndDlg, 1 );
  3428.                 SetFocus( GetDlgItem( hwndDlg, IDC_EDITLETZTETAGE  ) );
  3429.                 break;
  3430.               }
  3431.               if( ( v == 0 ) || ( v > 999 ) )
  3432.               {
  3433.                 MessageBox( hwndDlg, "Bitte geben Sie einen Wert zwischen 1 und 999 ein!", "Fehler!", MB_ICONSTOP );
  3434.                 SetTab( hwndDlg, 1 );
  3435.                 SetFocus( GetDlgItem( hwndDlg, IDC_EDITLETZTEMONATE  ) );
  3436.                 break;
  3437.               }
  3438.  
  3439.               CalDayToJulianDay( &l, tbis.wDay, tbis.wMonth, tbis.wYear );
  3440.               
  3441.               JulianDayToCalDay( l, &tbis );
  3442.               l -= v;
  3443.               JulianDayToCalDay( l, &tvon );
  3444.             }
  3445.             SystemTimeToFileTime( &tvon, &g_ThreadParameters.dateVon );
  3446.             SystemTimeToFileTime( &tbis, &g_ThreadParameters.dateBis );
  3447.           }
  3448.           GetWindowText( GetDlgItem( hwndDlg, IDC_EDITGROESSE ), szText, sizeof( szText ) );
  3449.           g_ThreadParameters.bSize = FALSE;
  3450.           if( lstrlen( szText ) )
  3451.           {
  3452.             int i, v;
  3453.  
  3454.             i=0;
  3455.             if( !GetDigit( szText, &i, &v ) )
  3456.             {
  3457.               MessageBox( hwndDlg, "Bitte geben Sie einen positiven Wert ein!", "Fehler!", MB_ICONSTOP );
  3458.               SetTab( hwndDlg, 2 );
  3459.               SetFocus( GetDlgItem( hwndDlg, IDC_EDITGROESSE ) );
  3460.               break;
  3461.             }
  3462.             g_ThreadParameters.bSize = TRUE;
  3463.  
  3464.             switch( SendMessage( GetDlgItem( hwndDlg, IDC_COMBOGROESSE ), CB_GETCURSEL, 0, 0 ) )
  3465.             {
  3466.               case 0:
  3467.                 g_ThreadParameters.bSameSize = 0;             // 0 = gleich, -1, minimal, 1 = maximal
  3468.               break;
  3469.               case 1:
  3470.                 g_ThreadParameters.bSameSize = -1;             // 0 = gleich, -1, minimal, 1 = maximal
  3471.               break;
  3472.               case 2:
  3473.                 g_ThreadParameters.bSameSize = 1;             // 0 = gleich, -1, minimal, 1 = maximal
  3474.               break;
  3475.             }
  3476.             g_ThreadParameters.lKByte = (DWORD)v;            // Gr÷▀e
  3477.           }
  3478.     
  3479.           ft = SendMessage( GetDlgItem( hwndDlg, IDC_COMBOTYP ), CB_GETCURSEL, 0, 0 );
  3480.           g_ThreadParameters.hFileTypes = GetDlgItem( hwndDlg, IDC_LISTTYP);
  3481.           g_ThreadParameters.hFileTypesCombo = GetDlgItem( hwndDlg, IDC_COMBOTYP);
  3482.           g_ThreadParameters.hFileExtensions = GetDlgItem( hwndDlg, IDC_LISTEXTENSIONS );
  3483.  
  3484.           GetFirstAndLastFileTypeEntry( g_ThreadParameters.hFileTypes,
  3485.                                         ft, 
  3486.                                         &g_ThreadParameters.lFileTypeStart, 
  3487.                                         &g_ThreadParameters.lFileTypeEnd );
  3488.           lstrcpy( szTitle, "Suche nach: " );
  3489.           if( ft )
  3490.           {
  3491.             char szType[256];
  3492.             
  3493.             SendMessage( GetDlgItem( hwndDlg, IDC_COMBOTYP ), CB_GETLBTEXT, ft, (LPARAM)szType );
  3494.             lstrcat( szTitle, "Dateien vom Typ " );
  3495.             lstrcat( szTitle, szType );
  3496.           }
  3497.           if( g_ThreadParameters.szName[0] )
  3498.           {
  3499.             if( !ft )
  3500.               lstrcat( szTitle, "Dateien" );
  3501.             lstrcat( szTitle, " mit Namen " );
  3502.             
  3503.             lstrcat( szTitle, g_ThreadParameters.szName );
  3504.           }
  3505.           else
  3506.           {
  3507.             if( !ft )
  3508.               lstrcat( szTitle, " Allen Dateien" );
  3509.           }
  3510.           SetWindowText( hwndDlg, szTitle );
  3511.  
  3512.           CharUpperBuff( g_ThreadParameters.szName, lstrlen(g_ThreadParameters.szName) );
  3513.  
  3514.           ListView_DeleteAllItems( GetDlgItem( hwndDlg, IDC_RESULTS ) );
  3515.  
  3516.           EnableWindow( GetDlgItem( hwndDlg, IDC_SUCHESTARTEN ), FALSE );
  3517.           EnableWindow( GetDlgItem( hwndDlg, IDC_SUCHEANHALTEN ), TRUE );
  3518.  
  3519.           EnableWindow( GetDlgItem( hwndDlg, IDC_STATICNAME ), FALSE );
  3520.           EnableWindow( GetDlgItem( hwndDlg, IDC_COMBONAME ), FALSE );
  3521.           EnableWindow( GetDlgItem( hwndDlg, IDC_STATICMUSTER ), FALSE );
  3522.           EnableWindow( GetDlgItem( hwndDlg, IDC_COMBOMUSTER ), FALSE );
  3523.           EnableWindow( GetDlgItem( hwndDlg, IDC_STATICSUCHENIN ), FALSE );
  3524.           EnableWindow( GetDlgItem( hwndDlg, IDC_COMBOSUCHENIN ), FALSE );
  3525.           EnableWindow( GetDlgItem( hwndDlg, IDC_DURCHSUCHEN ), FALSE );
  3526.           EnableWindow( GetDlgItem( hwndDlg, IDC_RECURSEDIR ), FALSE );
  3527.           EnableWindow( GetDlgItem( hwndDlg, IDC_GROSSKLEIN ), FALSE );
  3528.           EnableWindow( GetDlgItem( hwndDlg, IDC_UNICODE ), FALSE );
  3529.           EnableWindow( GetDlgItem( hwndDlg, IDC_WINDOWSSYNTAX ), FALSE );
  3530.  
  3531.           EnableWindow( GetDlgItem( hwndDlg, IDC_COMBOSUCHENIN ), FALSE );
  3532.           EnableWindow( GetDlgItem( hwndDlg, IDC_DURCHSUCHEN ), FALSE );
  3533.           EnableWindow( GetDlgItem( hwndDlg, IDC_RECURSEDIR ), FALSE );
  3534.             EnableWindow( GetDlgItem( hwndDlg, IDC_GROSSKLEIN ), FALSE );
  3535.             EnableWindow( GetDlgItem( hwndDlg, IDC_UNICODE ), FALSE );
  3536.  
  3537.           EnableWindow( GetDlgItem( hwndDlg, IDC_ALLEDATEIEN ), FALSE );
  3538.           EnableWindow( GetDlgItem( hwndDlg, IDC_DATEIDATUM ), FALSE );
  3539.           EnableWindow( GetDlgItem( hwndDlg, IDC_ZWISCHEN ), FALSE );
  3540.           EnableWindow( GetDlgItem( hwndDlg, IDC_EDITVON ), FALSE );
  3541.           EnableWindow( GetDlgItem( hwndDlg, IDC_STATICUND), FALSE );
  3542.           EnableWindow( GetDlgItem( hwndDlg, IDC_EDITBIS ), FALSE );
  3543.           EnableWindow( GetDlgItem( hwndDlg, IDC_LETZTEMONATE ), FALSE );
  3544.           EnableWindow( GetDlgItem( hwndDlg, IDC_EDITLETZTEMONATE ), FALSE );
  3545.           EnableWindow( GetDlgItem( hwndDlg, IDC_SPINLETZTEMONATE   ), FALSE );
  3546.           EnableWindow( GetDlgItem( hwndDlg, IDC_STATICLETZTEMONATE ), FALSE );
  3547.           EnableWindow( GetDlgItem( hwndDlg, IDC_LETZTETAGE ), FALSE );
  3548.           EnableWindow( GetDlgItem( hwndDlg, IDC_EDITLETZTETAGE ), FALSE );
  3549.           EnableWindow( GetDlgItem( hwndDlg, IDC_SPINLETZTETAGE ), FALSE );
  3550.           EnableWindow( GetDlgItem( hwndDlg, IDC_STATICLETZTETAGE ), FALSE );
  3551.  
  3552.           EnableWindow( GetDlgItem( hwndDlg, IDC_STATICTYP ), FALSE );
  3553.           EnableWindow( GetDlgItem( hwndDlg, IDC_COMBOTYP ), FALSE );
  3554.           EnableWindow( GetDlgItem( hwndDlg, IDC_STATICGROESSE ), FALSE );
  3555.           EnableWindow( GetDlgItem( hwndDlg, IDC_COMBOGROESSE ), FALSE );
  3556.           EnableWindow( GetDlgItem( hwndDlg, IDC_EDITGROESSE ), FALSE );
  3557.           EnableWindow( GetDlgItem( hwndDlg, IDC_SPINGROESSE ), FALSE );
  3558.           EnableWindow( GetDlgItem( hwndDlg, IDC_STATICKB ), FALSE );
  3559.  
  3560.           g_ThreadParameters.hStatusBar = g_hStatusBar;
  3561.           SendMessage( g_hStatusBar, SB_SIMPLE, TRUE, FALSE );
  3562.           ShowWindow( g_hStatusBar, SW_SHOW );
  3563.                         
  3564.           GetWindowRect( hwndDlg, &rWindow );
  3565.           GetClientRect( GetDlgItem( hwndDlg, IDC_TAB ), &rTab );
  3566.  
  3567.           g_ThreadParameters.hResults = GetDlgItem( hwndDlg, IDC_RESULTS );
  3568.           
  3569.           if( g_iResultHeight == 0 )
  3570.             g_iResultHeight = 100;
  3571.  
  3572.           SizeWindow( hwndDlg, g_iResultHeight, FALSE );
  3573.  
  3574.           g_ThreadParameters.hwndDlg = hwndDlg;
  3575.  
  3576.           iSort[0]=SORT_NONE;
  3577.           iSort[1]=SORT_NONE;
  3578.           iSort[2]=SORT_NONE;
  3579.           iSort[3]=SORT_NONE;
  3580.           iSort[4]=SORT_NONE;
  3581.           iSort[5]=SORT_NONE;
  3582.  
  3583.           AddInputToCombo( hwndDlg );
  3584.  
  3585.           g_ThreadParameters.hThread = CreateThread(NULL,
  3586.                                                     1024L*1024L, // Stacksize 1MB
  3587.                                                     SearchThreadProc,
  3588.                                                     (LPVOID)&g_ThreadParameters,
  3589.                                                     0,
  3590.                                                     &g_ThreadParameters.dwThreadID);
  3591.         }
  3592.         break;
  3593.         case IDC_SUCHEANHALTEN:
  3594.           StopSuche( &g_ThreadParameters, TRUE );
  3595.         break;
  3596.         case IDC_NEUESUCHE:
  3597.         break;
  3598.         case ID_ANSICHTGROSSESYMBOLE:
  3599.         case ID_ANSICHTKLEINESYMBOLE:
  3600.         case ID_ANSICHTLISTE:
  3601.         case ID_ANSICHTDETAILS:
  3602.             SetView( hwndDlg, LOWORD( wParam ) );
  3603.         break;
  3604.       }
  3605.     }
  3606.     break;
  3607.   }
  3608.   return FALSE;
  3609. }
  3610.  
  3611. void PathRemoveFileSpec( LPSTR lpFileName )
  3612. {
  3613.   int i;
  3614.   i = lstrlen( lpFileName );
  3615.   while( i )
  3616.     if( lpFileName[i]  == '\\' ) break;
  3617.     else i--;
  3618.   lpFileName[i]=0;
  3619. }
  3620.  
  3621. int WINAPI WinMain( HINSTANCE hInst, HINSTANCE hPrev, LPSTR lpCmd, int iCmdShow )
  3622. {
  3623.   char szModuleName[MAX_PATH];
  3624.   g_Hinstance = hInst;
  3625.  
  3626.   GetModuleFileName( g_Hinstance, szModuleName, sizeof( szModuleName ) );
  3627.   PathRemoveFileSpec( szModuleName );
  3628.   lstrcat( szModuleName, "\\ctxtmenu.dll" );
  3629.  
  3630.   // Drive-Meldungen
  3631.   SetRegKey( HKEY_CLASSES_ROOT,  
  3632.              "Drive\\shellex\\ContextMenuHandlers\\WinGrepMenu",
  3633.              NULL,
  3634.              "{8909E24A-0A30-11d2-AFAA-444553540000}");
  3635.   // Directory Meldungen
  3636.   SetRegKey( HKEY_CLASSES_ROOT,  
  3637.              "Directory\\shellex\\ContextMenuHandlers\\WinGrepMenu",
  3638.              NULL,
  3639.              "{8909E24A-0A30-11d2-AFAA-444553540000}");
  3640.  
  3641.   SetRegKey( HKEY_CLASSES_ROOT,  
  3642.              "CLSID\\{8909E24A-0A30-11d2-AFAA-444553540000}",
  3643.              NULL,
  3644.              "WinGrep ContextMenu");
  3645.  
  3646.   SetRegKey( HKEY_CLASSES_ROOT,  
  3647.              "CLSID\\{8909E24A-0A30-11d2-AFAA-444553540000}\\InprocServer32",
  3648.              NULL,
  3649.              szModuleName ); 
  3650.  
  3651.   SetRegKey( HKEY_CLASSES_ROOT,  
  3652.              "CLSID\\{8909E24A-0A30-11d2-AFAA-444553540000}\\InprocServer32",
  3653.              "ThreadingModel",
  3654.              "Apartment"); 
  3655.  
  3656.   
  3657.   InitCommonControls(); // Common Controls von WIndows 95 initialisieren
  3658.  
  3659.   lstrcpy( g_szDrive, lpCmd );
  3660.   hArrayMutex = CreateMutex(0,false,NULL );
  3661.  
  3662.   if( hArrayMutex )
  3663.   {
  3664.     CoInitialize(NULL);
  3665.  
  3666.     if( RegisterViewer( hInst ) )
  3667.     {
  3668.       if( SUCCEEDED( SHGetMalloc(&g_SHMalloc ) ) )
  3669.       {
  3670.         if( SUCCEEDED( SHGetDesktopFolder( &g_DesktopShellFolder ) ) )
  3671.         {
  3672.           HWND hWnd;
  3673.           MSG msg;
  3674.  
  3675.           hWnd = CreateDialog( hInst, 
  3676.                                MAKEINTRESOURCE(IDD_WINGREP), 
  3677.                                NULL,
  3678.                                (DLGPROC)WinGrepProc );
  3679.           ShowWindow( hWnd, SW_SHOW );          
  3680.           while( GetMessage( &msg, NULL,0,0) )
  3681.           {
  3682.             if( !IsDialogMessage( hWnd, &msg ) )
  3683.             {
  3684.               TranslateMessage( &msg );
  3685.               DispatchMessage( &msg );
  3686.             }
  3687.           }
  3688.  
  3689.                 g_DesktopShellFolder->Release();
  3690.             }
  3691.             else
  3692.                 MessageBox( NULL, "Fehler beim Initialisieren der Shell-Objekte", "Programmabbruch", MB_OK|MB_ICONSTOP );
  3693.             g_SHMalloc->Release();
  3694.         }    
  3695.         else
  3696.             MessageBox( NULL, "Fehler beim Initialisieren des Shell-Speicher-Objektes", "Programmabbruch", MB_OK|MB_ICONSTOP );
  3697.       UnregisterViewer( hInst );
  3698.     }
  3699.     CoUninitialize();
  3700.   
  3701.     CloseHandle( hArrayMutex );
  3702.   }
  3703.   else
  3704.     MessageBox( NULL, "Fehler beim Erzeugen des Array-Mutex!", "Programmabbruch", MB_OK|MB_ICONSTOP );
  3705.   return 0;
  3706. }
  3707.  
  3708.