Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2002.06.27;
Скачать: [xml.tar.bz2];

Вниз

Как отобразить виртуальные папки   Найти похожие ветки 

 
anod   (2002-06-17 17:02) [0]

Мой компьютер, панель управлени, сетевое окружение и т.д.
Их pidl я нахожу, а что мне с ним делать-то или есть альтернативный метод?


 
Дмитрий Баранов   (2002-06-17 17:16) [1]

Получаешь IShellFolder десктопа.
Далее -
HRESULT GetDisplayNameOf(
LPCITEMIDLIST pidl, // твой Pidl
DWORD uFlags, // тебе нужен SHGDN_FORADDRESSBAR
LPSTRRET lpName //PChar или array[0..MAX_PATH] of char
);

возвращает в третьем параметре то, что тебе надо.


 
ANOD   (2002-06-17 18:31) [2]

В третьем параметре не PCHAR, так он выдает ошибку при компиляции, а структура STRRET - выдает ошибку при выполнении.

var pidl : PItemIDList;
shf : IShellFolder;
str : strret;
begin
SHGetSpecialFolderLocation(Handle, CSIDL_DESKTOP, pidl);
shf.GetDisplayNameOf(pidl,SHGDN_FORADDRESSBAR,str);
end;


 
ANOD   (2002-06-17 18:33) [3]

Ещё в SDK описана функция StrRetToStr, но в у меня не получилось скомпилировать.


 
Дмитрий Баранов   (2002-06-17 18:36) [4]

В натуре - совсем забыл, там действительно STRRET, который надо анализировать, в зависимости от флагов возвращается PChar или WideString. Извиняюсь, у меня пример только на VC, если надо помочь - пиши на мыло

CString GetPathName( LPCITEMIDLIST pidl, DWORD flags, IShellFolder *sf) {
IMalloc *pMalloc;
SHGetMalloc(&pMalloc);

STRRET value;
sf->GetDisplayNameOf(pidl, flags, &value);
char * result = NULL;

Again:
switch( value.uType )
{
case STRRET_CSTR:
result = strdup( value.cStr );
break;
case STRRET_WSTR:
{
int iSize = WideCharToMultiByte( CP_THREAD_ACP, 0, value.pOleStr, -1, NULL, 0, NULL, NULL );
result = (char *)malloc(iSize);
WideCharToMultiByte( CP_THREAD_ACP, 0, value.pOleStr, -1, result, iSize, NULL, NULL );
if (value.pOleStr == NULL) {
if (flags == SHGDN_NORMAL) {
flags = SHGDN_FORPARSING;
goto Again;
}
}
pMalloc->Free( value.pOleStr );
}
break;
case STRRET_OFFSET:
result = strdup( PSTR( PBYTE(pidl) + value.uOffset ) );
break;
}
CString ret = result;
return ret;
}


 
ANOD   (2002-06-17 18:41) [5]

STRRET value;
sf->GetDisplayNameOf(pidl, flags, &value);


Я с VB не знаком, &value это указатель? просто у меня выдает ошибку здесь??


 
Дмитрий Баранов   (2002-06-17 18:43) [6]

Я сейчас убегаю, дома у меня пример PopUp-менюшки с системными иконками валяется, вечером сюда помещу; пример на Delphi.
А в двух словах - анализируем STRRET, если флаг uType - STRRET_CSTR - преобразуем в PChar, STRRET_WSTR - делаем MultiByteToWideString и получаем PChar, STRRET_OFFSET - результат начинается с адреса pidl + uOffset.


 
Дмитрий Баранов   (2002-06-17 18:54) [7]

var value: STRRET; //(или _STRRET, не помню);

sf.GetDisplayNameOf(pidl, flags, value); //здесь value передается по ссылке (никаких значков адреса не надо)

===

>> MultiByteToWideString - во я дал...
WideCharToMultiByte, конечно же.



 
Случайный прохожий   (2002-06-17 21:06) [8]

function StrRetToString в модуле ShellCtrls


 
Дмитрий Баранов   (2002-06-17 21:12) [9]

Легких путей не ищем.

var pidl : PItemIDList;
Dummy : Cardinal;
RET : _STRRET;
Name : string;
Z : PChar;
sil : cardinal;
FileInfo : _SHFileInfoA;
ImageIndex: integer;
Item: TMenuItem;
sf: IShellFolder;
NewMenu: TPopUpMenu;
begin
il.Clear;
pm.Items.Clear;
SHGetMalloc(Malloc);
SHGetDesktopFolder(Desktop);

SHGetSpecialFolderLocation(Self.Handle, CSIDL_DESKTOP, pidl);

il.Handle:=SHGETFILEINFO(
PChar(pidl),
0,
FileInfo,
SizeOf(SHFileInfo),
SHGFI_PIDL or SHGFI_SYSICONINDEX or SHGFI_SMALLICON
);

Desktop.EnumObjects(Self.Handle,SHCONTF_FOLDERS or SHCONTF_NONFOLDERS, EnumList);
while (EnumList.Next(1, pidl, Dummy) <> S_FALSE) do
begin
Desktop.GetDisplayNameOf(pidl, SHGDN_FORPARSING, RET);
case RET.uType of
STRRET_OFFSET:
begin
Name:=StrPas(PChar(BYTE(pidl) + RET.uOffset));
end;
STRRET_CSTR:
begin
Name:=Strpas(RET.cStr);
end;
STRRET_WSTR: Name:=RET.pOleStr;
end;
ImageIndex:=SHGetFileInfo(
PChar(Name),
SFGAO_SHARE or SFGAO_FILESYSTEM or SFGAO_LINK or SFGAO_HASSUBFOLDER,
FileInfo,
sizeof(FileInfo),
SHGFI_SYSICONINDEX
);
Item:=TMenuItem.Create(pm);
Item.Caption:=Name;
Item.ImageIndex:=FileInfo.iIcon;
pm.Items.Add(Item);
end;
end;


 
ANOD   (2002-06-17 22:42) [10]

Огромное Вам Спасибо, если бы не Вы, я надолго застрял бы с этой проблемкой!
Вся ошибка была в этой строке:
SHGetDesktopFolder(Desktop);
, её у меня не было :)



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2002.06.27;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.006 c
3-88739
kioto
2002-06-01 20:27
2002.06.27
Как из DBGrid-а перенести данные в существующий файл Excel ?


7-89048
star
2002-03-29 15:40
2002.06.27
Как получить доступ к FAT диска ?


3-88768
CODC
2002-06-05 06:31
2002.06.27
корректная очистка таблицы


1-88902
voodoo_alex
2002-06-13 21:59
2002.06.27
Как идеологически верней ?


1-88826
tamerlan311
2002-06-17 11:07
2002.06.27
Помогите создать безхозный процесс





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский