Mehrere Instanzen beim Öffnen mehrerer Office-Dokumente

9

Beginnend mit 16.0.8625.2121der Office- Version (getestet mit Word und Excel) - Wenn Sie im Explorer mehrere Dokumente auswählen und die Eingabetaste drücken, um sie zu öffnen, werden Instanzen mit der Anzahl der zuvor ausgewählten Dokumente angezeigt.

Führen Sie zum Reproduzieren die folgenden Schritte aus:

  • Erstellen Sie 2 leere Excel-Arbeitsmappen an einer beliebigen Stelle auf Ihrem Computer
  • Wählen Sie diese 2 Dateien aus
  • Drücke Enter
  • Überprüfen Sie den Taskmanager und Sie sehen 2 Instanzen von Excel

In früheren Versionen haben 16.0.8625.2121Sie am Ende nur eine Instanz.

Getestet mit

  • 16.0.4266.1003 - ziemlich altes Bild, das wir hatten, als wir auf neuere Versionen mit aktualisiert haben

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

Schritt für Schritt mit diesen neuen Builds erneut getestet:

  • 16.0.8431.2094
  • 16.0.8431.2107
  • 16.0.8528.2139
  • 16.0.8528.2147

Bevor das Offensichtliche erwähnt wird, wird es DisableMergeInstancenicht gesetzt.

Ist das eine neue "Funktion" oder ein Fehler? Ich glaube, es ist ein Fehler.

Gibt es einen Weg, um das zu umgehen?

Weitere Informationen:

Wir haben dieses Verhalten mit (immer neueste Version) getestet.

  • Windows 7 + Office 2016 - Fehlverhalten tritt auf
  • Windows 10 + Office 2016 - Fehlverhalten tritt auf

Überprüfen Sie auch die ältere Office-Version, um sicherzustellen, dass es sich um eine Office 2016-Sache handelt

  • Windows 8 + Office 2013 - passiert nicht
  • Windows 7 + Office 2010 - passiert nicht
  • Windows 10 + Office 2010 - passiert nicht
  • Windows 10 + Office 2013 - passiert nicht
Rand Random
quelle

Antworten:

6

Ich entschuldige mich, wenn ich meine Erklärungen durchgehend wiederhole, aber ich finde dieses Problem sehr komplex und habe versucht, sicherzustellen, dass es für die Leser kontextuell sinnvoll ist:

Obwohl möglicherweise nicht bekannt ist, ob dies ein Fehler ist oder beabsichtigt war, können wir erzwingen, dass er in derselben Instanz geöffnet wird, indem das DDE (Dynamic Data Exchange Protocol) verwendet wird, indem anstelle des harten Arguments "%" eine DDE-Nachricht erstellt wird 1 "zeigt auf die Datei, die diese Instanz beim Ausführen der Datei öffnen soll. (Obwohl DDE auch mit dem harten Argument verwendet wird).

In diesem Fall wird die DDE-Nachricht verwendet, um das Programm anzuweisen, eine Datei zu öffnen. Für jede ausgeführte Datei wird jedes Mal eine neue Instanz erstellt. Wenn das DDE-Protokoll verwendet wird, wird zunächst geprüft, ob eine Instanz bereits erstellt wurde. In diesem Fall wird die DDE-Nachricht an die zuerst gefundene Instanz weitergeleitet und beendet, wodurch die Illusion entsteht, dass alle Dateien in einer einzelnen Instanz geöffnet werden, da sie sofort vorliegen.

Spekulationen

Das Problem, dass die Dateien in mehreren Instanzen geöffnet werden, hängt wahrscheinlich damit zusammen, wie viel eine einzelne Instanz bereits geladen hat, wenn eine andere Instanz aufgerufen wird. Der Trend zwischen der Ausführungszeitdifferenz einer ersten und einer zweiten Instanz besteht darin, dass mit zunehmender Zeit zwischen den Ausführungen tendenziell eine einzelne Instanz und mit abnehmender Zeit zwei Instanzen erzielt werden. Dies legt nahe, dass die erste Instanz geladen oder "bereit" sein muss, um eine neue Datei in derselben Instanz zu öffnen, wenn eine andere Datei ausgeführt wird, und wenn dies nicht der Fall ist, muss die Datei mit sich selbst geöffnet werden.

Wenn der Dateipfad als Argument für das Programm verwendet wird, scheint er diesem Trend nur zu folgen:

  • Word 2016
  • Excel 2016

