9

Начиная с версии 16.0.8625.2121 Office (протестировано с Word и Excel) - когда вы выбираете несколько документов в Проводнике и нажимаете Enter, чтобы открыть их, вы получите экземпляры для подсчета предыдущих выбранных документов.

Для воспроизведения сделайте следующие шаги:

  • Создайте 2 пустые книги Excel в любом месте на вашем компьютере
  • Выберите эти 2 файла
  • Нажмите Enter
  • Проверьте Taskmanager, и вы увидите 2 экземпляра Excel

В более ранних версиях, чем 16.0.8625.2121 вас был бы только 1 экземпляр.

Протестировано с

  • 16.0.4266.1003 - довольно старое изображение, которое у нас было, чем мы обновили до более новых версий с

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

Пошаговое тестирование с этими новыми сборками:

  • 16.0.8431.2094
  • 16.0.8431.2107
  • 16.0.8528.2139
  • 16.0.8528.2147

Прежде, чем очевидное упомянуто, DisableMergeInstance не установлен.

Это новая "фича" или ошибка? Я считаю, что это ошибка.

Есть ли способ обойти это?

Дальнейшая информация:

Мы проверили это поведение с (всегда последняя версия)

  • Windows 7 + Office 2016 - плохое поведение
  • Windows 10 + Office 2016 - плохое поведение

Также проверил старую версию Office, чтобы убедиться, что это Office 2016 Thing

  • Windows 8 + Office 2013 - не бывает
  • Windows 7 + Office 2010 - не бывает
  • Windows 10 + Office 2010 - не бывает
  • Windows 10 + Office 2013 - не бывает

3 ответа3

6

Я извиняюсь, если я повторяю свои объяснения повсюду, но я нахожу этот вопрос очень сложным, поэтому я постарался сделать так, чтобы он имел смысл для читателей:

Хотя может быть неизвестно, является ли это ошибкой или она была задумана, мы можем принудительно открыть ее в "том же" экземпляре, используя протокол динамического обмена данными (DDE), создав сообщение DDE вместо жесткого аргумента «% 1 "указывает на файл для этого экземпляра, чтобы открыть при выполнении файла. (Хотя DDE используется даже с жестким аргументом).

Сообщение DDE в этом случае используется для указания программе открыть файл. Для каждого исполняемого файла каждый раз создается новый экземпляр. Но когда используется протокол DDE, он сначала проверяет, был ли экземпляр уже создан, и если это так, он передает сообщение DDE первому найденному экземпляру и завершает работу, создавая тем самым иллюзию, что все файлы открываются в одном экземпляре, поскольку он мгновенный.

Спекуляции

Проблема открытия файлов в нескольких экземплярах, вероятно, связана с тем, сколько одного экземпляра уже загружено при вызове другого экземпляра. Тенденция между разницей во времени выполнения первого и второго экземпляров заключается в том, что с увеличением времени между выполнениями наблюдается тенденция к получению одного экземпляра, а при уменьшении - два экземпляра. Это говорит о том, что первый экземпляр должен быть загружен или "готов", чтобы открыть новый файл в этом же экземпляре, если выполняется другой файл, и если нет, он должен открыть файл сам с собой.

Кажется, когда путь к файлу используется в качестве аргумента для программы, он, кажется, следует этой тенденции только для:

  • Word 2016
  • Excel 2016

При использовании в качестве аргумента для создания экземпляров за пределами первого экземпляра, если первый готов (или если первые не видят, что он готов), не первый экземпляр, кажется, может передать аргумент как сообщение DDE первому.

Однако, если мы выполняем программу и используем сообщение DDE, чтобы открыть файл, то, похоже, сразу следует протоколу DDE, готов ли первый экземпляр принять сообщение DDE через аргумент. Вероятность готовности первого экземпляра зависит от того, видит ли не первый первый экземпляр как готовый, а если нет, то не отправляет сообщение DDE первому, что, по-видимому, происходит только при открытии через аргумент. , Предположение о том, что не первый видит первое как "не готовое" или "несуществующее", подтверждается тем фактом, что сообщения DDE (из не первых) принимаются первым, когда: не первое не выполняется через конкатенация аргументов "% 1"; и сказано открыть через сообщение DDE.

Таким образом, мое предположение таково: код для этих приложений использует какой-то непонятный метод для определения того, "готов" ли другой экземпляр, и если это так, то будет использовать протокол DDE при использовании аргумента. Похоже, что для этого используется другой метод, а не только когда он получает протокол DDE для определения, отправлять ли его в другой экземпляр. Похоже, в действительности псевдокод был:

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

Невозможно сказать, является ли это ошибкой или она должна была быть неясной по какой-либо причине, без того, чтобы программисты не сообщили нам об этом.

Разрешение

Мы хотим настроить выполнение определенных расширений файлов так, чтобы они больше не отправляли путь файла ("% 1") исполняемого файла в качестве аргумента, а скорее указывали выполняемой программе выполнить содержимое сообщения DDE, о котором содержит запрос на открытие файла, который передаст его уже существующему экземпляру, если он существует, а если не использует его сам. Что, умозрительно, позволит обойти непонятные требования этих приложений для другого экземпляра, который будет рассматриваться как "готовый", если используется аргумент пути к файлу.

Это все расширения файлов, связанные с ключами класса, которые должны быть заменены на x:

Для слова

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

Для 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

* Наиболее важные / распространенные расширения файлов, которые должны быть сделаны как минимум. Субъективная.

