Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.01.2009, 23:25   #1
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию Получение системных путей

Приветствую. Собственно вопрос как получить например путь к открытию через шел винды (ShellApi.ShellExecute) корзину. Индефикатор-путь будет вида ::{.........} Есть идея что надо работать через SHGetSpecialFolderLocation и CSIDL_BITBUCKET. Но это не дает результат, у меня. Собственно интерисует возможность получать все возможные индификаторы в системе. Может кто разъяснит. Спасибо.
BOBAH13 вне форума Ответить с цитированием
Старый 15.01.2009, 10:08   #2
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

вот этот код получает все возможные системные пути и выводит в Memo.
Выводится номер пути и сам путь
Код:
uses shellapi,shlobj;

procedure TForm1.Button1Click(Sender: TObject);
var i:integer;
    str:array[0..999] of char;
begin
 for i:=0 to $40 do
  begin
   SHGetSpecialFolderPath(0,@str,CSIDL_DESKTOP+i,false);
   memo1.lines.Add(inttohex(CSIDL_DESKTOP+i,3)+'  '+str);
  end;
end;
в общем, пробуй.
rpy3uH вне форума Ответить с цитированием
Старый 15.01.2009, 12:57   #3
lokiz
 
Аватар для lokiz
 
Регистрация: 15.01.2009
Сообщений: 6
По умолчанию

Можно так попробоывать (все системные директории там прописаны )
Код:
 uses
   Registry;

 function GetProgramFilesDir: string;
 var
   reg: TRegistry;
 begin
   reg := TRegistry.Create;
   try
     reg.RootKey := HKEY_LOCAL_MACHINE;
     reg.OpenKey('SOFTWARE\Microsoft\Windows\CurrentVersion', False);
     Result := reg.ReadString('ProgramFilesDir');
   finally
     reg.Free;
   end;
 end;
или так (если без реестра):
Код:
{ 
  Constants: 

  CSIDL_DESKTOP 
  CSIDL_INTERNET 
  CSIDL_PROGRAMS 
  CSIDL_CONTROLS 
  CSIDL_PRINTERS 
  CSIDL_PERSONAL 
  CSIDL_FAVORITES 
  CSIDL_STARTUP 
  CSIDL_RECENT 
  CSIDL_SENDTO 
  CSIDL_BITBUCKET 
  CSIDL_STARTMENU 
  CSIDL_DESKTOPDIRECTORY 
  CSIDL_DRIVES 
  CSIDL_NETWORK 
  CSIDL_NETHOOD 
  CSIDL_FONTS 
  CSIDL_TEMPLATES 
  CSIDL_COMMON_STARTMENU 
  CSIDL_COMMON_PROGRAMS 
  CSIDL_COMMON_STARTUP 
  CSIDL_COMMON_DESKTOPDIRECTORY 
  CSIDL_APPDATA 
  CSIDL_PRINTHOOD 
  CSIDL_ALTSTARTUP 
  CSIDL_COMMON_ALTSTARTUP 
  CSIDL_COMMON_FAVORITES 
  CSIDL_INTERNET_CACHE 
  CSIDL_COOKIES 
  CSIDL_HISTORY 
} 

uses 
  ActiveX, ShlObj; 

procedure TForm1.Button1Click(Sender: TObject); 
  // Replace CSIDL_HISTORY with the constants above 
var 
  Allocator: IMalloc; 
  SpecialDir: PItemIdList; 
  FBuf: array[0..MAX_PATH] of Char; 
  PerDir: string; 
begin 
  if SHGetMalloc(Allocator) = NOERROR then 
  begin 
    SHGetSpecialFolderLocation(Form1.Handle, CSIDL_HISTORY, SpecialDir); 
    SHGetPathFromIDList(SpecialDir, @FBuf[0]); 
    Allocator.Free(SpecialDir); 
    ShowMessage(string(FBuf)); 
  end; 
end; 

// With Windows Me/2000, the SHGetSpecialFolderLocation function 
// is superseded by ShGetFolderLocation. 


// function to get the desktop folder location: 

function GetDeskTopPath : string; 
var 
  shellMalloc: IMalloc; 
  ppidl: PItemIdList; 
  PerDir: string; 