Bei Verwendung als Argument zum Erstellen von Instanzen über die erste Instanz hinaus, wenn die erste bereit ist (oder wenn Nicht-Erste sehen, dass dies bereit ist), scheint die Nicht-Erste-Instanz in der Lage zu sein, das Argument als DDE-Nachricht an die erste weiterzuleiten.

Wenn wir jedoch das Programm ausführen und eine DDE-Nachricht zum Öffnen der Datei verwenden, scheint es dem DDE-Protokoll sofort zu folgen, ob die erste Instanz bereit ist, die DDE-Nachricht über ein Argument zu akzeptieren oder nicht. Ob die erste Instanz wahrscheinlich bereit ist oder nicht, hängt davon ab, ob der Nicht-Erste die erste Instanz als bereit ansieht, und wenn dies nicht der Fall ist, wird die DDE-Nachricht nicht an die erste gesendet, was anscheinend nur auftritt, wenn sie über ein Argument geöffnet wird . Die Spekulation, dass der Nicht-Erste den Ersten als nicht "bereit" oder "nicht existent" ansieht, wird durch die Tatsache nahegelegt, dass DDE-Nachrichten (von Nicht-Ersten) vom Ersten akzeptiert werden, wenn: der Nicht-Erste nicht über ausgeführt wird eine Argumentverkettung "% 1"; und es wird angewiesen, über eine DDE-Nachricht zu öffnen.

Als solches ist meine Spekulation: Der Code für diese Anwendungen verwendet eine obskure Methode, um zu bestimmen, ob eine andere Instanz "bereit" ist, und wenn ja, würde er das DDE-Protokoll verwenden, wenn ein Argument verwendet wird. Dies scheint eine andere Methode zu verwenden als nur, wenn das DDE-Protokoll empfangen wird, um zu bestimmen, ob es an eine andere Instanz gesendet werden soll. Es scheint tatsächlich, dass der Pseudocode war:

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

Es gibt keine Möglichkeit zu sagen, ob dies ein Fehler ist oder aus einem bestimmten Grund dunkel sein sollte, ohne dass die Programmierer uns darüber informieren.

Die Auflösung

Wir möchten die Ausführung bestimmter Dateierweiterungen so anpassen, dass der Dateipfad ("% 1") der ausgeführten Datei nicht mehr als Argument gesendet wird, sondern das ausgeführte Programm angewiesen wird, den Inhalt der DDE-Nachricht auszuführen enthält eine Anforderung zum Öffnen einer Datei, die sie an eine bereits vorhandene Instanz weiterleitet, falls vorhanden, und wenn sie nicht selbst verwendet wird. Was spekulativ die obskuren Anforderungen dieser Anwendungen umgeht, damit eine andere Instanz als "bereit" angesehen wird, wenn ein Argument für den Dateipfad verwendet wird.

Dies sind alles Dateierweiterungen, die mit Klassenschlüsseln korreliert sind und durch Folgendes ersetzt werden sollen x:

Für Word

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

Für 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

* Die wichtigsten / häufigsten Dateierweiterungen, die mindestens durchgeführt werden sollten. Subjektiv.

† Sekundär wichtigste / häufigste Dateierweiterungen, die mindestens durchgeführt werden sollten. Subjektiv.

Diese Listen können über die Befehlszeile repliziert werden: assoc | findstr WordErsetzen Worddurch den offiziellen verkürzten Namen (Groß- und Kleinschreibung beachten).

All dies haben Sie die Möglichkeit zu tun, wenn Sie dies für notwendig halten. Wenn Sie mehr tun möchten, möchten Sie möglicherweise die optionalen Schritte befolgen, die ich bereitstellen werde, um den Arbeitsaufwand zu verringern.

Sie müssen die folgenden Anweisungen für jeden Registrierungsschlüssel befolgen, indem Sie den xdurch die entsprechenden Klassen Ihrer Wahl ersetzen :

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

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

Auch hier ist der OpenAsReadOnlySchlüssel optional. Dieser ist bereit, wenn die Datei so ausgeführt wird, dass sie schreibgeschützt ist.

Eine kleine Vorsichtsmaßnahme - ein Backup

