Delphi Programming / Object Pascal
サイトのトップページへ リンクのページへ ロゴマーク
[掲載 2011年05月07日] [更新 2015年04月24日] ワード操作フォームEx
ワード操作フォームEx   参考コード類
ワードが起動中かを調査
動作確認等 Windows 7 U64(SP1) + Delphi XE Pro + Word 2010







ワードが起動中かを調査


次のコードのように、ワードのウインドウハンドルを取得して調べることができます。


リスト1
ワードがが起動されているかを、ウィンドウハンドルで調べる
procedure TForm1.Button1Click(Sender: TObject);
begin
  //ワードが起動中かをウィンドウハンドルの値で判定
  if FindWindow('OpusApp', nil) <> 0 then begin
    MessageBox(Handle, 'ワード起動中', '情報' , MB_ICONINFORMATION);
  end else begin
    MessageBox(Handle, 'ワードは起動していません', '情報' , MB_ICONINFORMATION);
  end;
end;


ワードが起動中かどうかは、GetActiveOleObject 関数でも調べることができます。
CreateOleObject の引数で指定する COM オブジェクトのインスタンスは、1 つだけしか生成できません。したがって、GetActiveOleObject は、どちらかと言えば、自アプリで CreateOleObject で生成したオブジェクトのインスタンスの存在を調べることに利用されます。
この関数は、管理者権限で実行すると検出に失敗して、ワードのインスタンスが生成されていないことになります。デバッグ中、つまり IDE から実行するということは管理者権限で実行していることになります。


リスト2
ワードのインスタンスが存在するかを、GetActiveOleObject で調べる
//=============================================================================
//  ワードが起動中かを調べる
//  ワードを一般ユーザで起動している場合、このプログラムを管理者権限で実行する
//  と検出に失敗する
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
var
  objWord : OleVariant;
  IsOpen  : Boolean;
begin
  try
    objWord := GetActiveOleObject('Word.Application');
    IsOpen  := True;
  except
    on E: EOleSysError do begin
      IsOpen := False;
    end;
  end;

  if IsOpen then begin
    MessageBox(Handle, 'ワードは起動しています。', '情報', MB_ICONINFORMATION);
  end else begin
    MessageBox(Handle, 'ワードは起動していません。', '情報', MB_ICONINFORMATION);
  end;
end;




RPC サーバーを利用できません - 起動中のプロセスを調べる


ワードを操作するアプリケーションが例外等で終了した場合、メモリ上にワードのプロセスが残ってしまうことがあります。その状態でワードの操作コードを実行すると「RPC サーバーを利用できません」等のエラーが発生し、処理が継続できなくなることがあります。
そのような場合は、メモリ上に生成されたままのワードのプロセスを終了させる必要があります。

ワード操作フォームEx に添付の WordKill.exe は、起動中のプロセスを調べて、ワードのプロセスを強制的に終了させるプログラムです。



図1
ワードのプロセスが起動中
  • イメージ名は WINWORD.EXE
  • *32 は 32 ビットのプロセス
図2
添付の WordKill.exe を実行
  • ワードのプロセスを強制終了