Cómo acceder a la instancia existente de Microsoft Word utilizando enlaces finales

Estoy desarrollando un código en c # donde interactuaré con Microsoft Word. Deseo poder tener la opción de volver a utilizar una instancia existente o como alternativa crear una nueva instancia.

Teniendo en cuenta que quiero hacer todo esto usando la VINCULACIÓN TEMPRANA … es seguro decir que he descubierto cómo hacer que las cosas funcionen al crear una nueva instancia … simplemente llamo a Activator.CreateInstance, etc.

El problema que tengo es cómo reutilizar una instancia existente, por ejemplo, Word ya está abierto y quiero usar esa instancia.

¿Hay un Activator.UseExistingInstance? ¿¿o algo similar??

¡Gracias!

Es posible que desee echar un vistazo a la función api AccessibleObjectFromWindow definida en Oleacc.dll. Andrew Whitechapel tiene algunos artículos sobre cómo usarlo. En base a sus artículos, escribí una respuesta a una pregunta muy similar (acerca de Excel, no de Word), que puede encontrar aquí:

¿Cómo utilizar el enlace tardío para obtener una instancia de Excel?

Allí encontrará un ejemplo de cómo conectarse a una instancia de Excel que ya se está ejecutando y, a continuación, automatizar esta instancia mediante el enlace tardío.

Actualizar:

Aquí hay una muestra corta adaptada a Word:

 using System; using System.Reflection; using System.Runtime.InteropServices; using System.Text; namespace WordLateBindingSample { [ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("00020400-0000-0000-C000-000000000046")] public interface IDispatch { } class Program { [DllImport("user32.dll", SetLastError = true)] static extern IntPtr FindWindow(string lpClassName, string lpWindowName); [DllImport("Oleacc.dll")] static extern int AccessibleObjectFromWindow(int hwnd, uint dwObjectID, byte[] riid, out IDispatch ptr); public delegate bool EnumChildCallback(int hwnd, ref int lParam); [DllImport("User32.dll")] public static extern bool EnumChildWindows(int hWndParent, EnumChildCallback lpEnumFunc, ref int lParam); [DllImport("User32.dll")] public static extern int GetClassName(int hWnd, StringBuilder lpClassName, int nMaxCount); public static bool EnumChildProc(int hwndChild, ref int lParam) { StringBuilder buf = new StringBuilder(128); GetClassName(hwndChild, buf, 128); if (buf.ToString() == "_WwG") { lParam = hwndChild; return false; } return true; } static void Main(string[] args) { // Use the window class name ("OpusApp") to retrieve a handle to Word's main window. // Alternatively you can get the window handle via the process id: // int hwnd = (int)Process.GetProcessById(wordPid).MainWindowHandle; // int hwnd = (int)FindWindow("OpusApp", null); if (hwnd != 0) { int hwndChild = 0; // Search the accessible child window (it has class name "_WwG") // as described in http://msdn.microsoft.com/en-us/library/dd317978%28VS.85%29.aspx // EnumChildCallback cb = new EnumChildCallback(EnumChildProc); EnumChildWindows(hwnd, cb, ref hwndChild); if (hwndChild != 0) { // We call AccessibleObjectFromWindow, passing the constant OBJID_NATIVEOM (defined in winuser.h) // and IID_IDispatch - we want an IDispatch pointer into the native object model. // const uint OBJID_NATIVEOM = 0xFFFFFFF0; Guid IID_IDispatch = new Guid("{00020400-0000-0000-C000-000000000046}"); IDispatch ptr; int hr = AccessibleObjectFromWindow(hwndChild, OBJID_NATIVEOM, IID_IDispatch.ToByteArray(), out ptr); if (hr >= 0) { object wordApp = ptr.GetType().InvokeMember("Application", BindingFlags.GetProperty, null, ptr, null); object version = wordApp.GetType().InvokeMember("Version", BindingFlags.GetField | BindingFlags.InvokeMethod | BindingFlags.GetProperty, null, wordApp, null); Console.WriteLine(string.Format("Word version is: {0}", version)); } } } } } } 

Está buscando Marshal.GetActiveObject.

 object word; try { word = System.Runtime.InteropServices.Marshal.GetActiveObject("Word.Application"); } catch (COMException) { Type type = Type.GetTypeFromProgID("Word.Application"); word = System.Activator.CreateInstance(type); } 
    Intereting Posts