Um sich am besten an die Registrierungswerte vor der Änderung zu erinnern, klicken Sie mit der rechten Maustaste auf den Schlüsselzweig HKEY_CLASSES_ROOT, klicken Sie im Kontextmenü auf "Exportieren" und speichern Sie die Registrierungsdatei an einem Speicherort. Falls Doc Brown sagt "Wir müssen zurück", können Sie den Registrierungsschlüssel einfach importieren, indem Sie ihn ausführen und den Anweisungen folgen.

Alternativ können Sie dies auch ausführen, damit Sie sich daran erinnern, mit welchen commandWerten und Klassennamen kleine Fehler behoben wurden:

assoc>>fileexts.txt die mit gefiltert werden kann type fileexts.txt | findstr Word

ftype>>classnames.txt die mit gefiltert werden kann type classnames.txt | findstr Word

Anleitung

Diese müssen für jeden oben aufgeführten Schlüsselwert befolgt werden, wie Sie es wünschen.

Rufen Sie Ihren bevorzugten Registrierungseditor auf oder regeditgehen Sie zu der Klasse, die Sie ändern möchten.

Geben Sie den Schlüssel ein command, klicken Sie mit der rechten Maustaste auf den (Default)Wert und klicken Sie im Kontextmenü auf "Ändern".

Derzeit sollte festgelegt werden, was von ausgeführt wurde ftype | findstr Word

Ändern Sie es, um die direkten Argumente am Ende des Werts, einschließlich des Leerzeichens, zu entfernen und zu werden:

  • "C:\Program Files\Microsoft Office\Root\Office16\EXCEL.EXE"
    (Für Excel 64-Bit)
  • "C:\Program Files\Microsoft Office\Root\Office16\WINWORD.EXE"
    (Für Word 64-Bit)
  • "C:\Program Files (x86)\Microsoft Office\Root\Office16\WINWORD.EXE"
    (Für Word 32-Bit)
  • "C:\Program Files (x86)\Microsoft Office\Root\Office16\EXCEL.EXE"
    (Für Excel 32-Bit)

Geben Sie den Schlüssel mit dem Namen ddeexec(falls er nicht vorhanden ist, erstellen Sie den Schlüssel) ein, der sich neben dem commandSchlüssel befindet. Klicken Sie mit der rechten Maustaste auf den (Default)Wert, klicken Sie im Kontextmenü auf "Ändern" und legen Sie den folgenden Wert fest:

  • [REM _DDE_Direct][FileOpen("%1")] - (Für Word)
  • [open("%1")] - (Für Excel)

ddeexecErstellen Sie darunter einen neuen Schlüssel mit dem Namen topic(falls nicht vorhanden), klicken Sie mit der rechten Maustaste auf den (Default)Wert, klicken Sie im Kontextmenü auf "Ändern" und legen Sie den Wert fest system(falls nicht bereits vorhanden).

Nach den Änderungen müssen Sie möglicherweise shell32.dll aktualisieren, indem Sie diese mit einer Eingabeaufforderung oder Shell mit erhöhten Rechten ausführen, nachdem Sie diese Änderungen an der Registrierung erstellt haben:

regsvr32 /i shell32.dll

Dies wurde unter Windows 10 Office 2016 Version 16.0.8625.2127 getestet

Alternative Verknüpfung

Sie können auch zum Schlüssel für Dateierweiterungen (z. B. HKEY_CLASSES_ROOT\.xlsx) gehen und den Wert "(Standard)" in eine einzelne Klasse ändern. Wenn dieser Ansatz befolgt wird, können mehrere Dateierweiterungen auf denselben Klassenwert (z. B. Excel.Sheet.12) verweisen, den Sie verwenden Diese Klasse muss nur einmal mit der DDE-Nachricht geändert werden. Wenn Sie dies tun, sollten Sie auch alle Wiederholungen des Klassennamens in diesem Registrierungszweig umbenennen. Diese Methode wird jedoch nicht empfohlen, da sie leicht beschädigt werden kann und durchgeführt werden sollte, wenn Sie alle Dateierweiterungen durchführen, um Zeit zu sparen.

Nebenbemerkungen:

Das /oArgument ist ein Argument für URLs, daher ist es kein großes Problem, diese Funktionalität zu verlieren, da sie selten übergeben wird. Wenn Sie dies wünschen, können Sie versuchen, diesen Teil des Arguments beim Anpassen der (Default)Werte beizubehalten .

