Я извиняюсь, если я повторяю свои объяснения повсюду, но я нахожу этот вопрос очень сложным, поэтому я постарался сделать так, чтобы он имел смысл для читателей:
Хотя может быть неизвестно, является ли это ошибкой или она была предназначена, мы можем принудительно открыть ее в «том же» экземпляре, используя протокол динамического обмена данными (DDE), создав сообщение DDE вместо жесткого аргумента «% 1 "указывает на файл для этого экземпляра, чтобы открыть при выполнении файла. (Хотя DDE используется даже с жестким аргументом).
Сообщение DDE, в этом случае, используется для указания программе открыть файл. Для каждого исполняемого файла каждый раз создается новый экземпляр. Но когда используется протокол DDE, он сначала проверяет, был ли экземпляр уже создан, и если это так, он передает сообщение DDE первому найденному экземпляру и завершает работу, создавая тем самым иллюзию, что все файлы открываются в одном экземпляре, поскольку он мгновенный.
Спекуляции
Проблема открытия файлов в нескольких экземплярах, скорее всего, связана с тем, сколько одного экземпляра уже загружено при вызове другого экземпляра. Тенденция между разницей во времени выполнения первого и второго экземпляров заключается в том, что с увеличением времени между выполнениями наблюдается тенденция к получению одного экземпляра, а при уменьшении - к двум экземплярам. Это говорит о том, что первый экземпляр должен быть загружен или «готов», чтобы открыть новый файл в этом же экземпляре, если выполняется другой файл, и если нет, он должен открыть файл сам с собой.
Кажется, что когда путь к файлу используется в качестве аргумента для программы, он следует этой тенденции только для:
При использовании в качестве аргумента для создания экземпляров, выходящих за пределы первого экземпляра, если первый готов (или если первые не видят, что он готов), не первый экземпляр может передавать аргумент как сообщение 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 были не единственными). Пожалуйста, прокомментируйте мнение по этому вопросу.