† Вторичные наиболее важные / общие расширения файлов, которые должны быть сделаны как минимум. Субъективная.

Эти списки можно реплицировать через командную строку: assoc | findstr Word заменяет Word на официальное сокращенное имя (с учетом регистра).

Все, что вы можете сделать, если считаете это необходимым. Если вы захотите сделать больше, возможно, вы захотите выполнить дополнительные шаги, которые я предоставлю, что должно сократить объем необходимой работы.

Вы должны следовать следующим инструкциям для каждого раздела реестра ниже, заменив x на соответствующий класс (ы) по вашему выбору:

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

(Например: HKEY_CLASSES_ROOT\Excel.Sheet.12\shell\Open)

Опять же, ключ OpenAsReadOnly , необязательно , он будет готов, когда файл будет выполнен так, что он будет доступен только для чтения.

Небольшая предосторожность - бэкап

Чтобы лучше запомнить значения реестра перед изменением, вы можете щелкнуть правой кнопкой мыши на ключевой ветви HKEY_CLASSES_ROOT и в контекстном меню нажать "Экспорт" и сохранить файл регистрации в определенном месте. В случае, если Док Браун говорит: "Нам нужно вернуться назад", вы можете просто импортировать раздел реестра, выполнив его и следуя инструкциям.

В качестве альтернативы, вы также можете запустить это, чтобы вы помнили, какие значения command и имена классов были для исправления небольших ошибок:

assoc>>fileexts.txt который можно отфильтровать, используя type fileexts.txt | findstr Word

ftype>>classnames.txt который можно отфильтровать с помощью type classnames.txt | findstr Word

инструкции

Они должны соблюдаться для каждого значения ключа, указанного выше, как вы пожелаете.

Войдите в ваш любимый редактор реестра или regedit и перейдите к классу, который вы хотите изменить.

Введите ключ с именем command , щелкните правой кнопкой мыши значение (Default) и выберите "Изменить" в контекстном меню.

В настоящее время установлено, что должно быть выполнено ftype | findstr Word

Измените его, чтобы удалить прямые аргументы в конце значения, включая пробел, чтобы они стали:

  • "C:\Program Files\Microsoft Office\Root\Office16\EXCEL.EXE"
    (Для Excel 64-bit)
  • "C:\Program Files\Microsoft Office\Root\Office16\WINWORD.EXE"
    (Для Word 64-bit)
  • "C:\Program Files (x86)\Microsoft Office\Root\Office16\WINWORD.EXE"
    (Для Word 32-bit)
  • "C:\Program Files (x86)\Microsoft Office\Root\Office16\EXCEL.EXE"
    (Для Excel 32-разрядная версия)

Введите ключ с именем ddeexec (если он не существует, создайте ключ), который будет находиться рядом с command ключом, щелкните правой кнопкой мыши значение (Default) и нажмите "Изменить" в контекстном меню, и установите значение, чтобы стать :

  • [REM _DDE_Direct][FileOpen("%1")] - (для Word)
  • [open("%1")] - (для Excel)

Под ddeexec создайте новый ключ с именем topic (если он не существует), щелкните правой кнопкой мыши значение (Default) и нажмите "Изменить" в контекстном меню и установите значение, чтобы стать system (если его еще нет).

После внесения изменений вам, возможно, придется обновить shell32.dll, запустив его с повышенными правами командной строки или оболочки после создания этих изменений в реестре:

regsvr32 /i shell32.dll

Это было проверено на Windows 10 Office 2016 версии 16.0.8625.2127

Альтернативный ярлык

Вы также можете перейти к ключу для расширений файлов (например, HKEY_CLASSES_ROOT\.xlsx) и изменить значение «(по умолчанию)» для отдельного класса, при таком подходе несколько расширений файлов могут указывать на одно и то же значение класса (например, как Excel.Sheet.12), который вы должны изменить этот класс только один раз с сообщением DDE. Если вы сделаете это, следует также переименовать все повторения имени класса внутри этой ветви реестра. Однако этот способ не рекомендуется, так как он может легко сломаться, и его следует делать, если вы хотите использовать все расширения файлов, чтобы сэкономить время.

Sidenotes:

Аргумент /o является аргументом для URL-адресов, поэтому не стоит беспокоиться о потере этой функциональности, поскольку она редко передается. Однако при желании вы можете попытаться оставить эту часть аргумента включенной при настройке значений (Default) .

Я собираюсь сделать это вики-сообществом, так как оно очень умозрительно и еще не закончено (если Word и Excel были не единственными). Пожалуйста, прокомментируйте мнение по этому вопросу.

1

В дополнение к отличному ответу @ El8tedN8te, я отмечаю, что для Excel нет необходимости изменять раздел реестра ddeexec .

Достаточно установить значение элемента (Default) :

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

Это по моим тестам гарантирует, что выполняется только один экземпляр Excel.

-1

На этой странице сообщается, что « В Excel нет опции совместимости MDI ».

"MDI" означает многодокументный интерфейс и был заменен SDI (единый документный интерфейс), поэтому здесь нет ошибок. Так работает Excel.

То, что вы можете сделать, это циклически перемещаться по книге, нажимая Ctrl+TAB и Ctrl+Shift+TAB для циклического перемещения назад. При желании вы можете установить приложения, которые добавляют эту функциональность ко всему пакету Office. Проверьте эти два варианта:

К сожалению, я не могу протестировать эти программы прямо сейчас.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .