喫茶XRAYトップページ

[スレッド全体
]

[3330] ShellExecuteExとCreateProcess関数返信 削除
2010/5/5 (水) 09:08:21 Mr.XRAY
みなさん,こんにちは.

もしかしたら気づいている方もいるかも知れませんが,ここしばらくやたらと
この2つの関数を使用したサンプルをUPしています.

これにはちょっと理由があります.
ShellExecuteExで起動したアプリのハンドル操作が必要な質問がDelphiの
コミュニティでたまにあります.
ヒントとなるレス発言はあるのですが,ネットを検索しても具体的なコードが
見当たりません.

そこで,少し意地になって作成しました.
IEとエクスプローラ関係のサンプルも,本来の目的よりもこのShellExecuteEx
とCreateProcessを中心に両方のコードを掲載しています([940][945]).
また,ハンドルを取得するといっても,どんな目的で使用するかにもよります.

例えば

http://mrxray.on.coocan.jp/Halbow/Notes/N002.html

では,メモ帳のEdit部分を操作対象にする場合と,メモ帳の表示位置サイズを
操作したい場合とでは違ってきます.

先ほど,サンプル集に[724_Adobe Acrobatオブジェクトの操作]をUPしました.
これをもって,この関連は一応〆としたいと思います.
そんな意地にならないで,CreateProcessでいいんじゃなかったの?
というのは...,確かにそれはそうなんですが... (^^;

ではでは.

[3352] Re:ShellExecuteExとCreateProcess関数返信 削除
2010/5/14 (金) 13:51:40 たてぐや
▼ Mr.XRAYさん、みなさん

 ShellExecuteはファイルの種類(拡張子)によって、設定された
アプリケーションで開いたり印刷したりできて便利に使っています。
 これとちょっと関係があるかと思い、便乗して質問です。
 ファイルの種類(拡張子)を見てアイコンを取得するにはどういう
ことえをしたらいいのでしょうか? 例えば、漠然とした例ではあり
ますが、Tlistviewにファイル名を追加するときにそのファイルに関連
するアイコンを表示する、といったことを考えています。

[3353] Re2:ShellExecuteExとCreateProcess関数返信 削除
2010/5/14 (金) 15:53:17 Mr.XRAY
▼ たてぐやさん

>  ファイルの種類(拡張子)を見てアイコンを取得するにはどういう

あっ,これ何か関数がありましたね.
ちょっと待ってください(こればっか)

>漠然とした例ではありますが、

喫茶店にはこういう会話がいいですねぇ.
ちょっと忘れてしまったとか.ヘルプのどこに書いてあるとか.


[3354] Re3:ShellExecuteExとCreateProcess関数返信 削除
2010/5/14 (金) 16:57:54 Mr.XRAY
EXE,DLL等は複数のアイコンを持っていますが,
一般のファイルということでしたら,以下のような関数があります.

//-----------------------------------------------------------------------------
//  指定ファイルのアイコンを表示
//  usesにShellAPIが必要
//-----------------------------------------------------------------------------
procedure TForm1.Button1Click(Sender: TObject);
var
  lpiIcon  : WORD;
  hico     : HIcon;
  FilePath : String;
begin
  //自分のアイコンを表示
  FilePath := ExtractFilePath(ParamStr(0)) + 'Project1.exe';

  lpiIcon :=0;
  //アイコンのハンドルを取得
  hIco := ExtractAssociatedIcon(hInstance, PChar(FilePath), lpiIcon);
  if hico <> 0 then begin
    DrawIcon(Canvas.Handle, 0, 0, hico);
  end;
  DestroyIcon(hico);
end;


//-----------------------------------------------------------------------------
//  指定ファイルのアイコンを表示
//  usesにShellAPIが必要
//-----------------------------------------------------------------------------
procedure TForm1.Button1Click(Sender: TObject);
var
  FileInfo : SHFILEINFO;
  AIcon    : TIcon;
  FilePath : String;
begin
  //自分のアイコンを表示
  FilePath := ExtractFilePath(ParamStr(0)) + 'Project1.exe';

  //ファイルに関連づいたアイコンの取得
  AIcon := TIcon.Create;
  try
    SHGetFileInfo(PChar(FilePath),
                  FILE_ATTRIBUTE_DIRECTORY,
                  FileInfo,
                  SizeOf(FileInfo),
                  SHGFI_ICON);
    AIcon.Handle:=FileInfo.hIcon;

    Image1.Picture.Assign(AIcon);
  finally
    FreeAndNil(AIcon);
  end;
end;

//-----------------------------------------------------------------------------
//  指定ファイルのアイコンを表示 小さいアイコン
//  usesにShellAPIが必要
//-----------------------------------------------------------------------------
procedure TForm1.Button2Click(Sender: TObject);
var
  FileInfo : SHFILEINFO;
  AIcon    : TIcon;
  FilePath : String;
begin
  //自分のアイコンを表示
  FilePath := ExtractFilePath(ParamStr(0)) + 'Project1.exe';

  //ファイルに関連づいたアイコンの取得
  AIcon := TIcon.Create;
  try
    SHGetFileInfo(PChar(FilePath),
                  FILE_ATTRIBUTE_DIRECTORY,
                  FileInfo,
                  SizeOf(FileInfo),
                  SHGFI_SMALLICON or SHGFI_ICON or SHGFI_SYSICONINDEX);
    AIcon.Handle:=FileInfo.hIcon;

    Image2.Picture.Assign(AIcon);
  finally
    FreeAndNil(AIcon);
  end;
end;


私がよく使用しているのは,後者のSHGetFileInfoです.
ListViewなどにファイルの一覧を表示する場合は,システムのイメージリストを使って

http://mrxray.on.coocan.jp/Delphi/plSamples/790_ListView.htm#05

のような感じのコードを書いています.


[3355] Re4:ShellExecuteExとCreateProcess関数返信 削除
2010/5/14 (金) 17:40:48 Mr.XRAY
> EXE,DLL等は複数のアイコンを持っていますが,

参考までに,EXEやDLLの複数のアイコンを取り出すには以下の関数が
あります.

ExtractIcon
http://msdn.microsoft.com/ja-jp/library/cc410841.aspx

ExtractIconEx
http://msdn.microsoft.com/ja-jp/library/cc410843.aspx


[▼次のスレッド]
INCM/CMT
Cyclamen v3.82