Plusieurs instances lors de l'ouverture de plusieurs documents Office

9

À partir de la version 16.0.8625.2121d'Office (testé avec Word et Excel) - lorsque vous sélectionnez plusieurs documents dans l'Explorateur et appuyez sur Entrée pour les ouvrir, vous vous retrouverez avec des instances au nombre des documents sélectionnés précédents.

Pour reproduire, procédez comme suit:

  • Créez 2 classeurs Excel vides n'importe où sur votre machine
  • Sélectionnez ces 2 fichiers
  • Appuyez sur Entrée
  • Vérifiez Taskmanager et vous verrez 2 instances d'Excel

Dans les versions antérieures, 16.0.8625.2121vous ne vous retrouviez qu'avec une seule instance.

Testé avec

  • 16.0.4266.1003 - image assez ancienne que nous avions autour de celle que nous avons mise à jour vers de nouvelles versions avec

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

Re-testé étape par étape avec ces nouvelles versions:

  • 16.0.8431.2094
  • 16.0.8431.2107
  • 16.0.8528.2139
  • 16.0.8528.2147

Avant que l'évidence ne soit mentionnée, elle DisableMergeInstancen'est pas définie.

Est-ce une nouvelle "fonctionnalité" ou un bug? Je crois que c'est un bug.

Y a-t-il un moyen de contourner cela?

Plus d'informations:

Nous avons testé ce comportement avec (toujours la dernière version)

  • Windows 7 + Office 2016 - un mauvais comportement se produit
  • Windows 10 + Office 2016 - un mauvais comportement se produit

Vous avez également vérifié l'ancienne version d'Office pour vous assurer qu'il s'agit d'une chose Office 2016

  • Windows 8 + Office 2013 - ne se produit pas
  • Windows 7 + Office 2010 - ne se produit pas
  • Windows 10 + Office 2010 - ne se produit pas
  • Windows 10 + Office 2013 - ne se produit pas
Rand Random
la source

Réponses:

6

Je m'excuse si je réitère mes explications tout au long, mais je trouve que ce problème est très complexe, j'ai donc essayé de faire en sorte qu'il ait un sens contextuel pour les lecteurs:

Bien que l'on ne sache pas s'il s'agit d'un bogue ou s'il était prévu, nous pouvons le forcer à s'ouvrir dans la "même" instance en utilisant le protocole Dynamic Data Exchange (DDE) en créant un message DDE au lieu de l'argument dur "% 1 "pointant vers le fichier de cette instance à ouvrir lors de l'exécution du fichier. (Bien que DDE soit utilisé même avec l'argument dur).

Le message DDE, dans ce cas, est utilisé pour indiquer au programme d'ouvrir un fichier. Pour chaque fichier exécuté, il crée en fait une nouvelle instance à chaque fois. Mais lorsque le protocole DDE est utilisé, il examine d'abord si une instance est déjà créée et, dans l'affirmative, il relaie le message DDE à la première instance trouvée et se ferme, donnant ainsi l'illusion que tous les fichiers s'ouvrent dans une seule instance car elle est instantanée.

Spéculations

Le problème de l'ouverture de fichiers dans plusieurs instances a probablement à voir avec la quantité de chargement d'une seule instance lorsqu'une autre instance est appelée. La tendance entre la différence de temps d'exécution d'une première et d'une seconde instance est que lorsque le temps entre les exécutions augmente, il a tendance à produire une seule instance et à mesure qu'il diminue, il a tendance à produire deux instances. Cela suggère que la première instance doit être chargée ou "prête" pour ouvrir un nouveau fichier dans cette même instance si un autre fichier est exécuté, et si ce n'est pas le cas, il doit ouvrir le fichier avec lui-même.

Il semble que lorsque le chemin du fichier est utilisé comme argument pour le programme, il semble suivre cette tendance uniquement:

  • Word 2016
  • Excel 2016

Lorsqu'elle est utilisée comme argument pour créer des instances au-delà de la première instance si la première est prête (ou si les non-premiers voient que c'est prêt), la non-première instance semble être en mesure de relayer l'argument sous forme de message DDE à la première.

Cependant, si nous exécutons le programme et utilisons un message DDE pour ouvrir le fichier, il semble suivre immédiatement le protocole DDE, que la première instance soit prête ou non à accepter le message DDE via un argument. Le fait que la première instance soit prête ou non dépend probablement si le non-premier voit la première instance comme prête, et si ce n'est pas le cas, il n'enverra pas le message DDE à la première, ce qui ne semble se produire que lorsqu'il s'ouvre via un argument. . La spéculation du non-premier voyant le premier comme non "prêt" ou "inexistant" est suggérée par le fait que les messages DDE (des non-premiers) sont acceptés par le premier quand: le non-premier n'est pas exécuté via une concaténation d'argument "% 1"; et il est dit d'ouvrir via un message DDE.

