Несколько экземпляров при открытии нескольких документов Office


9

Начиная с версии 16.0.8625.2121Office (протестировано с 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 - не бывает

Ответы:


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")] - (для слова)
  • [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.


По моему, этот метод не работал безрезультатно, он не работал ни в одном случае. Я очень старался доказать, что я не прав. Я перезапустил, дважды проверил, использовал ли я правильное имя класса и расширение, перевернул ваши аргументы и убил "C2R" .exe. Фактически произошло обратное, даже если они не были открыты одновременно, дополнительный аргумент заставил их остаться отдельными экземплярами, что подтверждается здесь: social.technet.microsoft.com/Forums/office/en-US/…
El8dN8

@ El8tedN8te: Я не знаю, в чем разница между нашими двумя компьютерами. Может быть, в меню «Файл»> «Параметры»> «Дополнительно» в разделе «Общие» параметр «Игнорировать другие приложения, использующие динамический обмен данными (DDE)». Ваша ссылка подтверждает, что /ddeдолжен форсировать один экземпляр.
harrymc

Я не знаю, был ли я вредным, когда читал эту ссылку ... ха ... ха ... Да, я проверил эту настройку ... стоит посмотреть, почему моя ведет себя по-другому. Если мой компьютер не прав, мои предположения не верны. Могу я спросить, ваш офисный вариант?
El8dN8

@ El8tedN8te: версия 16.0.8625.2121.
harrymc

На моей машине он тоже не работает, как @ El8tedN8te.
Рэнд Рэндом

-1

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

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

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

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


Это не отвечает на вопрос, потому что даже указанная вами ссылка говорит при открытии двух рабочих таблиц Excel одна за другой: «На вкладке« Процессы »прокрутите вниз, пока не увидите Excel.exe. Имейте в виду, что, хотя вы открыли два вхождения Excel, две книги содержатся в одном экземпляре Excel. " Способ, которым OP создает два экземпляра (с тем же методом, что и у Microsoft), противоречит утверждению о том, что «в Excel нет опции совместимости MDI», поскольку появляются несколько интерфейсов (экземпляров) документов, а не в одном и том же экземпляре, как это должно быть.
El8dN8

Как указал @ El8tedN8te, я имею в виду 2 экземпляра (2 процесса), а не 2 окна.
Рэнд Рэндом

Я хотел бы исправить свой предыдущий комментарий, приведенная цитата действительно верна. Так что не обращайте внимания на все мое последнее предложение ... моего последнего комментария. Я был самонадеянным.
El8dN8

Все хорошо, @ El8tedN8te. Мне было интересно, что не так в цитате
m2cit
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.