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:
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 Word
reemplazar Word
con 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 x
con 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 OpenAsReadOnly
clave 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_ROOT
y, 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 command
valores 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 regedit
vaya 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 command
clave, 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, ddeexec
cree 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 /o
argumento 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.