Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
 Аватар для Orakul
14 / 10 / 5
Регистрация: 07.07.2012
Сообщений: 171

Как работать с функцией SHGetFileInfoW?

02.05.2015, 22:57. Показов 1890. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Ребят задача требует получить информацию об объекте файловой системы : файле, папке, диске. Для этого использую функцию SHGetFileInfoW - в хидере описание данной функции выглядит так :
C++
1
2
3
4
5
6
7
8
9
SHSTDAPI_(DWORD_PTR) SHGetFileInfoA(LPCSTR pszPath,
                        DWORD dwFileAttributes,
                        __inout_bcount_opt(cbFileInfo) SHFILEINFOA *psfi,
                        UINT cbFileInfo, UINT uFlags);
 
SHSTDAPI_(DWORD_PTR) SHGetFileInfoW(LPCWSTR pszPath,
                     DWORD dwFileAttributes,
                     __inout_bcount_opt(cbFileInfo) SHFILEINFOW *psfi,
                        UINT cbFileInfo, UINT uFlags);
Мой код , который выдает ошибку:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
void __fastcall Twindowsnetrepository::FormCreate(TObject *Sender)
{
    UINT SysImageList;
    TSHFileInfo SFI;
//  char patch = '';
    ListView1->LargeImages = new TImageList(this);
    ListView1->SmallImages = new TImageList(this);
    //Запрашиваем большие иконки
 // SysImageList = SHGetFileInfo('', 0,  &SFI, sizeof(SFI), SHGFI_ICON | SHGFI_SYSICONINDEX | SHGFI_LARGEICON);
    if (SysImageList != 0 )
        {
//Присваиваем системные иконки в ListViewl
            ListView1->LargeImages->Handle = SysImageList;
            ListView1->LargeImages->ShareImages = TRUE;
        }
//Запрашиваем маленькие иконки
    SysImageList = SHGetFileInfoW(' ', 0, &SFI, sizeof(SFI),SHGFI_SYSICONINDEX | SHGFI_SMALLICON);
    if (SysImageList != 0)
        {
            //Присваиваем маленькие системные иконки в ListViewlОбзор дополнительных компонентов Delphi  323
            ListView1->SmallImages->Handle = SysImageList;
            ListView1->SmallImages->ShareImages =  TRUE;
        }
}
Компилятор ругается на первый параметр функции SHGetFileInfoW: LPCWSTR pszPath -" Character constant too long (or empty)".
Как видно из сообщения компилятору не нравится "Длинная или пустая константа" - pszPath. Пробовал передавать явно через константу pszPath ,путь к файлу все равно ругается. Подскажите если сталкивались в чем тут загвоздка. Просмотрел исходники трех Filemanager без результатно , ответа на свой вопрос не нашел.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
02.05.2015, 22:57
Ответы с готовыми решениями:

как работать с функцией?
здравствуйте! подскажите пож - подключаю функцию: function translitIt($str) { $tr = array( ...

Как работать с функцией SystemParametersInfo?
Чтобы установить обои рабочего стола. Уже задал этот вопрос в C++ разделе, пока никто не ответил, может родные дельфисты помогут)) Вот...

Как работать с функцией ранг
:????

13
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
02.05.2015, 23:35
Цитата Сообщение от Orakul Посмотреть сообщение
Пробовал передавать явно через константу pszPath ,путь к файлу все равно ругается.
Показывай, как пробовал, тогда уж.
0
 Аватар для Orakul
14 / 10 / 5
Регистрация: 07.07.2012
Сообщений: 171
02.05.2015, 23:40  [ТС]
вот так
SysImageList = SHGetFileInfoW('H:\\фильмы', 0, &SFI, sizeof(SFI),SHGFI_SYSICONINDEX | SHGFI_SMALLICON);

Добавлено через 42 секунды
или через амперсанд надо?
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
03.05.2015, 00:17
Одинарные кавычки используются для обозначения одного символа. Строка обозначается двойными кавычками.
0
 Аватар для Orakul
14 / 10 / 5
Регистрация: 07.07.2012
Сообщений: 171
03.05.2015, 00:32  [ТС]
Это понятно спасибо. Просто параметр pszPatch задает файл или шаблон файла ,о которых требуется получить информацию. Я же ни ищу конкретно какие то файлы , мне требуется получить иконки папок и файлов , то есть этот параметр : pszPatch я могу просто задать как пустой символ - ' или нет?

Добавлено через 5 минут
В примере книге Михаил Фленов - Бибилия Делфи на 322-й странице он передает в этот параметр : pszPatch = ' '. Когда я так делаю SysImageList = SHGetFileInfoW('', 0, &SFI, sizeof(SFI),SHGFI_SYSICONINDEX | SHGFI_SMALLICON);
то пулучаю ошибку Character constant too long (or empty). Вот собственно вопрос что и как передавать в параметр pzsPatch ?
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
03.05.2015, 01:03
Вот что нам поведает справка:
pszPath [in]
Type: LPCTSTR
A pointer to a null-terminated string of maximum length MAX_PATH that contains the path and file name. Both absolute and relative paths are valid.
If the uFlags parameter includes the SHGFI_PIDL flag, this parameter must be the address of an ITEMIDLIST (PIDL) structure that contains the list of item identifiers that uniquely identifies the file within the Shell's namespace. The PIDL must be a fully qualified PIDL. Relative PIDLs are not allowed.
If the uFlags parameter includes the SHGFI_USEFILEATTRIBUTES flag, this parameter does not have to be a valid file name. The function will proceed as if the file exists with the specified name and with the file attributes passed in the dwFileAttributes parameter. This allows you to obtain information about a file type by passing just the extension for pszPath and passing FILE_ATTRIBUTE_NORMAL in dwFileAttributes.
This string can use either short (the 8.3 form) or long file names.
А именно, чтобы получить информацию не о конкретном файле, а о типе файлов, следует передавать расширение. Кто такой Михаил Фленов и что за библии он писал мне неведомо.
1
 Аватар для Orakul
