Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Свойства файлов, Нескольких файлов 
:(
    Опции темы
Antony41
  Дата 9.2.2009, 23:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 332
Регистрация: 27.12.2008

Репутация: нет
Всего: 1



Подскажите как можно показать свойства нескольких файлов

Вот процедура показа свойств одного файла
Код

procedure ShowPropertiesDialog(FName: string);
var
  SExInfo: TSHELLEXECUTEINFO;
  Error: LongInt;
begin
  ZeroMemory(Addr(SExInfo),SizeOf(SExInfo));
  SExInfo.cbSize := SizeOf(SExInfo);
  SExInfo.lpFile := PChar(FName);
  SExInfo.lpVerb := 'properties';
  SExInfo.fMask  := SEE_MASK_INVOKEIDLIST;
  ShellExecuteEx(Addr(SExInfo));
end;


А мне нужно узнать какой размер двух файлов вместе через ShellAPI возможно?

И еще один вопрос:
Почему вот этот код 

Код

procedure ShowPropertiesDialog(FName: string);
var
  SExInfo: TSHELLEXECUTEINFO;
  Error: LongInt;
begin
  ZeroMemory(Addr(SExInfo),SizeOf(SExInfo));
  SExInfo.cbSize := SizeOf(SExInfo);
  SExInfo.lpFile := PChar(FName);
  //SExInfo.lpVerb := 'properties';
  SExInfo.fMask  := SEE_MASK_INVOKEIDLIST;
  ShellExecuteEx(Addr(SExInfo));
end;


выполняет приложение FName Причём скорость запуска приложения быстрее чем через функцию
ShellExecute есть ли в этом какой нибудь минус
PM MAIL   Вверх
Данкинг
Дата 9.2.2009, 23:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: нет
Всего: 130



Цитата(Antony41 @  9.2.2009,  23:22 Найти цитируемый пост)
А мне нужно узнать какой размер двух файлов вместе через ShellAPI возможно?

А в чём проблема сложить две суммы?!


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
Antony41
Дата 9.2.2009, 23:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 332
Регистрация: 27.12.2008

Репутация: нет
Всего: 1



А код можно
PM MAIL   Вверх
Данкинг
Дата 10.2.2009, 00:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: нет
Всего: 130



Цитата(Antony41 @  9.2.2009,  23:51 Найти цитируемый пост)
А код можно 

Код чего, сложения двух переменных? smile 
ЗЫ: а код можно. smile 

Это сообщение отредактировал(а) Данкинг - 10.2.2009, 00:04


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
Antony41
Дата 10.2.2009, 00:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 332
Регистрация: 27.12.2008

Репутация: нет
Всего: 1



Цитата(Данкинг @  10.2.2009,  00:04 Найти цитируемый пост)
Код чего, сложения двух переменных?

Этот код выводит окно показа свойств файла как в explorer'е.

Так как же мне вывести окно свойств где показываются общие свойства двух или трёх файлов как в explorer'е?

И какие переменные мне сложить????
PM MAIL   Вверх
Rrader
  Дата 10.2.2009, 12:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Inspired =)
***


Профиль
Группа: Экс. модератор
Сообщений: 1535
Регистрация: 7.5.2005

Репутация: 29
Всего: 191



Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
  Dialogs, ShellAPI, ShlObj, ActiveX, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

function SHMultiFileProperties(pdtObj: IDataObject;
  dwFlags: DWORD): HRESULT; stdcall; external 'shell32.dll';

implementation

{$R *.dfm}

function ShowPropertiesDialog(const AFolder: String; Files: TStrings): HRESULT;
const
  IID_IDataObject: TGUID = (
    D1: $0000010E; D2: $0000; D3: $0000; D4: ($C0, $00, $00, $00,
    $00, $00, $00, $46));
var
  Data: IDataObject;
  FolderID, FileID: PItemIDList;
  Desktop: IShellFolder;
  Folder: IShellFolder2;
  PFolder, PFileName: PWideChar;
  Malloc: IMalloc;
  I: Integer;
  ItemList: array of PItemIDList;
begin
  Result := E_INVALIDARG;
  if not Assigned(Files) then
    Exit;
  if Succeeded(SHGetMalloc(Malloc)) then
  try
    if Succeeded(SHGetDesktopFolder(Desktop)) then
    try
      PFolder := StringToOleStr(AFolder);
      if Succeeded(Desktop.ParseDisplayName(0, nil, PFolder, PULONG(nil)^,
        FolderID, PULONG(nil)^)) then
      try
        if Succeeded(Desktop.BindToObject(FolderID, nil, IID_IShellFolder2,
          Folder)) then
        try
          SetLength(ItemList, Files.Count);
          for I := 0 to Files.Count - 1 do
          begin
            PFileName := StringToOleStr(Files[I]);
            if Succeeded(Folder.ParseDisplayName(0, nil, PFileName,
              PULONG(nil)^, FileID, PULONG(nil)^)) then
              ItemList[I] := FileID;
          end;
          if Succeeded(Folder.GetUIObjectOf(0, Files.Count, ItemList[0],
            IID_IDataObject, nil, Data)) then
          try
            Result := SHMultiFileProperties(Data, 0);
          finally
            Data := nil;
          end;
        finally
          for I := 0 to High(ItemList) do
            if Assigned(ItemList[I]) then
              Malloc.Free(ItemList[I]);
          Folder := nil;
        end;
      finally
        Malloc.Free(FolderID);
      end;
    finally
      Desktop := nil;
    end;
  finally
    Malloc := nil;
  end;
