Главная страница
    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.47 MB
Время: 0.006 c
14-89002
antistatic
2002-05-23 18:32
2002.06.27
Где можно скачать старые версии Windows


3-88716
Besa
2002-06-03 15:42
2002.06.27
SQL не отрабатывает...


14-88992
Malder
2002-05-18 22:03
2002.06.27
Почему нельзя создать файл AUX ?


3-88696
sergikkkk
2002-06-01 11:50
2002.06.27
interbase


14-89041
lak_b
2002-05-28 00:25
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский