Múltiples instancias al abrir múltiples documentos de Office

9

Comenzando con la versión 16.0.8625.2121de Office (probado con Word y Excel): cuando selecciona varios documentos en el Explorador y presiona Enter para abrirlos, terminará con instancias para el recuento de los documentos seleccionados anteriormente.

Para reproducir siga los siguientes pasos:

  • Cree 2 libros de trabajo de Excel vacíos en cualquier lugar de su máquina
  • Seleccione esos 2 archivos
  • Presione enter
  • Verifique Taskmanager y verá 2 instancias de Excel

En versiones anteriores de las 16.0.8625.2121que terminaría con solo 1 instancia.

Probado con

  • 16.0.4266.1003 - imagen bastante antigua que teníamos alrededor de la que actualizamos a versiones más nuevas con

    officec2rclient.exe /update user updatetoversion=16.0.xxxx.yyyy
    

Vuelva a probar paso a paso con esas nuevas compilaciones:

  • 16.0.8431.2094
  • 16.0.8431.2107
  • 16.0.8528.2139
  • 16.0.8528.2147

Antes de que se mencione lo obvio, DisableMergeInstanceno está establecido.

¿Es esa una nueva "característica" o un error? Creo que es un error.

¿Hay alguna forma de evitarlo?

Más información:

Probamos este comportamiento con (siempre la última versión)

  • Windows 7 + Office 2016: se produce un mal comportamiento
  • Windows 10 + Office 2016: se produce un mal comportamiento

También verifiqué la versión anterior de Office para asegurarme de que esta es una cosa de Office 2016

  • Windows 8 + Office 2013: no sucede
  • Windows 7 + Office 2010: no sucede
  • Windows 10 + Office 2010: no sucede
  • Windows 10 + Office 2013: no sucede
Rand Random
fuente

Respuestas:

6

Pido disculpas si reitero mis explicaciones en todo momento, pero considero que este problema es muy complejo, así que traté de asegurarme de que tiene sentido contextual para los lectores:

Si bien es posible que no se sepa si se trata de un error o si fue intencionado, podemos forzarlo a abrirse en la "misma" instancia utilizando el protocolo de intercambio dinámico de datos (DDE) creando un mensaje DDE en lugar del argumento duro "% 1 "apuntando al archivo para que se abra esa instancia al ejecutar el archivo. (Aunque, DDE se usa incluso con el argumento difícil).

El mensaje DDE, en este caso, se usa para indicarle al programa que abra un archivo. Por cada archivo ejecutado, en realidad crea una nueva instancia cada vez. Pero cuando se usa el protocolo DDE, primero examina si una instancia ya está creada y, de ser así, transmite el mensaje DDE a la primera instancia encontrada y sale, dando la ilusión de que todos los archivos se abren en una sola instancia, ya que es instantánea.

Especulaciones

El problema de los archivos que se abren en instancias múltiples probablemente tiene que ver con cuánto se ha cargado una sola instancia cuando se llama a otra instancia. La tendencia entre la diferencia de tiempo de ejecución de una primera y una segunda instancia es que a medida que aumenta el tiempo entre ejecuciones, tiende a producir una sola instancia y, a medida que disminuye, tiende a producir dos instancias. Esto sugiere que la primera instancia debe estar cargada o "lista" para abrir un nuevo archivo en esa misma instancia si se ejecuta otro archivo, y si no es así, abrirá el archivo consigo mismo.

Parece que cuando la ruta del archivo se usa como argumento para el programa, parece seguir esta tendencia solo por:

  • Word 2016
  • Excel 2016

Cuando se usa como argumento para crear instancias más allá de la primera instancia si la primera está lista (o si los que no son primeros ven que está lista), la primera instancia parece ser capaz de transmitir el argumento como un mensaje DDE a la primera.

Sin embargo, si ejecutamos el programa y usamos un mensaje DDE para abrir el archivo, parece seguir el protocolo DDE de inmediato, ya sea que la primera instancia esté o no lista para aceptar el mensaje DDE mediante un argumento. Si la primera instancia está o no lista probablemente dependerá si la persona que no es la primera ve la primera instancia como lista, y si no lo hace, no enviará el mensaje DDE a la primera, lo que parece ocurrir solo cuando se abre mediante un argumento . La especulación de que el no-primero ve al primero como no "listo" o "inexistente" es sugerido por el hecho de que los mensajes DDE (de los no primeros) son aceptados por el primero cuando: el no primero no se ejecuta a través de una concatenación de argumento "% 1"; y se le dice que se abra a través de un mensaje DDE.

Como tal, mi especulación es: el código para estas aplicaciones usa algún método oscuro para determinar si otra instancia está "lista" y, de ser así, usaría el protocolo DDE cuando se usa un argumento. Esto parece utilizar un método diferente que solo cuando recibe el protocolo DDE para determinar si se debe enviar a otra instancia. En efecto, parecería que el pseudocódigo era:

if(argrument.wasUsed()){
    // Office's obscure condition
    if(Office.thinksInstanceIsReady(anotherInstance)){
        // Use DDE Protocol
        if(anotherInstance.exists()){ // already knew that
            sendDDEmessage(anotherInstance);
            exitThisInstance();
        }
    } else {
        selfFollowDDEmessage(); // Leave open this instance
    }
if(givenDDEMessage()){
    // Use DDE Protocol
    if(anotherInstance.exists()){
        sendDDEmessage(anotherInstance);
        exitThisInstance();
    } else {
        selfFollowDDEmessage();
    }
}

No hay forma de saber si se trata de un error o si se pretendía que fuera oscuro por alguna razón, sin que los programadores nos informaran.

La resolución

Queremos ajustar la ejecución de ciertas extensiones de archivo para que ya no envíen la ruta del archivo ("% 1") del archivo que se está ejecutando como argumento, sino que le digamos al programa que se ejecuta que cumpla con el contenido del mensaje DDE, del cual contiene una solicitud para abrir un archivo, que lo retransmitirá a una instancia ya existente si existe y si no lo usa en sí. Lo cual, especulativamente, pasará por alto los requisitos oscuros de estas aplicaciones para que otra instancia se vea como "lista" si se usa un argumento para la ruta del archivo.

Estas son todas las extensiones de archivo correlacionadas con las claves de Clase que se sustituirán con x:

Para la palabra

FILEEXT          CLASS NAME (x)
 .doc*           Word.Document.8
 .docm†    Word.DocumentMacroEnabled.12
 .docx*         Word.Document.12
 .dot            Word.Template.8
 .dotm†    Word.TemplateMacroEnabled.12
 .dotx†         Word.Template.12
 .odt        Word.OpenDocumentText.12
 .rtf†             Word.RTF.8
 .wbk             Word.Backup.8
 .wiz             Word.Wizard.8
 .wll             Word.Addin.8

Para Excel

FILEEXT             CLASS NAME (x)
 .csv*                Excel.CSV
 .ods       Excel.OpenDocumentSpreadsheet.12
 .slk                 Excel.SLK
 .xla                Excel.Addin
 .xlam†        Excel.AddInMacroEnabled
 .xld                Excel.Dialog
 .xlk                Excel.Backup
 .xll                 Excel.XLL
 .xlm              Excel.Macrosheet
 .xls*              Excel.Sheet.8
 .xlsb†     Excel.SheetBinaryMacroEnabled.12
 .xlshtml           Excelhtmlfile
 .xlsm†       Excel.SheetMacroEnabled.12
 .xlsx*             Excel.Sheet.12
 .xlt†             Excel.Template.8
 .xlthtml          Excelhtmltemplate
 .xltm†        Excel.TemplateMacroEnabled
 .xltx†             Excel.Template
 .xlw               Excel.Workspace
 .xlxml               Excelxmlss

* Las extensiones de archivo más importantes / comunes que se deben hacer como mínimo. Subjetivo.

† Las extensiones de archivo secundarias más importantes / comunes que se deben realizar como mínimo. Subjetivo.

Estas listas se pueden replicar a través de la línea de comandos: assoc | findstr Wordreemplazar Wordcon el nombre abreviado oficial (distingue entre mayúsculas y minúsculas).

Todo lo cual tiene la opción de hacer si cree que es necesario. Si quiere hacer más, puede seguir los pasos opcionales que proporcionaré, lo que debería reducir el trabajo necesario.

Deberá seguir las siguientes instrucciones para cada clave de registro a continuación, reemplazando la xcon la (s) Clase (s) correspondiente (s) de su elección:

  • HKEY_CLASSES_ROOT\x\shell\Open
  • HKEY_CLASSES_ROOT\x\shell\OpenAsReadOnly

(Ex: HKEY_CLASSES_ROOT\Excel.Sheet.12\shell\Open)

Una vez más, la OpenAsReadOnlyclave es opcional, esto estará listo cuando el archivo se ejecute de modo que sea de solo lectura.

Una pequeña precaución: una copia de seguridad

Para recordar mejor cuáles eran los valores del registro antes de la modificación, puede hacer clic con el botón derecho en la rama clave HKEY_CLASSES_ROOTy, en el menú contextual, hacer clic en "Exportar" y guardar el archivo de registro en una ubicación. En caso de que Doc Brown diga "Necesitamos regresar", puede importar la clave de registro ejecutándola y siguiendo las instrucciones.

Alternativamente, también puede ejecutar esto para recordar cuáles fueron los commandvalores y los nombres de clase para corregir pequeños errores con:

assoc>>fileexts.txt que se puede filtrar usando type fileexts.txt | findstr Word

ftype>>classnames.txt que se puede filtrar usando type classnames.txt | findstr Word

Instrucciones

Estos se seguirán para cada valor clave enumerado anteriormente, como desee.

Ingrese a su editor de registro favorito o regeditvaya a la Clase que desea modificar.

Ingrese en la clave llamada command, haga clic con el botón derecho en el (Default)valor y haga clic en "Modificar" en el menú contextual.

Actualmente establecido debe ser lo que fue ejecutado por ftype | findstr Word

Cámbielo para eliminar los argumentos directos al final del valor, incluido el espacio, para convertirse en:

  • "C:\Program Files\Microsoft Office\Root\Office16\EXCEL.EXE"
    (Para Excel de 64 bits)
  • "C:\Program Files\Microsoft Office\Root\Office16\WINWORD.EXE"
    (Para Word de 64 bits)
  • "C:\Program Files (x86)\Microsoft Office\Root\Office16\WINWORD.EXE"
    (Para Word de 32 bits)
  • "C:\Program Files (x86)\Microsoft Office\Root\Office16\EXCEL.EXE"
    (Para Excel de 32 bits)

Ingrese la clave llamada ddeexec(si no existe, cree la clave) que estaría al lado de la commandclave, haga clic con el botón derecho en el (Default)valor y haga clic en "Modificar" en el menú contextual, y establezca el valor para que se convierta en:

  • [REM _DDE_Direct][FileOpen("%1")] - (Para Word)
  • [open("%1")] - (Para Excel)

Debajo, ddeexeccree una nueva clave llamada topic(si no existe), haga clic con el botón derecho en el (Default)valor y haga clic en "Modificar" en el menú contextual, y configure el valor para que se convierta system(si no existe ).

Después de las modificaciones, puede que tenga que actualizar shell32.dll ejecutando esto con un símbolo del sistema elevado o shell después de crear estos cambios en el registro:

regsvr32 /i shell32.dll

Esto se ha probado en Windows 10 Office 2016 versión 16.0.8625.2127

Atajo alternativo

También puede ir a la clave para extensiones de archivo (como HKEY_CLASSES_ROOT\.xlsx) y modificar el valor "(Predeterminado)" a una clase singular, este enfoque, si se sigue, puede apuntar múltiples extensiones de archivo al mismo valor de Clase (como Excel.Sheet.12) que usted solo tiene que modificar esa clase una vez con el mensaje DDE. Si hace esto, también debería renombrar todas las reiteraciones del nombre de la Clase dentro de esa rama del registro. Sin embargo, esta forma no se recomienda, ya que podría romperse fácilmente, y debería hacerse si tuviera que hacer todas las extensiones de archivo para ahorrar tiempo.

Notas al margen:

El /oargumento es un argumento para las URL, por lo que no es una gran preocupación perder esta funcionalidad, ya que rara vez se pasa. Sin embargo, si lo desea, puede intentar dejar esta parte del argumento activada al ajustar los (Default)valores.

Estoy considerando hacer de este un wiki comunitario, ya que es muy especulativo y también está inacabado (si Word y Excel no fueran los únicos). Por favor comente una opinión sobre esto.

El8dN8
fuente
1

Además de la excelente respuesta de @ El8tedN8te, comento que para Excel no es necesario modificar la ddeexecclave de registro.

Es suficiente establecer el valor del (Default)artículo en:

"C:\Program Files (x86)\Microsoft Office\Root\Office16\EXCEL.EXE" /dde "%1"

Esto, según mis pruebas, garantiza que solo se ejecute una instancia de Excel.

harrymc
fuente
En el mío, este método no funcionó en vano, no se ejecutó en una sola instancia. Traté bastante de demostrar que estaba equivocado. Reinicié, verifiqué dos veces que estaba usando el nombre de clase y la extensión correctos, volteé tus argumentos y eliminé "C2R" .exe. De hecho, hizo lo contrario, incluso si no se abrieron simultáneamente, el argumento adicional los hizo permanecer instancias separadas, lo cual se reconoce aquí: social.technet.microsoft.com/Forums/office/en-US/…
El8dN8
@ El8tedN8te: No sé cuál es la diferencia entre nuestras dos computadoras. Tal vez en el menú Archivo> Opciones> Avanzado, en General, opción "Ignorar otras aplicaciones que usan el intercambio dinámico de datos (DDE)". Su enlace confirma que /ddedebería forzar una sola instancia.
harrymc
No sé si fui desleal cuando leí ese enlace ... ja ... ja ... Sí, verifiqué esa configuración ... vale la pena investigar por qué el mío se comporta de manera diferente. Si mi PC está mal, mi especulación está mal. ¿Puedo preguntar, su versión de oficina?
El8dN8
@ El8tedN8te: Versión 16.0.8625.2121.
harrymc
En mi máquina tampoco funciona, al igual que @ El8tedN8te.
Rand Random
-1

En esta página se informa que " No hay una opción de compatibilidad MDI en Excel " .

"MDI" significa Interfaz de múltiples documentos , y ha sido reemplazado por SDI (Interfaz de un solo documento), por lo tanto, no hay ningún error. Esta es la forma en que Excel ahora funciona.

Lo que puede hacer es recorrer el libro de trabajo presionando Ctrl+TABy Ctrl+Shift+TABretroceder. Si lo desea, puede instalar aplicaciones que agreguen esta funcionalidad a todo el conjunto de aplicaciones de Office. Marque estas dos opciones:

Lamentablemente, no puedo probar estos softwares en este momento.

m2cit
fuente
Esto no responde la pregunta porque incluso el enlace que proporcionó dice que cuando abre dos hojas de cálculo de Excel una tras otra, "en la pestaña Procesos, desplácese hacia abajo hasta que vea Excel.exe. Tenga en cuenta que aunque abrió dos apariciones de Excel, el dos libros de trabajo están contenidos en la misma instancia única de Excel ". La forma en que el OP crea dos instancias (con el mismo método que el de Microsoft) contradice la afirmación de que "no hay una opción de compatibilidad MDI en Excel" porque aparecen múltiples interfaces de documento (instancias), no dentro de la misma instancia que se supone que debe estar.
El8dN8
Como señaló @ El8tedN8te, estoy hablando de 2 instancias (2 procesos) y no de 2 ventanas.
Rand Random
Me gustaría corregir mi comentario anterior, la cita proporcionada es realmente correcta. Así que ignore toda mi última oración ... de mi último comentario. Estaba siendo presuntuoso.
El8dN8
Está bien, @ El8tedN8te. Me preguntaba qué estaba mal en la cita
m2cit