Кілька примірників після відкриття декількох документів 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

  • Windows 8 + Office 2013 - цього не відбувається
  • Windows 7 + Office 2010 - цього не відбувається
  • Windows 10 + Office 2010 - цього не відбувається
  • Windows 10 + Office 2013 - цього не відбувається

Відповіді:


6

Прошу вибачення, якщо я повторюю свої пояснення протягом усієї дати, але я вважаю це питання дуже складним, тому я намагався переконатися, що це контекстуально має сенс для читачів:

Хоча може бути невідомо, чи це помилка чи вона призначена, ми можемо змусити її відкритись в "тому ж" екземплярі, використовуючи протокол динамічного обміну даними (DDE), створивши повідомлення DDE замість жорсткого аргументу "% 1 "вказує на файл, який відкриється для цього примірника при виконанні файлу. (Хоча DDE використовується навіть із жорстким аргументом).

Повідомлення DDE в цьому випадку використовується для того, щоб вказати програмі відкрити файл. Для кожного файлу, який виконується, він щоразу створює новий екземпляр. Але коли використовується протокол DDE, він спочатку вивчає, чи вже створений екземпляр, і якщо так, він передає повідомлення DDE першому знайденому екземпляру і виходить, тим самим створюючи ілюзію, що всі файли відкриваються в одному екземплярі як миттєві.

Спекуляції

Проблема з відкриттям файлів у кількох екземплярах, ймовірно, пов'язана з тим, скільки одного екземпляра вже завантажено під час виклику іншого екземпляра. Тенденція між різницею часу виконання першого та другого примірників полягає в тому, що час збільшення між виконаннями збільшується, як правило, виходить один екземпляр, а у міру зменшення він, як правило, дає два екземпляри. Це говорить про те, що перший екземпляр повинен бути завантажений або "готовий" до відкриття нового файлу в тому самому екземплярі, якщо інший файл виконаний, а якщо ні, він повинен відкрити файл із самим собою.

Здається, коли шлях до файлу використовується як аргумент до програми, він, здається, дотримується цієї тенденції лише для:

  • Слово 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:

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

Для 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"
    (Для 64-розрядних програм Excel)
  • "C:\Program Files\Microsoft Office\Root\Office16\WINWORD.EXE"
    (Для 64-розрядної програми Word)
  • "C:\Program Files (x86)\Microsoft Office\Root\Office16\WINWORD.EXE"
    (Для 32-розрядної програми Word)
  • "C:\Program Files (x86)\Microsoft Office\Root\Office16\EXCEL.EXE"
    (Для 32-розрядної програми Excel)

Введіть ключ, який називається 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. Якщо ви зробите це, вам слід також перейменувати всі повторення імені класу всередині цієї гілки реєстру. Однак цей спосіб не рекомендується, оскільки він може легко зламатися, і його слід робити, якщо ви зробите всі розширення файлів, щоб заощадити час.

Позначення:

/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.
Rand Random

-1

У цій сторінці повідомляється , що « Там немає можливості сумісності MDI в Excel. »

"MDI" означає " Інтерфейс декількох документів" і його замінив SDI (Single Document Interface), тому помилок немає. Це Excel, яким зараз працює.

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

На жаль, я зараз не можу перевірити ці програмні засоби.


Це не дає відповіді на запитання, оскільки навіть вказане вами посилання говорить, коли ви відкриваєте два робочих таблиці Excel один за одним: "На вкладці" Процеси "прокручуйте вниз, доки не з'явиться Excel.exe. Пам’ятайте, що хоч ви відкрили два входи Excel, дві робочі книжки містяться в одному єдиному екземплярі Excel. " Те, як ОП створює два екземпляри (з тим же методом, що і Microsoft), суперечить твердженню, що "в Excel не існує опції сумісності MDI", оскільки з'являється багато інтерфейсів документів (екземплярів), а не в одному і тому ж екземплярі.
El8dN8

Як зазначав @ El8tedN8te, я говорю про 2 екземпляри (2 процеси), а не про 2 вікна.
Rand Random

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

Це добре, @ El8tedN8te. Мені було цікаво, що трапилось у цитаті
m2cit
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.