En tant que telle, ma spéculation est la suivante: le code de ces applications utilise une méthode obscure pour déterminer si une autre instance est "prête" et, dans l'affirmative, utiliserait alors le protocole DDE lorsqu'un argument est utilisé. Cela semble utiliser une méthode différente de celle au moment où il reçoit le protocole DDE pour déterminer s'il faut l'envoyer à une autre instance. Il semblerait en effet que le pseudocode était:

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

Il n'y a aucun moyen de savoir s'il s'agit d'un bogue ou s'il était destiné à être obscur pour une raison, sans que les programmeurs nous en informent.

La résolution

Nous voulons ajuster l'exécution de certaines extensions de fichier pour ne plus envoyer le chemin du fichier ("% 1") du fichier en cours d'exécution comme argument, mais plutôt dire au programme en cours d'exécution de s'exécuter sur le contenu du message DDE, dont contient une requête pour ouvrir un fichier, qui le relaiera à une instance déjà existante si elle existe et sinon ne l'utilisera pas elle-même. Ce qui, spéculativement, contournera les exigences obscures de ces applications pour qu'une autre instance soit considérée comme "prête" si un argument du chemin de fichier est utilisé.

Ce sont toutes des extensions de fichier corrélées aux clés de classe qui doivent être remplacées par x:

Pour 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

Pour 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

* Les extensions de fichier les plus importantes / communes qui devraient être effectuées au minimum. Subjectif.

† Extensions de fichiers secondaires les plus importantes / communes qui devraient être effectuées au minimum. Subjectif.

Ces listes peuvent être répliquées via la ligne de commande: assoc | findstr Wordremplacement Wordpar le nom abrégé officiel (sensible à la casse).

Tout ce que vous avez la possibilité de faire si vous le jugez nécessaire. Si plus vous voulez faire, vous voudrez peut-être suivre les étapes optionnelles que je fournirai, ce qui devrait réduire le travail nécessaire.

Vous devez suivre les instructions suivantes pour chaque clé de registre ci-dessous en remplaçant la xpar les classes correspondantes de votre choix:

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

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

Encore une fois, la OpenAsReadOnlyclé est optionnelle, elle sera prête lorsque le fichier sera exécuté de telle sorte qu'il sera en lecture seule.

Une petite précaution - une sauvegarde

Pour mieux vous rappeler quelles étaient les valeurs du registre avant modification, vous voudrez peut-être aller cliquer avec le bouton droit sur la branche de clé HKEY_CLASSES_ROOT, et dans le menu contextuel, cliquez sur "Exporter" et enregistrez le fichier d'enregistrement à un emplacement. Dans le cas où Doc Brown dit "Nous devons revenir en arrière", vous pouvez simplement importer la clé de registre en l'exécutant et en suivant les instructions.

Alternativement, vous pouvez également l'exécuter pour vous souvenir des commandvaleurs et des noms de classe afin de corriger les petites erreurs avec:

assoc>>fileexts.txt qui peut être filtré en utilisant type fileexts.txt | findstr Word

ftype>>classnames.txt qui peut être filtré en utilisant type classnames.txt | findstr Word

Instructions

Ceux-ci doivent être suivis pour chaque valeur clé répertoriée ci-dessus, comme vous le souhaitez.

Entrez dans votre éditeur de registre préféré ou regeditallez dans la classe que vous souhaitez modifier.

Entrez dans la clé appelée command, faites un clic droit sur la (Default)valeur, puis cliquez sur "Modifier" dans le menu contextuel.

La valeur actuellement définie doit être celle exécutée par ftype | findstr Word

Modifiez-le pour supprimer les arguments directs à la fin de la valeur, y compris l'espace, pour devenir:

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

