2017-01-24 5 views
0

J'ai une application Client Server en train de faire la suivante:
Le serveur démarre et écoute un port spécifique. De nombreuses sessions corelDraw démarrent manuellement ou par programme. Chaque session corel (client) se connecte au serveur en envoyant l'ID de processus en cours. Le serveur conserve toutes les connexions dans un listView et, en fonction de chaque connexion, EndPoint peut modifier (envoyer et recevoir) des messages. Maintenant, je voudrais utiliser l'objet COM d'un tel ID de processus spécifique. J'ai essayé:Rechercher un objet COM (Corel.Application) pour plusieurs instances ayant un ID de processus ou MainWindowHandle

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.' 

Y at-il un moyen d'obtenir l'objet COM corel pour me donner l'opportunité d'utiliser l'objet Corel.Application comme ça?

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

Merci d'avance!

Répondre

0

Il n'existe aucun mécanisme général pour obtenir un objet à partir d'un PID, mais en fonction de l'implémentation du serveur OLE, vous pouvez utiliser AccessibleObjectFromWindow. Voir Launching Office Apps Programmatically pour un exemple similaire ciblant PowerPoint.

Vous pouvez également try using RotView pour voir si l'application est enregistrée dans la table des objets en cours d'exécution. Visual Studio, par exemple, enregistre avec un surnom de !VisualStudio.DTE.14.0:21604 où 14.0 est la version et 21604 est l'ID de processus.

ROTView showing a VisualStudio entry with the process id

+0

Thnks! J'ai déjà essayé votre première suggestion, mais cela fonctionne bien pour les objets Microsoft COM où vous connaissez le guide: IID_IDispatch As String = "{00020400-0000-0000-C000-000000000046}". Je ne pouvais pas trouver un moyen de le déterminer pour l'application corel. Pour la deuxième suggestion, je n'ai pas pu trouver RotView ... Peut-être que cela m'aidera à trouver le guide ... – FaneDuru