親プロセスを終了させる方法

解決


swimmer  2010-10-12 11:16:31  No: 102593  IP: 192.*.*.*

お世話になります。EXCEL VBAの経験は多少ありますが、VBははじめてです。

●やりたいこと

あるフリーのインストールプログラムを使用して作成したEXCELアドインを
システムに導入しようとしています。
EXCELがすでに起動されているときはコピーができないのでインストール
を中止したいのです。
インストールプログラムは、そのオプションとしてコピーを実行
する前に指定したプログラム(プログラムAと仮称)を指定して実行できます。

●解決したい点
1.EXCELが起動しているか否かはどのように判別したらよいのでしょうか。
2.1で判別できた場合、プログラムA(子プログラム)からインストール
プログラム(親プログラム)をどのように終了させたらよいのでしょうか。

サンプルコードをいただければ非常に助かります。

よろしくお願いいたします。

編集 削除
ミッキー  2010-10-12 21:44:33  No: 102594  IP: 192.*.*.*

回答ではありません。あしからず。

> VBははじめてです。
VBのバージョンは何ですか?ここはVB2〜VB6まで
取り扱っている掲示板です。サービスパックも書いてください。

あと、PCのOSは何ですか?
OSによって、できること、できないことがありますので。


適宜、読点を使ってください。何を言いたいのか、わかりにくいです。

> サンプルコードをいただければ非常に助かります。

ご自身で、どこまでコードを書いたのですか?
それを提示してください。コードくれくれ君では成長しませんよ。


ヒント。
EXCELのプロセスIDを取得して、それをクローズさせれば
いいと思いますよ。

もしくは、起動しているEXCELが終了されるまで待つか。

編集 削除
swimmer  2010-10-13 16:22:57  No: 102595  IP: 192.*.*.*

ミッキーさん、返信ありがとうございます。
ご指摘ごもっともです。以下に追加情報を記述いたしましたので
よろしくお願いいたします。

>VBのバージョンは何ですか?ここはVB2〜VB6まで
>取り扱っている掲示板です。サービスパックも書いてください。
OS: Windows XPです。
VB6です。サービスパックはあっておりません。

>ご自身で、どこまでコードを書いたのですか?
1.のEXCELが起動しているか否かについては、その後、調べて下記のコード
を作成しうまく動作したことを確認しました。

Private Function Is_ExcelLoaded() As Boolean
'input: none
'return:
'  True ... Excelがロードされている
'  False ... されていない
Dim AppObj As Object
On Error Resume Next
Set AppObj = GetObject(, "Excel.Application")
If Err.Number = 0 Then Is_ExcelLoaded = True
On Error GoTo 0
End Function

ミッキーさん、

2の親プロセスを終了させる方法がどうしてもわかりません。
教えていただけますでしょうか。  
やり方としては”親プロセスIDを取得しそれを終了させる”ということ
なのでしょうが、その具体的なCallの仕方がわかりません。
WEBでもいろいろ調べたのですが、どうしてもわかりません。
ミッキーさんに是非教えていただきたくお願い申し上げます。

尚、質問はEXCELを終了させる方法ではなく、親タスクを終了させる
方法です。使用しているインストールプログラムはEXCELではありません。
子タスクが親タスクを終了させる方法を教えていただきたくお願いします。

よろしくお願いいたします。

編集 削除
魔界の仮面弁士  2010-10-13 18:35:55  No: 102596  IP: 192.*.*.*

強制終了で良いなら、Shell 関数等で "taskkill" コマンドを呼ぶという手法があります。
プロセスIDが不明なら、親プロセスのイメージ名を指定することもできます。


> やり方としては”親プロセスIDを取得しそれを終了させる”ということ
今起動しているプロセスの一覧で良ければ、下記のようにして列挙できます。

Dim o As Object
For Each o In GetObject("winmgmts:").InstancesOf("Win32_Process")
    Debug.Print o.Handle, o.Name; Tab(50); o.CommandLine
Next

また、上記ループ中で、
  If (oが対象プロセスか否か) Then
    o.Terminate
  End If
のように記述して、そのプロセスを終了させることもできます。

編集 削除
swimmer  2010-10-14 00:24:53  No: 102597  IP: 192.*.*.*

魔界の仮面弁士さん、
的確で明快な回答をありがとうございます。
わたしはEXCEL VBAでのプログラム作成の仕事がほとんどで、
プロセスIDとかを意識したコーディング経験がなく困っておりました。
本当に助かりました。これを機会にVBAからVAにも幅を広げてみたいと
思います。

本当にありがとうございました。

編集 削除