Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.06.27;
Скачать: CL | DM;

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.013 c
1-88800
deymon
2002-06-14 21:57
2002.06.27
Подскажите, можно ли....


14-89033
strel
2002-05-25 18:42
2002.06.27
как сдел. чтоб при запуске DPR a открывались ранее откр-е файлы


3-88697
roadstar
2002-06-01 11:12
2002.06.27
TADOX


6-88978
heruvim4ik
2002-04-18 02:02
2002.06.27
Работа с TNMSMTP


3-88736
PETR_
2002-06-04 11:18
2002.06.27
DBGrid и логические поля