2009-04-20 8 views
11

私はC#で作業していますが、そのプロセスIDによってExcelの特定のインスタンスを取得する必要があります。私は別のアプリケーションから必要なインスタンスのプロセスIDを取得しますが、それ以外のことはわかりません。プロセスIDが与えられていると、実行中のインスタンスをどのように取得できるのか分かりません。プロセスIDを使用してExcelインスタンスまたはExcelインスタンスのCLSIDを取得する方法は?

私はウェブ上で多くのことを研究していますが、私は最初のものが返ってから使用できないMarshal.GetActiveObject(...)またはMarshal.BindToMoniker(...)最初のExcelインスタンスがROTに登録されていて、必要なものではなく、2番目のインスタンスでは、インスタンスを取得する前にExcelファイルを保存する必要があります。また

、私はどこのプロセスIDを使用して、私は必要なExcelのインスタンスのCLSIDを取得することができ、その後、私が呼び出すことができる可能性がある場合、最終的にIというExcelのインスタンスを返します

GetActiveObject(ref _guid, _ptr, out objApp);

必要。

+0

あなたは、私に をGetActiveObject方法あなたの迅速な答えを – Higune

答えて

12

プロセスIDを使用してプロセスを識別したら、Process.MainWindowHandleを取得してAccessibleObjectFromWindow APIとともに使用して、そのプロセスのExcelオブジェクトモデルにアクセスできます。

Andrew Whitechapelの記事Getting the Application Object in a Shimmed Automation Add-inは、このコードをサンプルコードとともに詳細に説明しています。

あなたのためにその記事のキーコードは、行で始まる:

あなたの場合に、よりようになります
int hwnd = (int)Process.GetCurrentProcess().MainWindowHandle 

「excelIdは、」プロセスID番号です
int excelId = 1234; // Change as appropriate! 
int hwnd = (int)Process.GetProcessById(excelId).MainWindowHandle 

あなたが探しているものさもなければ、コードは記事で与えられたものと本質的に同じであるべきです。 (彼のコードがアドインのために書かれているという事実を無視するなら、その部分はここでのニーズに影響を与えないので、無視してください)

プロセスIDを持っていなければ、 Process.GetProcessesByNameを使用すると、必要に応じて、オブジェクトモデルにアクセスできるように、各Excelインスタンスのコントロールとコントロールをそれぞれ列挙することができます。

希望この役立ちます、

マイク

+0

ありがとう、それはまさに私が探していたものでした。 – Vic

+0

問題はありません、ヴィック、それはあなたのためにうれしいです。これは簡単な問題ではなく、よく知られているわけではありませんが、Andrew Whitechapelの記事はそれを本当にうまくカバーしています。がんばろう! –

+1

記事がダウンしていますが、ここにはhttp://pastebin.com/F7gkrASTが見つかりました –

-3
using System.Diagnostics; 

    var eProcess = from p in Process.GetProcessesByName("EXCEL") 
        where p.Id == 3700 //whatever Id you have... 
        select p; 

    foreach (var process in eProcess) 
     process.Kill(); 

これは、プロセスIDが特定の値と等しい「EXCEL」という名前のすべてのプロセスを取得します。

+1

感謝を使用する方法のサンプルを投稿することができ、ここでの問題は、私は、プロセスを殺すために探していないよということです、私はそれにいくつかの情報を貼り付ける必要があるより具体的には、それを操作するためのExcelインスタンスを取得する必要があります。 – Vic

2

ROTエントリにはCLSIDタグが付けられていません。 ROTはRegisterからDWORDを返します。これはUnregisterの識別子として使用されます。 私はこれまでにこの問題に遭遇しました。私が解決した唯一の方法は、直接通信できる各Excelにいくつかの種類のアドインを読み込むことです。

関連する問題