Форум: "Основная";
Текущий архив: 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