Entrez dans la clé appelée ddeexec(si elle n'existe pas, créez la clé) qui serait à côté de la commandclé, cliquez avec le bouton droit sur la (Default)valeur, puis cliquez sur "Modifier" dans le menu contextuel, et définissez la valeur pour devenir:

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

En dessous, ddeexeccréez une nouvelle clé appelée topic(si elle n'existe pas), cliquez avec le bouton droit sur la (Default)valeur, puis cliquez sur "Modifier" dans le menu contextuel et définissez la valeur pour qu'elle devienne system(si ce n'est déjà fait).

Après les modifications, vous devrez peut-être actualiser shell32.dll en l'exécutant avec une invite de commandes élevée ou un shell après avoir créé ces modifications dans le registre:

regsvr32 /i shell32.dll

Cela a été testé sur Windows 10 Office 2016 Version 16.0.8625.2127

Raccourci alternatif

Vous pouvez également accéder à la clé des extensions de fichier (telles que HKEY_CLASSES_ROOT\.xlsx) et modifier la valeur "(par défaut)" en une classe singulière, cette approche, si elle est suivie, peut pointer plusieurs extensions de fichier vers la même valeur de classe (telle que Excel.Sheet.12) que vous il suffit de modifier cette classe une seule fois avec le message DDE. Si vous faites cela, vous devez également renommer toutes les réitérations du nom de classe dans cette branche de registre. Cependant, cette méthode n'est pas recommandée, car elle pourrait facilement se casser, et devrait être effectuée si vous deviez faire toutes les extensions de fichier pour gagner du temps.

Sidenotes:

L' /oargument est un argument pour les URL, donc ce n'est pas un gros problème de perdre cette fonctionnalité car elle est rarement transmise. Cependant, si vous le souhaitez, vous pouvez essayer de laisser cette partie de l'argument activée lors du réglage des (Default)valeurs.

J'envisage d'en faire un wiki communautaire, car il est très spéculatif et également inachevé (si Word et Excel n'étaient pas les seuls). Veuillez commenter une opinion à ce sujet.

El8dN8
la source
1

En plus de l'excellente réponse de @ El8tedN8te, je remarque que pour Excel, il n'est pas nécessaire de modifier la ddeexecclé de registre.

Il suffit de définir la valeur de l' (Default)élément sur:

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

Ceci par mes tests garantit qu'une seule instance d'Excel est exécutée.

harrymc
la source
Sur le mien, cette méthode n'a pas fonctionné en vain, elle n'a pas fonctionné en une seule fois. J'ai essayé assez fort de me prouver le contraire. J'ai redémarré, vérifié que j'utilisais le nom et l'extension de classe appropriés, j'ai inversé vos arguments et j'ai tué "C2R" .exe. En fait, a fait le contraire, même s'ils n'ont pas été ouverts simultanément, l'argument supplémentaire les a fait rester des instances distinctes, ce qui est reconnu ici: social.technet.microsoft.com/Forums/office/en-US/…
El8dN8
@ El8tedN8te: Je ne sais pas quelle est la différence entre nos deux ordinateurs. Peut-être dans le menu Fichier> Options> Avancé, sous Général, l'option "Ignorer les autres applications qui utilisent Dynamic Data Exchange (DDE)". Votre lien confirme que cela /ddedevrait forcer une seule instance.
harrymc
Je ne sais pas si j'étais délétère quand j'ai lu ce lien ... ha ... ha ... Oui, j'ai vérifié ce paramètre ... vaut la peine de voir pourquoi le mien se comporte différemment. Si mon PC est faux, ma spéculation est fausse. Puis-je vous demander votre version de bureau?
El8dN8
@ El8tedN8te: version 16.0.8625.2121.
harrymc
Sur ma machine, cela ne fonctionne pas non plus, tout comme @ El8tedN8te.
Rand Random
-1

Dans cette page est signalé que « Il n'y a pas d'option de compatibilité MDI dans Excel » .

"MDI" signifie Multiple Document Interface , et a été remplacé par SDI (Single Document Interface), donc il n'y a pas de bug. C'est ainsi que Excel fonctionne désormais.

Ce que vous pouvez faire, c'est parcourir le classeur en appuyant sur Ctrl+TABet Ctrl+Shift+TABpour revenir en arrière. Si vous le souhaitez, vous pouvez installer des applications qui ajoutent cette fonctionnalité à l'ensemble de la suite Office. Vérifiez ces deux options:

Malheureusement, je ne peux pas tester ces logiciels pour le moment.

m2cit
la source
Cela ne répond pas à la question car même le lien que vous avez fourni indique lorsque vous ouvrez deux feuilles de calcul Excel l'une après l'autre: «Dans l'onglet Processus, faites défiler vers le bas jusqu'à ce que vous voyiez Excel.exe. Sachez que même si vous avez ouvert deux occurrences d'Excel, le deux classeurs sont contenus dans la même instance unique d'Excel. " La façon dont l'OP crée deux instances (avec la même méthode que celle de Microsoft) contredit l'affirmation selon laquelle "il n'y a pas d'option de compatibilité MDI dans Excel" car plusieurs interfaces de document (instances) apparaissent, pas dans la même instance qu'il est censé être.
El8dN8
Comme @ El8tedN8te l'a souligné, je parle de 2 instances (2 processus) et non de 2 fenêtres.
Rand Random
Je voudrais corriger mon commentaire précédent, la citation fournie est en fait correcte. Donc, méprisez toute ma dernière phrase ... de mon dernier commentaire. J'étais présomptueux.
El8dN8
C'est bien, @ El8tedN8te. Je me demandais ce qui n'allait pas dans la citation
m2cit