На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! user posted image
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.

Соблюдайте общие правила форума

Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как "свернуть" программу в трей.
3. Как "скрыться" от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как запустить программу/файл? (и дождаться ее завершения)
5. Как перехватить API-функции, поставить hook? (перехват сообщений от мыши, клавиатуры - внедрение в удаленное адресное прстранство)
... (продолжение следует) ...

Внимание:
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки - бан.
Мат в разделе - бан на три месяца...

Полезные ссылки:
user posted image MSDN Library user posted image FAQ раздела user posted image Поиск по разделу user posted image Как правильно задавать вопросы


Выразить свое отношение к модераторам раздела можно здесь: user posted image Rouse_, user posted image Krid

Модераторы: Rouse_, Krid
  
> Не работает SSF_SHOWSUPERHIDDEN (Скрыть/Показать защищенные системные файлы) , SHGetSetSettings SSF_SHOWSUPERHIDDEN
    Господа, помогите разобраться, почему не хочет работать SSF_SHOWSUPERHIDDEN на Скрытие/Показ защищенных системных файлов. При этом, функция, которая определяет состояние файлов, работает корректно.

    ExpandedWrap disabled
      // Скрыть/показать защищенные файлы (ЭТОТ КОД НЕ РАБОТАЕТ!)
      procedure SHShowSuperHiddenFile(show: Boolean);
      var
        lpss: SHELLSTATE;
        bShowAll: Boolean;
      begin
        ZeroMemory(@lpss, sizeof(lpss));
        // Получаем текущее состояние
        SHGetSetSettings(lpss, SSF_SHOWSUPERHIDDEN, False);
        // Проверяем текущее состояние
        bShowAll := (lpss.Data and SSF_SHOWSUPERHIDDEN) = SSF_SHOWSUPERHIDDEN;
        // Если изменилось
        if (bShowAll <> show) then
        begin
          if (Show) then
            lpss.Data := 1
          else
            lpss.Data :=0;
          // Меняем состояние
          SHGetSetSettings(lpss, SSF_SHOWSUPERHIDDEN, True);
          // Сообщение Проводнику об изменениях
          SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_FLUSHNOWAIT, nil, nil);
        end;
      end;
       
      // Определяем, скрыты или нет защищенные файлы
      function ShGetShowSuperHiddenFileState:boolean;
      var
        lpss: SHELLSTATE;
      begin
        ZeroMemory(@lpss, sizeof(lpss));
        // Получаем текущее состояние
        SHGetSetSettings(lpss, SSF_SHOWSUPERHIDDEN, False);
        // Возвращаем состояние
        result:= (lpss.Data and SSF_SHOWSUPERHIDDEN) = SSF_SHOWSUPERHIDDEN;
      end;
       
      // Скрываем/Показываем защищенные файлы
      procedure TForm1.Button1Click(Sender: TObject);
      begin
       if ShGetShowSuperHiddenFileState then
         SHShowSuperHiddenFile(false)
       else
         SHShowSuperHiddenFile(true);
      end;
      Тебя не смущает что lpss.Data это Word а SSF_SHOWSUPERHIDDEN это DWORD?
      Ты же все ломаешь нафиг выставляя и проверяя не те флаги.

      ExpandedWrap disabled
        // Скрыть/показать защищенные файлы (ЭТОТ КОД НЕ РАБОТАЕТ!)
        procedure SHShowSuperHiddenFile(show: Boolean);
        var
          lpss: SHELLSTATE;
        begin
          ZeroMemory(@lpss, sizeof(lpss));
          // Получаем текущее состояние
          SHGetSetSettings(lpss, SSF_SHOWSUPERHIDDEN, False);
          if lpss.fShowSuperHidden <> show then
          begin
            lpss.fShowSuperHidden := show;
              // Меняем состояние
            SHGetSetSettings(lpss, SSF_SHOWSUPERHIDDEN, True);
            // Сообщение Проводнику об изменениях
            SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_FLUSHNOWAIT, nil, nil);
          end;
        end;
         
        // Определяем, скрыты или нет защищенные файлы
        function ShGetShowSuperHiddenFileState:boolean;
        var
          lpss: SHELLSTATE;
        begin
          ZeroMemory(@lpss, sizeof(lpss));
          // Получаем текущее состояние
          SHGetSetSettings(lpss, SSF_SHOWSUPERHIDDEN, False);
          // Возвращаем состояние
          result:= lpss.fShowSuperHidden;
        end;
        От чего же?... У меня вот так это дело прописано:

        ExpandedWrap disabled
          type
            tagSHELLSTATEW = record
              Data: DWORD;
              Data2: UINT;
              lParamSort: Integer;
              iSortDirection: Integer;
              version: UINT;
              uNotUsed: UINT;
           end;
            SHELLSTATEA = tagSHELLSTATEW;
            SHELLSTATEW = tagSHELLSTATEW;
            SHELLSTATE = SHELLSTATEW;
            TShellState = SHELLSTATE;
            PShellState = ^TShellState;
           
          const
            //Data
            fShowAllObjects       = $00000001;
            fShowExtensions       = $00000002;
            fNoConfirmRecycle     = $00000004;
            fShowSysFiles         = $00000008;
            fShowCompColor        = $00000010;
            fDoubleClickInWebView = $00000020;
            fDesktopHTML          = $00000040;
            fWin95Classic         = $00000080;
            fDontPrettyPath       = $00000100;
            fShowAttribCol        = $00000200;
            fMapNetDrvBtn         = $00000400;
            fShowInfoTip          = $00000800;
            fHideIcons            = $00001000;
            fWebView              = $00002000;
            fFilter               = $00004000;
            fShowSuperHidden      = $00008000;
            fNoNetCrawling        = $00010000;
           
            //Data2
            fSepProcess      = $00000001;
            fStartPanelOn    = $00000002;
            fShowStartPage   = $00000004;
            fAutoCheckSelect = $00000008;
            fIconsOnly       = $00000010;
            fShowTypeOverlay = $00000020;
           
          const
            SSF_SHOWALLOBJECTS  = $00000001;
            SSF_SHOWEXTENSIONS  = $00000002;
            SSF_HIDDENFILEEXTS  = $00000004;
            SSF_SERVERADMINUI   = $00000004;
            SSF_SHOWCOMPCOLOR   = $00000008;
            SSF_SORTCOLUMNS     = $00000010;
            SSF_SHOWSYSFILES    = $00000020;
            SSF_DOUBLECLICKINWEBVIEW = $00000080;
            SSF_SHOWATTRIBCOL   = $00000100;
            SSF_DESKTOPHTML     = $00000200;
            SSF_WIN95CLASSIC    = $00000400;
            SSF_DONTPRETTYPATH  = $00000800;
            SSF_SHOWINFOTIP     = $00002000;
            SSF_MAPNETDRVBUTTON = $00001000;
            SSF_NOCONFIRMRECYCLE = $00008000;
            SSF_HIDEICONS       = $00004000;
            SSF_FILTER          = $00010000;
            SSF_WEBVIEW         = $00020000;
            SSF_SHOWSUPERHIDDEN = $00040000;
            SSF_SEPPROCESS      = $00080000;
            SSF_NONETCRAWLING   = $00100000;
            SSF_STARTPANELON    = $00200000;
            SSF_SHOWSTARTPAGE   = $00400000;
           
          procedure SHGetSetSettings(var lpss: TShellState; dwMask: DWORD; bSet: BOOL) stdcall; external 'shell32.dll';


        Или этот код не верный?
          Используй то что прописано в ShlObj, а не этот кривой костыль, тем более не правильно задекларированный.
          Версия дельфи какая?
            Да в том то и дело, что на семерке еще, вот и цепляю код от куда придется... Для себя пишу.
              Понятно, тогда вот так делай...

              ExpandedWrap disabled
                type
                  TShellState = record
                    { это все сидит в Flags1
                    BOOL fShowAllObjects : 1;
                    BOOL fShowExtensions : 1;
                    BOOL fNoConfirmRecycle : 1;
                    BOOL fShowSysFiles : 1;
                    BOOL fShowCompColor : 1;
                    BOOL fDoubleClickInWebView : 1;
                    BOOL fDesktopHTML : 1;
                    BOOL fWin95Classic : 1;
                    BOOL fDontPrettyPath : 1;
                    BOOL fShowAttribCol : 1; // No longer used, dead bit
                    BOOL fMapNetDrvBtn : 1;
                    BOOL fShowInfoTip : 1;
                    BOOL fHideIcons : 1;
                    BOOL fWebView : 1;
                    BOOL fFilter : 1;
                    BOOL fShowSuperHidden : 1; <<< это 15-ый бит!!! Его передаем в IsBitOn/ChangeBitValue
                    BOOL fNoNetCrawling : 1;
                    }
                    Flags1: DWORD;
                 
                    dwWin95Unused: DWORD; // Win95 only - no longer supported pszHiddenFileExts
                    uWin95Unused: UINT;   // Win95 only - no longer supported cbHiddenFileExts
                 
                    // Note: Not a typo!  This is a persisted structure so we cannot use LPARAM
                    lParamSort: Long;
                    iSortDirection: Integer;
                    version: UINT;
                 
                    // new for win2k. need notUsed var to calc the right size of ie4 struct
                    // FIELD_OFFSET does not work on bit fields
                    uNotUsed: UINT;       // feel free to rename and use
                 
                    { это все сидит в Flags2
                    BOOL fSepProcess: 1;
                 
                    // new for Whistler.
                    BOOL fStartPanelOn: 1;       //Indicates if the Whistler StartPanel mode is ON or OFF.
                    BOOL fShowStartPage: 1;      //Indicates if the Whistler StartPage on desktop is ON or OFF.
                 
                    // new for Windows Vista
                    BOOL fAutoCheckSelect: 1;
                    BOOL fIconsOnly: 1;
                    BOOL fShowTypeOverlay: 1;
                 
                    // new for Windows 8
                    BOOL fShowStatusBar : 1;
                 
                    UINT fSpareFlags : 9;
                    }
                    Flags2: Word;
                  end;
                 
                  procedure SHGetSetSettings(var lpss: TShellState; dwMask: DWORD; bSet: BOOL) stdcall; external 'shell32.dll';
                 
                function IsBitOn(Value: DWORD; BitIndex: Byte): Boolean;
                begin
                  Result := Value and (1 shl BitIndex) <> 0;
                end;
                 
                procedure ChangeBitValue(var Value: DWORD; BitIndex: Byte; BitOn: Boolean);
                begin
                  if BitOn then
                    Value := Value or (1 shl BitIndex)
                  else
                    Value := Value and not (1 shl BitIndex);
                end;
                 
                // Скрыть/показать защищенные файлы (ЭТОТ КОД НЕ РАБОТАЕТ!)
                procedure SHShowSuperHiddenFile(show: Boolean);
                var
                  lpss: TShellState;
                begin
                  ZeroMemory(@lpss, sizeof(TShellState));
                 
                  // меняем состояние 15-го бита в структуре, который содержит значение SHOWSUPERHIDDEN!!!
                  ChangeBitValue(lpss.Flags1, 15, show);
                 
                  // Меняем состояние
                  SHGetSetSettings(lpss, SSF_SHOWSUPERHIDDEN, True);
                  // Сообщение Проводнику об изменениях
                  SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_FLUSHNOWAIT, nil, nil);
                end;
                 
                // Определяем, скрыты или нет защищенные файлы
                function ShGetShowSuperHiddenFileState:boolean;
                var
                  lpss: TShellState;
                begin
                  ZeroMemory(@lpss, sizeof(TShellState));
                  // Получаем текущее состояние
                  SHGetSetSettings(lpss, SSF_SHOWSUPERHIDDEN, False);
                  // Возвращаем состояние из 15-го бита!!!
                  result := IsBitOn(lpss.Flags1, 15);
                end;
                Самое интересное, что ShGetShowSuperHiddenFileState работает корректно. У меня и в предыдущей версии подобная функция отлично работала. А вот SHShowSuperHiddenFile не хочет работать. Проверяю через Параметры папок:
                Прикреплённый файлПрикреплённый файл_____________________________.png (32,61 Кбайт, скачиваний: 74)
                  Ребята, будут еще какие-то идеи?
                  0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                  0 пользователей:


                  Рейтинг@Mail.ru
                  [ Script execution time: 0,0309 ]   [ 18 queries used ]   [ Generated: 18.04.24, 03:34 GMT ]