Più istanze all'apertura di più documenti di Office


9

A partire dalla versione 16.0.8625.2121di Office (testata con Word ed Excel): quando selezioni più documenti in Explorer e premi Invio per aprirli, finirai con le istanze al conteggio dei precedenti documenti selezionati.

Per riprodurre, procedere come segue:

  • Crea 2 cartelle di lavoro Excel vuote ovunque sul tuo computer
  • Seleziona quei 2 file
  • Premi Invio
  • Controlla Taskmanager e vedrai 2 istanze di Excel

Nelle versioni precedenti di quanto 16.0.8625.2121si finirebbe con 1 sola istanza.

Testato con

  • 16.0.4266.1003 - piuttosto vecchia immagine che avevamo in giro rispetto a quando abbiamo aggiornato alle versioni più recenti

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

Testato nuovamente passo dopo passo con queste nuove build:

  • 16.0.8431.2094
  • 16.0.8431.2107
  • 16.0.8528.2139
  • 16.0.8528.2147

Prima che l'ovvio venga menzionato, DisableMergeInstancenon viene impostato.

È una nuova "caratteristica" o un bug? Credo che sia un bug.

C'è un modo per aggirarlo?

Ulteriori informazioni:

Abbiamo testato questo comportamento con (sempre l'ultima versione)

  • Windows 7 + Office 2016: si verificano comportamenti errati
  • Windows 10 + Office 2016: si verificano comportamenti errati

Controlla anche la versione precedente di Office per assicurarti che si tratti di una cosa di Office 2016

  • Windows 8 + Office 2013 - non succede
  • Windows 7 + Office 2010 - non succede
  • Windows 10 + Office 2010 - non succede
  • Windows 10 + Office 2013 - non succede

Risposte:


6

Mi scuso se ribadisco le mie spiegazioni in tutto, ma trovo questo problema molto complesso, quindi ho cercato di garantire che abbia senso contestualmente ai lettori:

Anche se potrebbe non essere noto se si tratta di un bug o se era previsto, possiamo forzarlo ad aprirlo nella "stessa" istanza utilizzando il protocollo DDE (Dynamic Data Exchange) creando un messaggio DDE anziché l'argomento rigido "% 1 "che punta al file per quell'istanza da aprire durante l'esecuzione del file. (Anche se, DDE viene utilizzato anche con l'argomento difficile).

Il messaggio DDE, in questo caso, viene utilizzato per indicare al programma di aprire un file. Per ogni file eseguito crea effettivamente una nuova istanza ogni volta. Ma quando viene utilizzato il protocollo DDE, viene innanzitutto esaminato se un'istanza è già stata creata e, in tal caso, inoltra il messaggio DDE alla prima istanza trovata ed esce dando così l'illusione che tutti i file si aprano in una singola istanza in quanto istantanea.

speculazioni

Il problema dell'apertura dei file in istanze multiple ha probabilmente a che fare con quanto una singola istanza è già stata caricata quando viene chiamata un'altra istanza. La tendenza tra la differenza del tempo di esecuzione di una prima seconda istanza è quando il tempo tra le esecuzioni aumenta tende a produrre una singola istanza e mentre diminuisce tende a produrre due istanze. Ciò suggerisce che la prima istanza deve essere caricata o "pronta" per aprire un nuovo file nella stessa istanza se viene eseguito un altro file e, in caso contrario, aprirà il file con se stesso.

Sembra che quando il percorso del file viene utilizzato come argomento per il programma, sembra seguire questa tendenza solo per:

  • Parola 2016
  • Excel 2016

Se utilizzato come argomento per la creazione di istanze oltre la prima istanza se la prima è pronta (o se i primi non vedono che è pronta), la non prima istanza sembra essere in grado di trasmettere l'argomento come messaggio DDE alla prima.

Tuttavia, se eseguiamo il programma e utilizziamo un messaggio DDE per aprire il file, sembra seguire immediatamente il protocollo DDE se la prima istanza è pronta o meno ad accettare il messaggio DDE tramite argomento. Il fatto che la prima istanza sia pronta o meno dipende probabilmente dal fatto che il non primo veda la prima istanza come pronta e, in caso contrario, non invierà il messaggio DDE al primo, che sembra verificarsi solo quando si apre tramite argomento . La speculazione del non primo che vede il primo come non "pronto" o "inesistente" è suggerita dal fatto che i messaggi DDE (dai non primi) sono accettati dal primo quando: il non primo non viene eseguito tramite una concatenazione di argomenti "% 1"; e gli viene detto di aprirsi tramite un messaggio DDE.

