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

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

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

Author24 — интернет-сервис помощи студентам
Ребят задача требует получить информацию об объекте файловой системы : файле, папке, диске. Для этого использую функцию 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.05.2015, 22:57
Ответы с готовыми решениями:

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

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

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

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

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

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

Добавлено через 5 минут
В примере книге Михаил Фленов - Бибилия Делфи на 322-й странице он передает в этот параметр : pszPatch = ' '. Когда я так делаю SysImageList = SHGetFileInfoW('', 0, &SFI, sizeof(SFI),SHGFI_SYSICONINDEX | SHGFI_SMALLICON);
то пулучаю ошибку Character constant too long (or empty). Вот собственно вопрос что и как передавать в параметр pzsPatch ?
0
4043 / 2332 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
03.05.2015, 01:03 6
Вот что нам поведает справка:
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
14 / 10 / 5
Регистрация: 07.07.2012
Сообщений: 171
03.05.2015, 01:10  [ТС] 7
Камень в огород флеонова. А Архангельский тоже сыроежка?
0
4043 / 2332 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
03.05.2015, 01:27 8
Архангельский - человек, насколько мне известно, но в наше время, видимо, уже все возможно.
Его читал когда-то. Не скажу, что нет совсем очепяток в листингах, уже просто не помню. Но для начала хорошие книжки. Вообще же лучше полагаться на справку к библиотеке, если есть такая возможность.
1
14 / 10 / 5
Регистрация: 07.07.2012
Сообщений: 171
03.05.2015, 03:09  [ТС] 9
Приятно ))) пообщаться с человеком у которого чувство юмора развито

Добавлено через 1 час 37 минут
А как же тогда в компонент ListView вывести все файлы и папки с некоторого файлового диска? Если передавать в pszPatch расширение файла то он выведет только файлы с этим расширением. То есть если мы зададим в pszPatch расширение файла то это будет шаблон.
0
управление сложностью
1687 / 1300 / 259
Регистрация: 22.03.2015
Сообщений: 7,545
Записей в блоге: 5
03.05.2015, 08:43 10
Ну обычно ListView используется в связке с другими копонентами. А поводу листингов в книгах - иногда в них намеренно допускают ошибки.
0
14 / 10 / 5
Регистрация: 07.07.2012
Сообщений: 171
03.05.2015, 12:21  [ТС] 11
Вот выдрал из исходника рабочую строчку
C++
1
THandle SysImageList = SHGetFileInfo(L"", 0,  &SFI, sizeof(SFI), SHGFI_ICON | SHGFI_SYSICONINDEX | SHGFI_LARGEICON);
Что означает L в первом параметре ? , если L убрать то компил-р выдает ошибку.
0
управление сложностью
1687 / 1300 / 259
Регистрация: 22.03.2015
Сообщений: 7,545
Записей в блоге: 5
03.05.2015, 12:41 12
L - значит Long, это преобразование типов, для переносимости.
1
4043 / 2332 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
03.05.2015, 12:58 13
Вот, нашел еще в комментариях к справке:
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_USEFILEATTRIBUTES);

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_USEFILEATTRIBUTES);

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_USEFILEATTRIBUTES);
Возможно, не стоит все же передавать пустое имя.

Добавлено через 1 минуту
Цитата Сообщение от Orakul Посмотреть сообщение
Что означает L в первом параметре ?
Это означает, что строка состоит из символов whar_t, а не из символов char. Это обозначение юникода для компилятора.
2
14 / 10 / 5
Регистрация: 07.07.2012
Сообщений: 171
03.05.2015, 13:05  [ТС] 14
Потихоньку продвигаюсь - уже голова кипит. Хочу попробовать создать аналог проводника windows с использованием компонента listview.
0
03.05.2015, 13:05
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.05.2015, 13:05
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru