2017-01-24 3 views
0

次のクライアントサーバーアプリケーションがあります。
サーバーが起動し、特定のポートをリッスンします。 多くのCorelDrawセッションが手動またはプログラムによって開始されます。各コア1セッション(クライアント)は、現在のプロセスIDを送信するサーバーに接続します。サーバーはすべての接続をlistViewに保持し、各接続に基づいてEndPointはメッセージを変更(送信および受信)できます。 このような特定のプロセスIDのCOMオブジェクトを使用したいと思います。 私が試した:プロセスIDまたはMainWindowHandleを持つ複数のインスタンスのCOMオブジェクト(Corel.Application)を見つけよう

using corel = Corel.Interop.VGCore; 

int processID = Convert.ToInt32(lstClients.SelectedItems[0].SubItems[4].Text);//process ID string 
Process corProc = Process.GetProcessById(processID); 
int hwnd = (int)Process.GetProcessById(corProc).MainWindowHandle 
this.Activate(); 
bool IsCom = corProc.GetType().IsCOMObject; // return false... 
corApp = (corel.Application)System.Runtime.InteropServices.Marshal.GetActiveObject("Corel.Application") // returns just the last session (not according to existing process ID 
//tried also: 
corApp = (corel.Application)System.Runtime.InteropServices.Marshal.GetObjectForIUnknown(corProc.Handle); // error... 
//tried: 
corApp = (corel.Application)Convert.ChangeType(corProc, typeof(corel.Application)); // error: 'Object must implement IConvertible.' 

は私にそのようCorel.Applicationオブジェクトを使用するoportunityを与えるコーレルCOMオブジェクトを取得する方法はありますか?

MessageBox.Show(corApp.Documents.Count.ToString()); 

ありがとうございます!

答えて

0

PIDからオブジェクトを取得する汎用メカニズムはありませんが、OLEサーバーの実装によっては、AccessibleObjectFromWindowを使用できる場合があります。 PowerPointをターゲットにした同様の例については、Launching Office Apps Programmaticallyを参照してください。

try using RotViewまた、アプリケーションが実行オブジェクトテーブルに登録されているかどうかを確認することもできます。例えば、Visual Studioは!VisualStudio.DTE.14.0:21604というモニカで登録します。ここで、14.0はバージョン、21604はプロセスIDです。

ROTView showing a VisualStudio entry with the process id

+0

Thnks!私はすでにあなたの最初の提案を試みましたが、それはあなたがガイドを知っているMicrosoft COMオブジェクトのためにうまくいきます:IID_IDispatch As String = "{00020400-0000-0000-C000-000000000046}"。私はcorelアプリケーションのためにそれを決定する方法を見つけることができませんでした。 2番目の提案については、私はRotViewを見つけることができませんでした...たぶんそれはガイドを見つけるために私を助ける... – FaneDuru

関連する問題