Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 1 730

/ вопрос решён /

Доброго времени суток, уважаемые эксперты!
Com-интерфейсы IShellFolder и IBrowserFolder для чего они пременяются и где можно найти примеры их использования? Спасибо.

Евгений Eklmn Вопрос решён, но можно продолжить его обсуждение в мини-форуме

Вопрос задал: Евгений Eklmn (статус: Посетитель)
Вопрос отправлен: 26 июня 2008, 10:33
Состояние вопроса: решён, ответов: 2.

Ответ #1. Отвечает эксперт: Feniks

Здравствуйте, Трофимов Евгений!
Смотрите в Приложении вырезку из статьи.

Желаю удачи.

Приложение:
  1.  
  2.  
  3.  
  4.  
  5.  
  6.  
  7.  
  8.  
  9.  
  10.  
  11.  
  12.  
  13.  
  14.  
  15.  
  16.  
  17.  
  18.  
  19.  
  20.  
  21.  
  22.  
  23.  
  24.  
  25.  
  26.  
  27.  
  28.  
  29.  
  30.  
  31.  
  32.  
  33.  
  34.  
  35.  
  36.  
  37.  
  38.  
  39.  
  40.  
  41.  
  42.  
  43.  
  44.  
  45.  
  46.  
  47.  
  48.  
  49.  
  50.  
  51.  
  52.  
  53.  
  54.  
  55. (*
  56.  
  57.  
  58.  
  59. *)
  60.  
  61. program ShellD;
  62.  
  63. uses
  64. SysUtils, Windows, ActiveX, ShlObj;
  65.  
  66. var
  67. Malloc: IMalloc;
  68. Desktop: IShellFolder;
  69. pidlMyComputer: PItemIDList;
  70. pidlResult: PItemIDList;
  71. pidlInitialFolder: PItemIDList;
  72.  
  73. function BrowseCallbackProc( hWnd: HWND; uMsg: UINT; lParam: LPARAM;
  74.  
  75. // stdcall
  76. begin
  77. Result := 0;
  78. case uMsg of
  79. BFFM_INITIALIZED:
  80. begin
  81. PostMessage( hWnd, BFFM_SETSELECTION, 0, Integer(pidlInitialFolder) );
  82. PostMessage( hWnd, BFFM_SETSTATUSTEXT, 0,
  83.  
  84. end;
  85. end;
  86. end;
  87.  
  88. function GetProgramFilesDirByKeyStr(KeyStr: string): string;
  89. var
  90. dwKeySize: DWORD;
  91. Key: HKEY;
  92. dwType: DWORD;
  93. begin
  94. if
  95. RegOpenKeyEx( HKEY_LOCAL_MACHINE, PChar(KeyStr), 0, KEY_READ, Key ) = ERROR_SUCCESS
  96. then
  97. try
  98. RegQueryValueEx( Key, 'ProgramFilesDir', nil, @dwType, nil, @dwKeySize );
  99. if (dwType in [REG_SZ, REG_EXPAND_SZ]) and (dwKeySize > 0) then
  100. begin
  101. SetLength( Result, dwKeySize );
  102. RegQueryValueEx( Key, 'ProgramFilesDir', nil, @dwType, PByte(PChar(Result)),
  103. @dwKeySize );
  104. end
  105. else
  106. begin
  107. RegQueryValueEx( Key, 'ProgramFilesPath', nil, @dwType, nil, @dwKeySize );
  108. if (dwType in [REG_SZ, REG_EXPAND_SZ]) and (dwKeySize > 0) then
  109. begin
  110. SetLength( Result, dwKeySize );
  111. RegQueryValueEx( Key, 'ProgramFilesPath', nil, @dwType, PByte(PChar(Result)),
  112. @dwKeySize );
  113. end;
  114. end;
  115. finally
  116. RegCloseKey( Key );
  117. end;
  118. end;
  119.  
  120. // Here is old way to retrieve Program Files folder location,
  121. // Modern way is using of SHGetSpecialFolder (shfolder.dll) with
  122. // CSIDL_PROGRAM_FILES constant.
  123.  
  124. function GetProgramFilesDir: string;
  125. const
  126. DefaultProgramFilesDir = '%SystemDrive%Program Files';
  127. var
  128. FolderName: string;
  129. dwStrSize: DWORD;
  130. begin
  131. if Win32Platform = VER_PLATFORM_WIN32_NT then
  132. begin
  133. FolderName :=
  134. GetProgramFilesDirByKeyStr('SoftwareMicrosoftWindows NTCurrentVersion');
  135. end;
  136. if Length(FolderName) = 0 then
  137. begin
  138. FolderName :=
  139. GetProgramFilesDirByKeyStr('SoftwareMicrosoftWindowsCurrentVersion');
  140. end;
  141. if Length(FolderName) = 0 then FolderName := DefaultProgramFilesDir;
  142. dwStrSize := ExpandEnvironmentStrings( PChar(FolderName), nil, 0 );
  143. SetLength( Result, dwStrSize );
  144. ExpandEnvironmentStrings( PChar(FolderName), PChar(Result), dwStrSize );
  145. end;
  146.  
  147. var
  148. bi: TBrowseInfo;
  149. DisplayName: string;
  150. ProgramFilesDir: WideString;
  151. CharsDone: ULONG;
  152. dwAttributes: DWORD;
  153. Temp: string;
  154.  
  155. begin
  156. ProgramFilesDir := GetProgramFilesDir;
  157. // acquire shell's allocator
  158. if SUCCEEDED( SHGetMalloc( Malloc ) ) then
  159. try
  160. // acquire shell namespace root folder
  161. if SUCCEEDED( SHGetDesktopFolder( Desktop ) ) then
  162. try
  163. // acquire folder that will serve as root in dialog
  164. if SUCCEEDED( SHGetSpecialFolderLocation( 0, CSIDL_DRIVES, pidlMyComputer ) ) then
  165. try
  166. // acquire PIDL for folder that will be selected by default
  167. if
  168. SUCCEEDED(
  169. Desktop.ParseDisplayName( 0, nil, PWideChar(ProgramFilesDir), CharsDone,
  170. pidlInitialFolder, dwAttributes )
  171. )
  172. then
  173. try
  174. SetLength( DisplayName, MAX_PATH );
  175. FillChar( bi, sizeof(bi), 0 );
  176. bi.pidlRoot := pidlMyComputer; // roots from 'My Computer'
  177. bi.pszDisplayName := PChar( DisplayName );
  178.  
  179. bi.ulFlags := BIF_STATUSTEXT;
  180. bi.lpfn := BrowseCallbackProc;
  181. pidlResult := SHBrowseForFolder( bi );
  182. if Assigned(pidlResult) then
  183. try
  184. SetLength( Temp, MAX_PATH );
  185. if SHGetPathFromIDList( pidlResult, PChar(Temp) ) then
  186. begin
  187. DisplayName := Temp;
  188. end;
  189. DisplayName := Trim(DisplayName) + '.';
  190.  
  191. MB_OK or MB_ICONINFORMATION );
  192. finally
  193. Malloc.Free( pidlResult ); // release returned value
  194. end;
  195. finally
  196. Malloc.Free( pidlInitialFolder ); // release PIDL for folder that
  197. // was selected by default
  198. end;
  199. finally
  200. Malloc.Free( pidlMyComputer ); // release folder that was served as root in dialog
  201. end;
  202. finally
  203. Desktop := nil; // release shell namespace root folder
  204. end;
  205. finally
  206. Malloc := nil; // release shell's allocator
  207. end;
  208. end.


Ответ отправил: Feniks (статус: Бакалавр)
Время отправки: 26 июня 2008, 12:06
Оценка за ответ: 5

Ответ #2. Отвечает эксперт: Шичко Игорь

Здравствуйте, Трофимов Евгений!
Посмотрите здесь:
http://www.realcoding.net/article/view/446
Поисковик дает несколько ссылок.

Ответ отправил: Шичко Игорь (статус: 9-ый класс)
Время отправки: 26 июня 2008, 12:20
Оценка за ответ: 5


Мини-форум вопроса

Всего сообщений: 0.

31 января 2011, 19:31: Статус вопроса изменён на решённый (изменил модератор Ерёмин А.А.): Автоматическая обработка (2 и более ответов с оценкой 5)

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 12:00
Выполнено за 0.02 сек.