MithrilWorks

[WinAPI] ファイルのプロパティを表示する

 ShellExecuteの第2引数に"properties"を指定しても、エラーが発生しプロパティを表示することができない。代わりにShellExecuteExを使用して、プロパティを表示させることができる。
function ShellExecute(hWnd: HWND;
                       Operation : PChar;
                       FileName  : PChar;
                       Parameters: PChar;
                       Directory : PChar;
                       ShowCmd   : Integer): HINST;
引数 説明
hWnd 親ウィンドウのハンドル。通常は"Handle"を指定。
Operation 行う操作。指定しない場合は"open"となる。
FileName 操作対象ファイル
Parameters 操作対象へのパラメータ。
FileNameが実行形式でない場合は指定しないでください。
Directory 作業ディレクトリ。指定しない場合はカレントディレクトリ。
ShowCmd 表示方法
・Operationに指定できる定数は以下のとおり
定数 説明
open ファイルを開きます。
実行形式でない場合は関連付けに従ってファイルを開きます。
edit ファイルをエディタで開きます。
explore フォルダをエクスプローラで開きます。
print ファイルを印刷します。
properties プロパティを表示します。
・ShowCmdに指定する主な値は以下のとおり
定数 説明
SW_SHOWNORMAL 通常サイズで開く。
SW_SHOWMAXIMIZED 最大化して開く。
SW_SW_SHOWMAXIMIZED 最小化して開く。
 戻り値はエラーコードである。32以下の値が返ってきた場合は、何らかのエラーが発生している。
詳しいエラーコードについてはMSDNを参照のこと。
 Operationには"properties"を指定できるものの、エラーコード31(関連付けエラー)が発生し正常に開くことができない。したがって、以下の関数を用いてプロパティを表示する。
function ShellExecuteEx(lpExecInfo: PShellExecuteInfoA): Boolean;
 引数として指定するTShellExecuteInfoA構造体(SHELLEXECUTEINFO構造体)は以下のとおりである。
TShellExecuteInfo(TShellExecuteInfoA)構造体
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
TShellExecuteInfoA = record
  cbSize: DWORD;
  fMask: ULONG;
  Wnd: HWND;
  lpVerb: PAnsiChar;
  lpFile: PAnsiChar;
  lpParameters: PAnsiChar;
  lpDirectory: PAnsiChar;
  nShow: Integer;
  hInstApp: HINST;

  lpIDList: Pointer;
  lpClass: PAnsiChar;
  hkeyClass: HKEY;
  dwHotKey: DWORD;
  hIcon: THandle;
  hProcess: THandle;
end;

TShellExecuteInfo = TShellExecuteInfoA;
 メンバの詳しい説明は省略する。ShellExecuteと同等の処理をするために必要な処理は以下のとおりである。以下のメンバはそれぞれShellExecuteの引数に相当する。
  • Wnd…hWndに相当
  • lpVerb…Operationに相当
  • lpFile…FileNameに相当
  • lpParameters…Parametersに相当
  • lpIDirectory…Directoryに相当
  • nShow…ShowCmdに相当
 それ以外の値については、下記例のように指定する。
プロパティ表示の例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
uses ShellAPI; //uses節に追加
//*-------------------------------------------*//
function TForm1.ShowProperty(const FileName: String): Boolean;
var
  sei :TShellExecuteInfo;
begin
  sei.cbSize := sizeof(sei);
  sei.fMask  := SEE_MASK_NOCLOSEPROCESS or
                SEE_MASK_INVOKEIDLIST or
                SEE_MASK_FLAG_NO_UI;
  sei.lpVerb := 'properties';
  sei.Wnd := Handle;
  sei.lpParameters := nil;
  sei.lpDirectory := nil;
  sei.lpIDList := nil;
  sei.lpFile := PChar(FileName);
  Result := ShellExecuteEx(@sei);
end;
 このようにすることで、プロパティを表示することができる。