IEをCreateProcess で起動して終了までプログラムを停止状態にしたいのですが、
これまで、IEのインストール先は
C:\Program files\Internet Explorer 固定かと思っていたのですが、
PLUS!が入っているNT環境だとどうもインストール先が違うようで、
固定パスでは起動しませんでした。
IEがインストールされたパスがわかるといいのですが、
どうやって調べればよいのでしょうか。
htmlに関連付けられているアプリのパスを知りたいのでしたら、
FindExecutableを調べてみては如何でしょうか?
関連付けされているアプリのパスを取得出来ます。
レジストリを調べてはどうでしょうか。
これだと固定でもいけると思いますが。
ありがとうございます。
レジストリからだと、アドミニでログインしないと取得出来ないようだったので
FindExecutable を試してみました。
第一引数には実在のファイルを指定してやらないといけないようでした。
その都度ダミーのHTMLを作って消す、というやり方にしようかと思っています。
もしもダミーのHTMLを作らずに済ませる方法があれば教えてください。
> もしもダミーのHTMLを作らずに済ませる方法があれば教えてください。
ええと、ファイルじゃなくて URL でもいいんじゃないの。たとえば
とか。
レジストリなら、ReadOnlyにして読み込めばできるはず。
場所によりますが、HKEY_CURRENTUSERならば。
解決を押しているのにすいません。
もう少し教えてください。
APのインストールパス取得のために以下の関数を作成したのですが、
これがアドミニしか動きません。
どこに手を加え、リードオンリーにすればいいでしょうか。
─────────────────────────────
function IsInstall(ArGExeFileName: String): String;
const
{プログラムのインストール先フォルダ情報のレジ}
AppKey='SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\';
var
Reg : TRegistry;
RegDat: String;
begin
Result := '';
Reg := TRegistry.Create;
try
Reg.RootKey := HKEY_LOCAL_MACHINE;
if Reg.OpenKey(AppKey + ArGExeFileName, False) then
begin
try
RegDat := Reg.ReadString(''); //標準キー
if '' = RegDat then Result := ''
else Result := PFGetPath(RegDat); //インストール先フォルダ+EXE名
except
Result := '';
end;
end;
finally
Reg.Free;
end;
end;
─────────────────────────────
それと、FindExecutable は以下の関数にしたのですが
第一引数にURLを指定する使い方が間違っていればおしえてください。
因みにShellExecute にURLを渡すとIEが起動します。
─────────────────────────────
function GetIeFullPath():String;
var
DummyFile : string;
FileHandle: Integer;
AppName : array [0..MAX_PATH] of Char;
begin
result := '';
try
//DummyFile := 'dummy.html';
//FileHandle := FileCreate( DummyFile );
//FileClose(FileHandle);
DummyFile := 'http://www.google.co.jp/';
FindExecutable(PChar(DummyFile),
PChar(ExtractFilePath(Application.Exename)),
AppName);
finally
if true = FileExists( DummyFile ) then
DeleteFile( pchar( DummyFile ) );
result := AppName;
end;
end;
─────────────────────────────
レジストリの方ですが、
OpenKeyでなく、OpenKeyReadOnlyを使用します。
引数などについてはヘルプを参照してください。
> 第一引数にURLを指定する使い方が間違っていればおしえてください。
> 因みにShellExecute にURLを渡すとIEが起動します。
ShellExecute() と勘違いしておりました。申し訳ありません。
>IEをCreateProcess で起動して終了までプログラムを停止状態にしたいのですが、
これですが、FindExecutable() と CreateProcess() 、WaitForSingleObject() を
使ってうまくいってますか? わたしのところでは、メモ帳などでは成功しますが
IE でもネットスケープでも、URL を開くことはできますが、終了待ちができません
でした。ShellExecuteEx() を使ったコード例を示します。
uses
ShellAPI;
function ExecAndWaitQuit(FileOrURL:string):Boolean;
var
sei:TShellExecuteInfo;
begin
FillChar(sei,SizeOf(TShellExecuteInfo),#0);
sei.cbSize := SizeOf(TShellExecuteInfo);
sei.fMask := SEE_MASK_NOCLOSEPROCESS;
sei.Wnd := Form1.Handle;
sei.lpVerb := 'open';
sei.lpFile := PChar(FileOrURL);
sei.lpDirectory := PChar(ExtractFilePath(Application.Exename));
sei.nShow := SW_SHOWNORMAL;
result := ShellExecuteEx(@sei);
if result then begin
while WaitForSingleObject(sei.hProcess,100) = WAIT_TIMEOUT do
Application.ProcessMessages;
CloseHandle(sei.hProcess);
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
if ExecAndWaitQuit('C:\040414.txt') then
ShowMessage('Close Notepad'); // 終了待ちできた
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
if ExecAndWaitQuit('http://www.google.co.jp/') then
ShowMessage('Close IE'); // 終了待ちできなかった!
end;
環境: Window98SE Delphi5Up1
> URL を開くことはできますが、終了待ちができませんでした。
msdn の ShellExecuteEx() のところに書いてありました。既にいくつかの IE が
立ち上がっている場合は、あらたに指定の URL を開くことはできますが、プロセスは
同じなので、hProcess には設定されないようです。最初の一つの時は大丈夫そうですね。
みなさまありがとうございました。正直がいちばんです>私w。
> URL を開くことはできますが、終了待ちができませんでした。
私が参考にさせてもらったサイト
http://www.eva.hi-ho.ne.jp/taketani/delphi/system.shtml
ここのNo.0002の方法でやると、他のIEが事前に起動していても
終了まで待ってくれるようです。
これからもどうぞよろしく。
> 他のIEが事前に起動していても終了まで待ってくれるようです。
はい、こちらでも CreateProcess() を使った場合は問題ありません。
FindExecutable() には、バグがあるので、あまり使いたくない、で
なるべく簡単にということで ShellExecuteEx() を使ったんですけどね。
http://www.geocities.co.jp/Playtown-Spade/4058/code/memo/memo4.html
レジストリから取ってきて、CreateProcess() ってのが一番いいようですね。
ツイート | ![]() |