Ich denke darüber nach, dies zu einem Community-Wiki zu machen, da es sehr spekulativ und auch unvollendet ist (wenn Word & Excel nicht die einzigen wären). Bitte kommentieren Sie dazu eine Meinung.

El8dN8
quelle
1

Zusätzlich zu der hervorragenden Antwort von @ El8tedN8te stelle ich fest, dass es für Excel nicht erforderlich ist, den ddeexecRegistrierungsschlüssel zu ändern .

Es reicht aus, den Wert des (Default)Elements auf Folgendes einzustellen :

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

Dies stellt durch meine Tests sicher, dass nur eine Instanz von Excel ausgeführt wird.

harrymc
quelle
Bei mir hat diese Methode nicht ohne Erfolg funktioniert, sie wurde nicht in einer einzigen Instanz ausgeführt. Ich habe mich sehr bemüht, mich als falsch zu erweisen. Ich habe neu gestartet, überprüft, ob ich den richtigen Klassennamen und die richtige Erweiterung verwendet habe, Ihre Argumente umgedreht und "C2R" .exe beendet. Im Gegenteil, selbst wenn sie nicht gleichzeitig geöffnet wurden, ließen sie aufgrund des zusätzlichen Arguments getrennte Instanzen bleiben, was hier anerkannt wird: social.technet.microsoft.com/Forums/office/en-US/…
El8dN8
@ El8tedN8te: Ich weiß nicht, was der Unterschied zwischen unseren beiden Computern ist. Möglicherweise im Menü Datei> Optionen> Erweitert unter Allgemein die Option "Andere Anwendungen ignorieren, die Dynamic Data Exchange (DDE) verwenden". Ihr Link bestätigt, dass /ddeeine einzelne Instanz erzwungen werden soll.
Harrymc
Ich weiß nicht, ob ich beim Lesen dieses Links etwas falsch gemacht habe ... ha ... ha ... Ja, ich habe diese Einstellung überprüft ... es lohnt sich zu untersuchen, warum sich meine anders verhält. Wenn mein PC falsch ist, sind meine Spekulationen falsch. Darf ich fragen, Ihre Office-Version?
El8dN8
@ El8tedN8te: Version 16.0.8625.2121.
Harrymc
Auf meinem Computer funktioniert es auch nicht, genau wie bei @ El8tedN8te.
Rand Random
-1

Auf dieser Seite wird berichtet, dass " in Excel keine MDI-Kompatibilitätsoption vorhanden ist ".

"MDI" steht für Multiple Document Interface und wurde durch SDI (Single Document Interface) ersetzt, daher gibt es keinen Fehler. So funktioniert Excel jetzt.

Was Sie tun können, ist durch Arbeitsmappe zu blättern, indem Sie drücken Ctrl+TAB, und Ctrl+Shift+TABrückwärts zu blättern. Wenn Sie möchten, können Sie Anwendungen installieren, die diese Funktionalität zur gesamten Office-Suite hinzufügen. Überprüfen Sie diese beiden Optionen:

Leider kann ich diese Software momentan nicht testen.

m2cit
quelle
Dies beantwortet die Frage nicht, da selbst der von Ihnen angegebene Link beim Öffnen von zwei Excel-Arbeitsblättern nacheinander lautet: "Scrollen Sie auf der Registerkarte" Prozesse "nach unten, bis Excel.exe angezeigt wird. Beachten Sie jedoch, dass Sie zwar zwei Excel-Vorkommen geöffnet haben Zwei Arbeitsmappen sind in derselben einzelnen Instanz von Excel enthalten. " Die Art und Weise, wie das OP zwei Instanzen erstellt (mit derselben Methode wie die von Microsoft), widerspricht der Aussage, dass "in Excel keine MDI-Kompatibilitätsoption vorhanden ist", da mehrere Dokumentschnittstellen (Instanzen) angezeigt werden, nicht innerhalb derselben Instanz, die es sein soll.
El8dN8
Wie @ El8tedN8te betonte, spreche ich von 2 Instanzen (2 Prozessen) und nicht von 2 Fenstern.
Rand Random
Ich möchte meinen früheren Kommentar korrigieren, das angegebene Zitat ist tatsächlich korrekt. Ignorieren Sie also meinen gesamten letzten Satz ... meines letzten Kommentars. Ich war anmaßend.
El8dN8
Es ist in Ordnung, @ El8tedN8te. Ich habe mich gefragt, was in dem Zitat falsch war
m2cit