In quanto tale la mia speculazione è: il codice per queste applicazioni usa un metodo oscuro per determinare se un'altra istanza è "pronta" e, in tal caso, userebbe il protocollo DDE quando viene usato un argomento. Questo sembra utilizzare un metodo diverso rispetto a quando riceve il protocollo DDE per determinare se inviarlo a un'altra istanza. Sembrerebbe in effetti che lo pseudocodice fosse:

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();
    }
}

Non c'è modo di dire se si tratta di un bug o se si intendeva che fosse oscuro per una ragione, senza che i programmatori ci informassero.

La risoluzione

Vogliamo regolare l'esecuzione di determinate estensioni di file per non inviare più il percorso del file ("% 1") del file in esecuzione come argomento, ma piuttosto dire al programma in esecuzione di eseguire il contenuto del messaggio DDE, di cui contiene una richiesta per aprire un file, che lo inoltrerà a un'istanza già esistente se esiste e se non lo utilizza da solo. Che speculativamente, ignorerà i requisiti oscuri di queste applicazioni affinché un'altra istanza sia vista come "pronta" se viene utilizzato un argomento per il percorso del file.

Queste sono tutte estensioni di file correlate alle chiavi di classe che devono essere sostituite con x:

Per parola

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

Per 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

* Le estensioni di file più importanti / comuni che dovrebbero essere eseguite come minimo. Soggettivo.

† Estensioni di file secondarie più importanti / comuni che dovrebbero essere eseguite come minimo. Soggettivo.

Questi elenchi possono essere replicati dalla riga di comando: assoc | findstr Wordsostituendo Wordcon il nome abbreviato ufficiale (con distinzione tra maiuscole e minuscole).

Tutto ciò che hai la possibilità di fare se lo ritieni necessario. Se più desideri fare, potresti voler seguire i passaggi opzionali che fornirò, che dovrebbero ridurre il lavoro necessario.

Dovrai seguire le seguenti istruzioni per ogni chiave di registro di seguito sostituendo la xcon le Classi corrispondenti di tua scelta:

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

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

Ancora una volta, la OpenAsReadOnlychiave è opzionale, questo sarà pronto quando il file verrà eseguito in modo tale da essere di sola lettura.

Una piccola precauzione: un backup

Per ricordare meglio quali erano i valori del registro prima della modifica, potresti voler fare clic con il pulsante destro del mouse sul ramo chiave HKEY_CLASSES_ROOTe nel menu contestuale fare clic su "Esporta" e salvare il file di registrazione in un percorso. Nel caso in cui Doc Brown affermi "Dobbiamo tornare indietro", puoi semplicemente importare la chiave di registro eseguendola e seguendo le istruzioni.

In alternativa, puoi anche eseguirlo in modo da ricordare quali commandvalori e nomi delle classi dovevano correggere piccoli errori con:

assoc>>fileexts.txt che può essere filtrato usando type fileexts.txt | findstr Word

ftype>>classnames.txt che può essere filtrato usando type classnames.txt | findstr Word

Istruzioni

Questi devono essere seguiti per ogni valore chiave sopra elencato, come desideri fare.

Accedi al tuo editor di registro preferito o regeditvai alla classe che desideri modificare.

Inserisci nella chiave chiamata command, fai clic con il pulsante destro del mouse sul (Default)valore e fai clic su "Modifica" nel menu contestuale.

Attualmente impostato dovrebbe essere quello che è stato eseguito da ftype | findstr Word

Modificalo per rimuovere gli argomenti diretti alla fine del valore, incluso lo spazio, per diventare:

  • "C:\Program Files\Microsoft Office\Root\Office16\EXCEL.EXE"
    (Per Excel 64 bit)
  • "C:\Program Files\Microsoft Office\Root\Office16\WINWORD.EXE"
    (Per Word 64 bit)
  • "C:\Program Files (x86)\Microsoft Office\Root\Office16\WINWORD.EXE"
    (Per Word a 32 bit)
  • "C:\Program Files (x86)\Microsoft Office\Root\Office16\EXCEL.EXE"
    (Per Excel a 32 bit)

Inserisci la chiave chiamata ddeexec(se non esiste, crea la chiave) che sarebbe accanto alla commandchiave, fai clic con il pulsante destro del mouse sul (Default)valore e fai clic su "Modifica" nel menu contestuale e imposta il valore in modo che diventi:

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

Sotto ddeexeccrea una nuova chiave chiamata topic(se non esiste), fai clic con il pulsante destro del mouse sul (Default)valore, quindi fai clic su "Modifica" nel menu contestuale e imposta il valore in modo che diventi system(se non già).

Dopo le modifiche potrebbe essere necessario aggiornare shell32.dll eseguendolo con un prompt dei comandi elevato o shell dopo aver creato queste modifiche al registro:

regsvr32 /i shell32.dll

