Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.06.2015, 13:25   #1
volod3000
Форумчанин
 
Аватар для volod3000
 
Регистрация: 18.12.2008
Сообщений: 266
По умолчанию shell32.dll

Привет !

Есть функция :

Код:
function SHGetSetFolderCustomSettings(pfcs: PSHFOLDERCUSTOMSETTINGS;
  pszPath: PWideChar; dwReadWrite: DWORD): HRESULT; stdcall; external 'shell32.dll';
Применяю ее для смены значка у папки.
В 32-bit работает прекрасно, но в 64-bit, не работает.

Усть ли функция:

Код:
function SHGetSetFolderCustomSettings64(pfcs: PSHFOLDERCUSTOMSETTINGS;
  pszPath: PWideChar; dwReadWrite: DWORD): HRESULT; stdcall; external 'shell64.dll';

Мало открыть человеку глаза, большинство еще просит указать дорогу и ждет волшебного пенделя.
volod3000 вне форума Ответить с цитированием
Старый 10.06.2015, 15:17   #2
Vapaamies
Ваш К. О.
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,770
По умолчанию

Не усть. Нужно взять современную версию Delphi и собрать 64-битную версию приложения. ЧСХ, библиотека оболочки в ней по-прежнему называется shell32.dll и лежит в %SystemRoot%\System32.
Vapaamies вне форума Ответить с цитированием
Старый 11.06.2015, 13:34   #3
volod3000
Форумчанин
 
Аватар для volod3000
 
Регистрация: 18.12.2008
Сообщений: 266
По умолчанию

Делаю следующее:

Код:
.............
   function SHGetSetFolderCustomSettings(pfcs: PSHFOLDERCUSTOMSETTINGS;
  pszPath: PWideChar; dwReadWrite: DWORD): HRESULT; stdcall; external 'shell32.dll';


function SetFolderIcon(Folder, IconFile: WideString; IconIndex: Integer): HRESULT;
var
  fcs: SHFolderCustomSettings;
begin
  FillChar(fcs, SizeOf(fcs), 0);
  fcs.dwSize := SizeOf(fcs);
  fcs.dwMask := FCSM_ICONFILE;
  fcs.pszIconFile := PWideChar(IconFile);
  fcs.cchIconFile := 0;
  fcs.iIconIndex := IconIndex;
  if IsWow64 then begin
  Result := SHGetSetFolderCustomSettings(@fcs, PWideChar(Folder), FCS_FORCEWRITE);
  end else begin
  Result := SHGetSetFolderCustomSettings(@fcs, PWideChar(Folder), FCS_FORCEWRITE);
  end;
end;

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
   if SetFolderIcon('C:\Users\volod3000\Desktop\Разработка\pro\2',
                   'C:\Users\volod3000\Desktop\Разработка\pro\2.ico', 0) = S_OK then begin
         Label1.caption:= 'Успешная смена иконки';
   end;
end;

........
Так вот, когда компилирую в 32-bit windows, все отлично, значек у папки меняются.
А вот когда компилирую в 64-bit windows, программа запускается, но действий не происходит, значек у папки не меняются.
Вот в этом проблемма.

Мало открыть человеку глаза, большинство еще просит указать дорогу и ждет волшебного пенделя.
volod3000 вне форума Ответить с цитированием
Старый 11.06.2015, 13:58   #4
Vapaamies
Ваш К. О.
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,770
По умолчанию

Цитата:
Сообщение от volod3000 Посмотреть сообщение
Так вот, когда компилирую в 32-bit windows, все отлично, значек у папки меняются.
А вот когда компилирую в 64-bit windows, программа запускается, но действий не происходит, значек у папки не меняются.
Аффтар, ты тупо баран. Тебе выше сказано, что надо делать. Не компилировать "под Windows", а собрать приложение другой разрядности. Отставить быть бараном!

Волшебный пендель в соответствии с подписью аффтара.
Vapaamies вне форума Ответить с цитированием
Старый 11.06.2015, 13:58   #5
volod3000
Форумчанин
 
Аватар для volod3000
 
Регистрация: 18.12.2008
Сообщений: 266
По умолчанию