14 / 10 / 5
Регистрация: 07.07.2012
Сообщений: 171
03.05.2015, 01:10  [ТС]
Камень в огород флеонова. А Архангельский тоже сыроежка?
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
03.05.2015, 01:27
Архангельский - человек, насколько мне известно, но в наше время, видимо, уже все возможно.
Его читал когда-то. Не скажу, что нет совсем очепяток в листингах, уже просто не помню. Но для начала хорошие книжки. Вообще же лучше полагаться на справку к библиотеке, если есть такая возможность.
1
 Аватар для Orakul
14 / 10 / 5
Регистрация: 07.07.2012
Сообщений: 171
03.05.2015, 03:09  [ТС]
Приятно ))) пообщаться с человеком у которого чувство юмора развито

Добавлено через 1 час 37 минут
А как же тогда в компонент ListView вывести все файлы и папки с некоторого файлового диска? Если передавать в pszPatch расширение файла то он выведет только файлы с этим расширением. То есть если мы зададим в pszPatch расширение файла то это будет шаблон.
0
управление сложностью
 Аватар для Почтальон
1693 / 1306 / 259
Регистрация: 22.03.2015
Сообщений: 7,545
Записей в блоге: 5
03.05.2015, 08:43
Ну обычно ListView используется в связке с другими копонентами. А поводу листингов в книгах - иногда в них намеренно допускают ошибки.
0
 Аватар для Orakul
14 / 10 / 5
Регистрация: 07.07.2012
Сообщений: 171
03.05.2015, 12:21  [ТС]
Вот выдрал из исходника рабочую строчку
C++
1
THandle SysImageList = SHGetFileInfo(L"", 0,  &SFI, sizeof(SFI), SHGFI_ICON | SHGFI_SYSICONINDEX | SHGFI_LARGEICON);
Что означает L в первом параметре ? , если L убрать то компил-р выдает ошибку.
0
управление сложностью
 Аватар для Почтальон
1693 / 1306 / 259
Регистрация: 22.03.2015
Сообщений: 7,545
Записей в блоге: 5
03.05.2015, 12:41
L - значит Long, это преобразование типов, для переносимости.
1
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
03.05.2015, 12:58
Вот, нашел еще в комментариях к справке:
Don't pass an empty name to get the generic file icon
Before Windows 7, you used to be able to use this to get the generic file icon (i.e. the ones for unknown file types):

SHGetFileInfo(L"", FILE_ATTRIBUTE_NORMAL, &sfi, sizeof(sfi), SHGFI_ICON|SHGFI_SMALLICON|SHGFI_USEFILE ATTRIBUTES);

In Windows 7 the behaviour seems to have changed and the above call will get you back the icon for your system drive.


Instead, pass a non-empty filename without an extension:

SHGetFileInfo(L"dummy", FILE_ATTRIBUTE_NORMAL, &sfi, sizeof(sfi),
SHGFI_ICON|SHGFI_SMALLICON|SHGFI_USEFILE ATTRIBUTES);

When getting the icon for a particular extension you can still just provide an extension with no base name:

SHGetFileInfo(L".txt", FILE_ATTRIBUTE_NORMAL, &sfi, sizeof(sfi),
SHGFI_ICON|SHGFI_SMALLICON|SHGFI_USEFILE ATTRIBUTES);
Возможно, не стоит все же передавать пустое имя.

Добавлено через 1 минуту
Цитата Сообщение от Orakul Посмотреть сообщение
Что означает L в первом параметре ?
Это означает, что строка состоит из символов whar_t, а не из символов char. Это обозначение юникода для компилятора.
2
 Аватар для Orakul
14 / 10 / 5
Регистрация: 07.07.2012
Сообщений: 171
03.05.2015, 13:05  [ТС]
Потихоньку продвигаюсь - уже голова кипит. Хочу попробовать создать аналог проводника windows с использованием компонента listview.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
03.05.2015, 13:05
Помогаю со студенческими работами здесь

Как работать с функцией memchr( ) в С++
Помогите пожалуйста разобраться как работает функция memchr() в С++. Я прогуглил этот вопрос, но почему-то большинство примеров на С, а мне...

Как работать с функцией rand()
Помогите сделать так, чтобы rand() каждый раз выкидывал неповторяющиеся значения.

Как работать с функцией SystemParametersInfo?
Чтобы установить обои рабочего стола. Пишу вот так: #include "stdafx.h" #include <Windows.h> int _tmain(int argc, _TCHAR*...

Как корректно работать с функцией fread?
Мне необходимо считать информацию из одной директории, а потом поместить эту же информацию в другую директорию(скопировать). Возникла...

Как правильно работать с функцией window()?
Задача такая. Вывести в верхней части экрана небоольшой заголовок с менюшками. Затем прочитать файл и вывести его с прокруткой в оставшейся...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru