関連付けファイルを開くには?

解決


よっす  2006-04-26 21:31:13  No: 21195

.dat 拡張子のファイルは 
システム上のウィンドウでクリックすると
秀丸で開くようになっています。

プログラムでは以下のコードを実行しています。
Ret := ShellExecute(Handle, 'OPEN', 'D:\test.dat', '', '', SW_SHOW);
ところが、これを実行しても、開くことができません。
SE_ERR_NOASSOC が返されます。

試しに .txt に変更すると NotePad で開きます。
システム上で関連付けされているものと、ShellExecute で動作する
関連付けとは違うものなのでしょうか?

もし、そうだとすれば、開くようにするにはどうすればよいのでしょうか?


うーむ  2006-04-27 00:05:56  No: 21196

dat 関連付けて試してみたけど、再現しません。(ちゃんと起動する)

ためしに、ShellExecuteExでテストしてみるとか。

var
    si: TShellExecuteInfo;
begin
    ZeroMemory (@si, sizeof(TShellExecuteInfo));
    si.cbSize := sizeof(si);
    si.Wnd    := Handle;
    si.lpFile := 'c:\test.dat';
    si.lpVerb := 'open';
    si.nShow  := SW_SHOW;
    ShellExecuteEx (@si);

何かのアプリケーションやインストーラーで 
dat が関連付けられたのなら
その環境のレジストリが独特なのかもしれない。


えーと  2006-04-27 09:14:28  No: 21197

関連づけられたアプリが空白を含むパスのところ(\Program Files 以下など)にインストールされていると、
ShellExecute() は失敗します。

拡張子に関連付けされた実行ファイル名の取得 
http://homepage2.nifty.com/Mr_XRAY/Delphi/plSamples/T_GetFullExePath.htm

で実行ファイルを取得してから、それを使って ShellExecute() するといいです。


よっす  2006-04-27 19:41:50  No: 21198

>>うーむ さんどうもありがとうございます。

以下のようにしてみましたが、
エラーメッセージ「D:\Test.dat パラメータが間違っています。」が
でます。ShellExecteExでは関連付けされたファイルを開けるのでしょうか?

var
  lpInfo: TShellExecuteInfo;
begin
  with lpinfo do begin
    cbSize       := SizeOf(TShellExecuteInfo);
    fMask        := SEE_MASK_INVOKEIDLIST;
    wnd          := Self.Handle;
    lpVerb       := 'open';
    lpFile       := pchar('D:\Test.dat');
    lpParameters := '';
    lpDirectory  := '';
    nShow        := SW_SHOWNORMAL;
    hInstApp     := 0;
    lpIDList     := nil;
    lpClass      := nil;
    hkeyClass    := 0;
    dwHotKey     := 0;
    hIcon        := 0;
  end;
  ShellExecuteEx(@lpInfo);
end;

>>えーと  さんどうもありがとうございました。
最初「フォルダオプション」の「詳細設定」の「アクション」を
設定していなかったので全く動作しませんでしたが、
'open'を追加すると動作(パスの取得)するようになりました。
AssocQueryString の引数の4番目の 'open' がなにか関係
しているのでしょうか?
このあたりの仕組みがよくわかりません。


forever  2006-04-27 20:21:35  No: 21199

http://homepage2.nifty.com/Mr_XRAY/Delphi/plSamples/T_GetFullExePath.htm
に書いてあるとおり、
レジストリに 
HKEY_CLASSES_ROOT\Applications\Excel.exe\Shell\Open\command
のように
OpenとEdit がそれぞれ書いてあって
open しか書いてなければ edit は機能しない
ということでしょう。

前に書いたShellExecuteExでlpVerbをopenasにすると
アプリケーションの選択ダイアログが出るらしいんだけど(確認して無い)。

一度、'open'で開いて、SE_ERR_NOASSOC の場合に 'openas'で
開くようにするコードをどっかでみました。

以上。


Fusa  2006-04-28 07:57:25  No: 21200

単に、もともとの

ShellExecute( 0, 'open', PChar(FileName), nil, PChar(FilePath), SW_SHOW)

という形式を

ShellExecute( 0, nil, PChar(FileName), nil, nil, SW_SHOW)

に変えるだけじゃないでしょうか?

datがダブルクリックした場合にデフォルトでopenが選ばれるわけじゃない時には
後者の形式で動作させるのでいいと思います。


よっす  2006-04-28 21:08:00  No: 21201

うーむ さん、えーと さん、forever さん、Fusa さん

思い通りの動作ができるようになりました。
みなさんどうも、ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加