end; 

procedure TForm1.Button1Click(Sender: TObject);
var
  List: TStringList;
begin
  List := TStringList.Create;
  with List do
  try
    Sorted := True;
    Duplicates := dupIgnore;
    { Файлы }
    Append('explorer.exe');
    Append('win.ini');
    Append('regedit.exe');
    if Succeeded(ShowPropertiesDialog('C:\WINDOWS\', List)) then
      MessageBox(Handle, 'Success!', 'Information', MB_ICONINFORMATION);
  finally
    Free;
  end;
end;

end.

Насчет того, что ShellExecuteEx выполняется быстрее, чем ShellExecute, скажу вот что: теоретически это так, поскольку ShellExecute реализована через ShellExecuteEx, но на практике замедления не наблюдал (что логично). Минуса в этом никакого нет.

Это сообщение отредактировал(а) Rrader - 10.2.2009, 15:32


--------------------
Let's do this quickly!
Rest in peace, Vit!
PM MAIL Skype   Вверх
Antony41
Дата 10.2.2009, 20:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 332
Регистрация: 27.12.2008

Репутация: нет
Всего: 1



Спасибо Rrader!
PM MAIL   Вверх
viruseg
Дата 12.10.2009, 16:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 12.10.2009

Репутация: нет
Всего: нет



А как сделать тоже самое, но для файлов лежащих в разных директориях?
PM MAIL WWW   Вверх
Keeper89
Дата 12.10.2009, 17:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 14
Всего: 58



Добавлю еще 1 вариант:
Код

{ Copyright Kingron 2005 }
{ For Windows 2000 or Higher, Shell32.dll version 5.0 or later }

uses ActiveX, ShlObj, ComObj;

function SHMultiFileProperties(pDataObj: IDataObject; Flag: DWORD): HRESULT;
  stdcall; external 'shell32.dll';

function GetFileListDataObject(Files: TStrings): IDataObject;
type
  PArrayOfPItemIDList = ^TArrayOfPItemIDList;
  TArrayOfPItemIDList = array[0..0] of PItemIDList;
var
  Malloc: IMalloc;
  Root: IShellFolder;
  p: PArrayOfPItemIDList;
  chEaten, dwAttributes: ULONG;
  i, FileCount: Integer;
begin
  Result := nil;
  FileCount := Files.Count;
  if FileCount = 0 then Exit;

  OleCheck(SHGetMalloc(Malloc));
  OleCheck(SHGetDesktopFolder(Root));
  p := AllocMem(SizeOf(PItemIDList) * FileCount);
  try
    for i := 0 to FileCount - 1 do
      try
        if not (DirectoryExists(Files[i]) or FileExists(Files[i])) then Continue;
        OleCheck(Root.ParseDisplayName(GetActiveWindow,
          nil,
          PWideChar(WideString(Files[i])),
          chEaten,
          p^[i],
          dwAttributes));
      except
      end;
    OleCheck(Root.GetUIObjectOf(GetActiveWindow,
      FileCount,
      p^[0],
      IDataObject,
      nil,
      Pointer(Result)));
  finally
    for i := 0 to FileCount - 1 do
    begin
      if p^[i] <> nil then Malloc.Free(p^[i]);
    end;
    FreeMem(p);
  end;
end;

procedure ShowFileProperties(Files: TStrings; aWnd: HWND);
type
  PArrayOfPItemIDList = ^TArrayOfPItemIDList;
  TArrayOfPItemIDList = array[0..0] of PItemIDList;
var
  Data: IDataObject;
begin
  if Files.Count = 0 then Exit;
  Data := GetFileListDataObject(Files);
  SHMultiFileProperties(Data, 0);
end;


// Example:
// Beispiel:

procedure TForm1.Button1Click(Sender: TObject);
begin
  if OpenDialog1.Execute then
    Memo1.Lines.AddStrings(OpenDialog1.Files);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  ShowFileProperties(Memo1.Lines, 0);
end;

http://www.swissdelphicenter.ch/torry/showcode.php?id=2425

Это сообщение отредактировал(а) Keeper89 - 12.10.2009, 17:38


--------------------
PM MAIL WWW   Вверх
viruseg
Дата 12.10.2009, 22:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 12.10.2009

Репутация: нет
Всего: нет



Keeper89, твоя функция работает отлично, но только один раз, при повторном вызове подвисает всё приложение.
PM MAIL WWW   Вверх
viruseg
Дата 13.10.2009, 12:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 12.10.2009

Репутация: нет
Всего: нет



Поправляюсь: функция вызывает подвисание приложения под вистой, а под XP работает отлично.
PM MAIL WWW   Вверх
bems
Дата 13.10.2009, 17:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 21
Всего: 88



Keeper89, ты зачем исключения глотаешь?


--------------------
Обижено школьников: 8
PM MAIL   Вверх
Keeper89
Дата 13.10.2009, 22:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 14
Всего: 58



bems, невиноватая я, это все швейцарцы, я ж ссылку привел.


--------------------
PM MAIL WWW   Вверх
Antony41
Дата 28.10.2009, 23:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 332
Регистрация: 27.12.2008

Репутация: нет
Всего: 1



А я вот думал этим способом можно показать только св-ва файлов, содержащихся в одной папке...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.1127 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.