begin 
  ppidl := nil; 
  try 
    if SHGetMalloc(shellMalloc) = NOERROR then 
    begin 
      SHGetSpecialFolderLocation(Form1.Handle, CSIDL_DESKTOP, ppidl); 
      SetLength(Result, MAX_PATH); 
      if not SHGetPathFromIDList(ppidl, PChar(Result)) then 
        raise exception.create('SHGetPathFromIDList failed : invalid pidl'); 
      SetLength(Result, lStrLen(PChar(Result))); 
    end; 
  finally 
   if ppidl <> nil then 
         shellMalloc.free(ppidl); 
  end; 
end;
if (подумать) then все просто else учитесь учиться
lokiz вне форума Ответить с цитированием
Старый 15.01.2009, 15:15   #4
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Цитата:
Сообщение от rpy3uH Посмотреть сообщение
вот этот код получает все возможные системные пути и выводит в Memo.
Выводится номер пути и сам путь
Код:
uses shellapi,shlobj;

procedure TForm1.Button1Click(Sender: TObject);
var i:integer;
    str:array[0..999] of char;
begin
 for i:=0 to $40 do
  begin
   SHGetSpecialFolderPath(0,@str,CSIDL_DESKTOP+i,false);
   memo1.lines.Add(inttohex(CSIDL_DESKTOP+i,3)+'  '+str);
  end;
end;
в общем, пробуй.
Да, но дело вот в чем, мне нужны индефикаторы типа '::{000000-00..}'

Вот к примеру, пустые строки, т.к. физически таких путей нет
Цитата:
000 C:\Documents and Settings\Владимир\Рабочий стол
001
002 C:\Documents and Settings\Владимир\Главное меню\Программы
003
004
005 C:\Documents and Settings\Владимир\Мои документы
@lokiz: аналогично

Яркий пример, получить как я говорил индификатор CSIDL_BITBUCKET. У меня в системе, да думаю и у других, он равен '::{645FF040-5081-101B-9F08-00AA002F954E}' Вот как в таком виде получить я долгое время уже не могу понять
BOBAH13 вне форума Ответить с цитированием
Старый 15.01.2009, 18:30   #5
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Цитата:
индификатор CSIDL_BITBUCKET. У меня в системе, да думаю и у других, он равен '::{645FF040-5081-101B-9F08-00AA002F954E}'
Ну, не знаю... У меня в реестре нашелся единственный малюсенький кусочек из этой фразы - "CSIDL" без "_", и то в одном-единственном месте и относится к Remote Desktop Cache files.
Может, архив вот этой рассылки натолкнет?
http://subscribe.ru/catalog/comp.soft.win.wintipsb00ks

Последний раз редактировалось mihali4; 15.01.2009 в 18:35.
mihali4 вне форума Ответить с цитированием
Старый 15.01.2009, 20:36   #6
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Цитата:
Сообщение от BOBAH13 Посмотреть сообщение
Да, но дело вот в чем, мне нужны индефикаторы типа '::{000000-00..}'
Попробуйте так:

Код:
var pDesktop : ISHELLFOLDER;
    ppidl: PItemIdList;
    S:StrRet;
begin
   SHGetDesktopFolder(pDesktop);
   SHGetSpecialFolderLocation(0, CSIDL_BITBUCKET, ppidl);
   pDesktop.GetDisplayNameOf(ppidl, SHGDN_FORPARSING, S);
   writeln(S.pOleStr);
alexBlack вне форума Ответить с цитированием
Старый 15.01.2009, 23:16   #7
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Цитата:
Сообщение от alexBlack Посмотреть сообщение
Попробуйте так:

Код:
var pDesktop : ISHELLFOLDER;
    ppidl: PItemIdList;
    S:StrRet;
begin
   SHGetDesktopFolder(pDesktop);
   SHGetSpecialFolderLocation(0, CSIDL_BITBUCKET, ppidl);
   pDesktop.GetDisplayNameOf(ppidl, SHGDN_FORPARSING, S);
   writeln(S.pOleStr);
Благодарю, то что надо. Очень давно искал решения, но время чтобы уделить и довести до ума не было Спасибо еще раз.
BOBAH13 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как получить имя нажимаемых системных клавиш(Delphi) The_Darkness Помощь студентам 2 18.07.2008 18:31
Поиск возможных путей графа RammFan Общие вопросы Delphi 2 19.06.2008 10:45
Перехват системных сервисов в ядре Irat Помощь студентам 1 11.02.2008 19:21
Перехват системных вызовов Windows Irat Помощь студентам 1 04.02.2008 16:30