2010-09-21 9 views
5

Estoy creando una instancia de palabra (14) con interoperabilidad de una aplicación winforms C# .net4 para trabajar con un documento. Si algún documento de Word se abre más allá de mi aplicación, se usará la misma instancia de palabra y esto perturbará mi aplicación.Crear instancia de palabra exclusiva

Pregunta simple: ¿Hay alguna forma de configurar la instancia de mi palabra exclusiva para mi aplicación?

Gracias de antemano.

Btw: Encontré algunas cosas con exclusivo/word/office/isolated/block/instance pero no contestó de ninguna manera.

+1

Me gustaría ver una respuesta al respecto:> – naacal

+0

Al cambiar el comportamiento de Word, los usuarios * muy * se confundirán. ¿Que problema estas tratando de resolver? – egrunin

+0

Como describí, el usuario y la aplicación deberían obtener una instancia de palabra diferente. Pero si el usuario abre un documento (haga doble clic en docx) mientras la aplicación está trabajando en una instancia de palabra oculta, el documento de usuario se abrirá en esta instancia y bloqueará mis operaciones en esta instancia porque el documento activo cambia. – Gpx

Respuesta

6

Hay una especie de solución, pero no es bonita. El problema principal es que Word se registra en el ROT (Running Object Table) y otras aplicaciones pueden acceder fácilmente a la instancia de Word registrada en el ROT (esto es lo que hace la función GetObject de VB, por ejemplo).

Así, en su aplicación, usted básicamente tiene que hacer 2 cosas

  1. Trate de GetObject (es decir, consultar la ROT para una instancia en ejecución)
  2. Si usted consigue uno, usted sabe que tiene para crear una nueva instancia de Word para usar (CreateObject en VB, el proceso es diferente en otras lenguas).
  3. Si NO obtiene una, tiene que crear 2 nuevas instancias de Word. El primero se registrará automáticamente en el ROT, el segundo no. Usa la segunda instancia y bastante la primera instancia.

A pesar de que poner fin a esta primera instancia, no va a "retroactivamente" registro en la tabla ROT, y otras aplicaciones generalmente no se opondrá una referencia a él a utilizar, van a crear automáticamente una nueva instancia, que, dado que ya no se registra ninguna otra instancia en el ROT, se registrará.

Dicho esto, todavía es posible para otras aplicaciones para obtener en su instancia de Word, por lo que esta técnica no es a prueba de balas. ¿Cómo? Porque Word TAMBIÉN registra cada DOCUMENTO cargado en el ROT. Pero esa es una característica que rara vez se usa.

+0

esto fue muy útil! –

5

No, no hay forma de que bloquee una instancia de Word solo para usted.

Pero, basado en su comentario, es fácil evitar el problema - no use ActiveDocument. Puede moverse usando ActiveDocument llamando al documento algo específico y luego usando esa variable (ya sea que esté abriendo un documento existente o creando uno nuevo).

Por ejemplo:

Sub NewDoc() 
    Dim d As Document 
    Set d = Documents.Add(Visible:=False) 
End Sub 
Sub ExistingDoc() 
    Dim d As Document 
    Set d = Documents.Open(FileName:="C:\myexisting.doc") 
End Sub 

En ambos casos anteriores, usted sólo tiene que utilizar d en lugar de en la que solía usar ActiveDocument.

+0

Gracias Otaku, pero no es mi aplicación quien está abriendo el segundo documento. Estoy bien con mi manejo de palabras, pero un usuario fuera de mi aplicación está tratando de abrir un documento de Word y el sistema usará automáticamente mi instancia de invis. Así que quiero bloquear mi instancia solo para mí y el usuario debe obtener una nueva instancia. – Gpx

+0

@Gpx: ¿Entonces el segundo documento abierto por el usuario también se está abriendo invisible (es decir, no pueden ver su documento)? –

+0

No, el segundo documento abre mi instancia existente visible con el nuevo documento como documento activo. Entonces mi aplicación está tratando de interactuar con la instancia pero el documento equivocado. Así que intentaré detener mi instancia de palabra abriendo un nuevo documento o establecer una opción para abrir siempre los documentos en una segunda instancia. – Gpx

Cuestiones relacionadas