IEを起動したいのですが

解決


固まる  2004-04-20 19:29:51  No: 8447

IEをCreateProcess で起動して終了までプログラムを停止状態にしたいのですが、
これまで、IEのインストール先は 
C:\Program files\Internet Explorer 固定かと思っていたのですが、
PLUS!が入っているNT環境だとどうもインストール先が違うようで、
固定パスでは起動しませんでした。
IEがインストールされたパスがわかるといいのですが、
どうやって調べればよいのでしょうか。


初心者999  2004-04-20 21:34:21  No: 8448

htmlに関連付けられているアプリのパスを知りたいのでしたら、
FindExecutableを調べてみては如何でしょうか?
関連付けされているアプリのパスを取得出来ます。


LupinⅢ  URL  2004-04-20 21:38:12  No: 8449

レジストリを調べてはどうでしょうか。
これだと固定でもいけると思いますが。


固まる  2004-04-21 00:01:45  No: 8450

ありがとうございます。
レジストリからだと、アドミニでログインしないと取得出来ないようだったので
FindExecutable を試してみました。
第一引数には実在のファイルを指定してやらないといけないようでした。
その都度ダミーのHTMLを作って消す、というやり方にしようかと思っています。
もしもダミーのHTMLを作らずに済ませる方法があれば教えてください。


jok  2004-04-21 00:46:01  No: 8451

> もしもダミーのHTMLを作らずに済ませる方法があれば教えてください。

ええと、ファイルじゃなくて URL でもいいんじゃないの。たとえば

http://www.google.co.jp/

とか。


にしの  2004-04-21 00:48:27  No: 8452

レジストリなら、ReadOnlyにして読み込めばできるはず。
場所によりますが、HKEY_CURRENTUSERならば。


固まる  2004-04-21 20:13:20  No: 8453

解決を押しているのにすいません。
もう少し教えてください。

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;
─────────────────────────────


にしの  2004-04-21 22:07:00  No: 8454

レジストリの方ですが、
OpenKeyでなく、OpenKeyReadOnlyを使用します。
引数などについてはヘルプを参照してください。


jok  2004-04-21 22:55:48  No: 8455

> 第一引数に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


jok  2004-04-21 23:07:15  No: 8456

> URL を開くことはできますが、終了待ちができませんでした。

msdn の ShellExecuteEx() のところに書いてありました。既にいくつかの IE が
立ち上がっている場合は、あらたに指定の URL を開くことはできますが、プロセスは
同じなので、hProcess には設定されないようです。最初の一つの時は大丈夫そうですね。


固まる  2004-04-22 01:57:08  No: 8457

みなさまありがとうございました。正直がいちばんです>私w。

> URL を開くことはできますが、終了待ちができませんでした。
私が参考にさせてもらったサイト
http://www.eva.hi-ho.ne.jp/taketani/delphi/system.shtml
ここのNo.0002の方法でやると、他のIEが事前に起動していても
終了まで待ってくれるようです。
これからもどうぞよろしく。


jok  2004-04-22 03:38:50  No: 8458

> 他のIEが事前に起動していても終了まで待ってくれるようです。

はい、こちらでも CreateProcess() を使った場合は問題ありません。
FindExecutable() には、バグがあるので、あまり使いたくない、で
なるべく簡単にということで ShellExecuteEx() を使ったんですけどね。

http://www.geocities.co.jp/Playtown-Spade/4058/code/memo/memo4.html

レジストリから取ってきて、CreateProcess() ってのが一番いいようですね。


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

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






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