Да, еще вопрос.
Есть ли еще, какой способ, менять значек у папки ?

Мало открыть человеку глаза, большинство еще просит указать дорогу и ждет волшебного пенделя.
volod3000 вне форума Ответить с цитированием
Старый 11.06.2015, 14:20   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Есть ли еще, какой способ, менять значек у папки ?
На сколько я знаю нужно создавать спецфайл thumbs.db в папке, тогда значек ее будет подтягиваться из этого файла.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 11.06.2015, 14:40   #7
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

thumbs.db это насколько я помню preview картинок, если такие есть.
Иконки папки - через desktop.ini, примерно вот такого содержания:


Код:
[.ShellClassInfo]
ConfirmFileOp=0
NoSharing=1
IconFile=Folder.ico
IconIndex=0
InfoTip=Some sensible information.
Ref:
https://msdn.microsoft.com/en-us/lib...(v=vs.85).aspx
waleri вне форума Ответить с цитированием
Старый 11.06.2015, 18:50   #8
volod3000
Форумчанин
 
Аватар для volod3000
 
Регистрация: 18.12.2008
Сообщений: 266
По умолчанию

Попробовал:
Создал файл desctop.ini,
записал в него:
PHP код:
 [.ShellClassInfo]
 
IconResource=C:\Windows\system32\SHELL32.dll,11 
Но желаемого результата не получил, даже после перезагрузки
значек у папки не поменялся.

Получается только функция SHGetSetFolderCustomSettings
доступна для смены значка у папки, программным способом.

Мало открыть человеку глаза, большинство еще просит указать дорогу и ждет волшебного пенделя.
volod3000 вне форума Ответить с цитированием
Старый 12.06.2015, 09:23   #9
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Я попробовал, у меня все получилось, даже без перезагрузки.
Windows 7 x64.
waleri вне форума Ответить с цитированием
Старый 12.06.2015, 17:38   #10
volod3000
Форумчанин
 
Аватар для volod3000
 
Регистрация: 18.12.2008
Сообщений: 266
По умолчанию

Вся проблема в windows 8.1 x64, а точнее в правах программы.
Прикрутил манифест :

Цитата:
Код HTML:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  <dependency>
    <dependentAssembly>
      <assemblyIdentity
        type="win32"
        name="Microsoft.Windows.Common-Controls"
        version="6.0.0.0"
        publicKeyToken="6595b64144ccf1df"
        language="*"
        processorArchitecture="*"/>
    </dependentAssembly>
  </dependency>
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
    <security>
      <requestedPrivileges>
        <requestedExecutionLevel
          level="requireAdministrator"/>
        </requestedPrivileges>
    </security>
  </trustInfo>
    <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1"> 
        <application> 
            <!--The ID below indicates application support for Windows Vista -->
            <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/> 
            <!--The ID below indicates application support for Windows 7 -->
            <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
			<!--The ID below indicates application support for Windows 8 -->
            <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
			<!--The ID below indicates application support for Windows 8,1 -->
            <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
        </application> 
    </compatibility>
</assembly>
На обычные папки, т.е. созданные мной, прав достаточно, значек меняется.
А вот для папки, например Program Files и внутри, прав не достаточно.

Есть ли способ еще повысить права, или это предел ?

Мало открыть человеку глаза, большинство еще просит указать дорогу и ждет волшебного пенделя.
volod3000 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Инструкция для сборки приложений на Qt в один exe без зависимостей от libstdc++-6.dll, libgcc_s_dw2-1.dll, Qt5Core.dll и т.д. 8Observer8 Qt и кроссплатформенное программирование С/С++ 12 25.06.2015 03:18
C# & DLL: как указать, что загружать DLL нужно из ЗАДАННОЙ папки "D:\My\Path\a.dll" ? AntyDES C# (си шарп) 11 10.10.2012 20:00
Загрузка ShellExecute из shell32.dll IgorKr Общие вопросы C/C++ 0 02.02.2011 17:42
shell32.dll и иконки Baaandit Общие вопросы Delphi 10 24.11.2009 20:16
Бинарные данные в shell32.dll роздел FTR bmw Windows 4 26.02.2009 17:44