Questo è stato testato su una versione di Windows 10 Office 2016 16.0.8625.2127

Scorciatoia alternativa

Puoi anche andare alla chiave per le estensioni di file (come HKEY_CLASSES_ROOT\.xlsx) e modificare il valore "(Predefinito)" in una singola classe, questo approccio, se seguito, può puntare più estensioni di file allo stesso valore di Classe (come Excel.Sheet.12) che devi modificare quella classe solo una volta con il messaggio DDE. Se lo fai, dovresti anche rinominare tutte le reiterazioni del nome della classe all'interno di quel ramo del registro. Tuttavia, questo modo non è raccomandato, in quanto potrebbe facilmente rompersi e dovrebbe essere fatto se si dovessero fare tutte le estensioni dei file per risparmiare tempo.

Note a margine:

L' /oargomento è un argomento per gli URL, quindi non è una grande preoccupazione nel perdere questa funzionalità poiché raramente viene passata. Tuttavia, se lo desideri, puoi provare a lasciare questa parte dell'argomento attiva quando modifichi i (Default)valori.

Sto pensando di rendere questo un wiki della comunità, poiché è molto speculativo e anche incompiuto (se Word ed Excel non fossero i soli). Si prega di commentare un'opinione su questo.


1

Oltre all'ottima risposta di @ El8tedN8te, osservo che per Excel non è necessario modificare la ddeexecchiave di registro.

È sufficiente impostare il valore (Default)dell'elemento su:

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

Questo dai miei test assicura che venga eseguita solo un'istanza di Excel.


Sul mio, questo metodo non ha funzionato senza successo, non è stato eseguito in una sola istanza. Ho cercato abbastanza duramente di dimostrare di sbagliarmi. Ho riavviato, ricontrollato che stavo usando il nome e l'estensione della Classe corretti, ho capovolto i tuoi argomenti e ho ucciso "C2R" .exe. In realtà ha fatto il contrario, anche se non sono stati aperti contemporaneamente, l'argomento aggiuntivo li ha fatti rimanere istanze separate, che è riconosciuto qui: social.technet.microsoft.com/Forums/office/en-US/…
El8dN8

@ El8tedN8te: non so quale sia la differenza tra i nostri due computer. Forse nel menu File> Opzioni> Avanzate, in Generale, opzione "Ignora altre applicazioni che utilizzano Dynamic Data Exchange (DDE)". Il tuo link conferma che /ddedovrebbe forzare una singola istanza.
harrymc,

Non so se ero delirante quando ho letto quel link ... ah ... ah ... Sì, ho controllato quell'impostazione ... vale la pena esaminare perché il mio si sta comportando in modo diverso. Se il mio PC è sbagliato, la mia speculazione è sbagliata. Posso chiederti la tua versione da ufficio?
El8dN8,

@ El8tedN8te: versione 16.0.8625.2121.
harrymc,

Anche sulla mia macchina non funziona, proprio come @ El8tedN8te.
Rand Random,

-1

In questa pagina viene riportato che " Non esiste alcuna opzione di compatibilità MDI in Excel " .

"MDI" sta per Multiple Document Interface ed è stato sostituito da SDI (Single Document Interface), quindi non ci sono bug. Questo è il modo in cui ora funziona Excel.

Quello che puoi fare è scorrere la cartella di lavoro premendo Ctrl+TABe Ctrl+Shift+TABscorrere indietro. Se lo desideri, puoi installare applicazioni che aggiungono questa funzionalità all'intera suite Office. Controlla queste due opzioni:

Sfortunatamente non posso testare questi software in questo momento.


Questo non risponde alla domanda perché anche il collegamento fornito dice quando si aprono due fogli di lavoro Excel uno dopo l'altro, "Nella scheda Processi scorrere verso il basso fino a visualizzare Excel.exe. Tenere presente che sebbene siano state aperte due occorrenze di Excel, il due cartelle di lavoro sono contenute nella stessa singola istanza di Excel. " Il modo in cui l'OP crea due istanze (con lo stesso metodo di Microsoft) contraddice l'affermazione secondo cui "non esiste alcuna opzione di compatibilità MDI in Excel" perché appaiono più interfacce (istanze) di documenti, non all'interno della stessa istanza che dovrebbe essere.
El8dN8,

Come ha sottolineato @ El8tedN8te, sto parlando di 2 istanze (2 processi) e non di 2 finestre.
Rand Random,

Vorrei correggere il mio commento precedente, la citazione fornita è effettivamente corretta. Quindi ignora tutta la mia ultima frase ... del mio ultimo commento. Ero presuntuoso.
El8dN8,

Va bene, @ El8tedN8te. Mi chiedevo cosa ci fosse di sbagliato nella citazione
m2cit,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.