.dat 拡張子のファイルは
システム上のウィンドウでクリックすると
秀丸で開くようになっています。
プログラムでは以下のコードを実行しています。
Ret := ShellExecute(Handle, 'OPEN', 'D:\test.dat', '', '', SW_SHOW);
ところが、これを実行しても、開くことができません。
SE_ERR_NOASSOC が返されます。
試しに .txt に変更すると NotePad で開きます。
システム上で関連付けされているものと、ShellExecute で動作する
関連付けとは違うものなのでしょうか?
もし、そうだとすれば、開くようにするにはどうすればよいのでしょうか?
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 が関連付けられたのなら
その環境のレジストリが独特なのかもしれない。
関連づけられたアプリが空白を含むパスのところ(\Program Files 以下など)にインストールされていると、
ShellExecute() は失敗します。
拡張子に関連付けされた実行ファイル名の取得
http://homepage2.nifty.com/Mr_XRAY/Delphi/plSamples/T_GetFullExePath.htm
で実行ファイルを取得してから、それを使って ShellExecute() するといいです。
>>うーむ さんどうもありがとうございます。
以下のようにしてみましたが、
エラーメッセージ「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' がなにか関係
しているのでしょうか?
このあたりの仕組みがよくわかりません。
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'で
開くようにするコードをどっかでみました。
以上。
単に、もともとの
ShellExecute( 0, 'open', PChar(FileName), nil, PChar(FilePath), SW_SHOW)
という形式を
ShellExecute( 0, nil, PChar(FileName), nil, nil, SW_SHOW)
に変えるだけじゃないでしょうか?
datがダブルクリックした場合にデフォルトでopenが選ばれるわけじゃない時には
後者の形式で動作させるのでいいと思います。
うーむ さん、えーと さん、forever さん、Fusa さん
思い通りの動作ができるようになりました。
みなさんどうも、ありがとうございました。
ツイート | ![]() |