Várias instâncias ao abrir vários documentos do Office


9

Começando com a Versão 16.0.8625.2121do Office (testada com Word e Excel) - quando você seleciona vários documentos no Explorer e pressiona Enter para abri-los, você termina com instâncias da contagem dos documentos selecionados anteriores.

Para reproduzir, execute as seguintes etapas:

  • Crie 2 Pastas de Trabalho em Excel vazias em qualquer lugar da sua máquina
  • Selecione esses 2 arquivos
  • Pressione Enter
  • Verifique Taskmanager e você verá 2 instâncias do Excel

Nas versões anteriores, 16.0.8625.2121você acabaria com apenas 1 instância.

Testado com

  • 16.0.4266.1003 - imagem muito antiga que tínhamos ao redor do que atualizamos para versões mais recentes com

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

Re-testado passo a passo com essas novas construções:

  • 16.0.8431.2094
  • 16.0.8431.2107
  • 16.0.8528.2139
  • 16.0.8528.2147

Antes que o óbvio seja mencionado, DisableMergeInstancenão está definido.

Isso é um novo "recurso" ou um bug? Eu acredito que é um bug.

Existe uma maneira de contornar isso?

Outras informações:

Testamos esse comportamento com (sempre a versão mais recente)

  • Windows 7 + Office 2016 - o mau comportamento acontece
  • Windows 10 + Office 2016 - o mau comportamento acontece

Também verifiquei a versão mais antiga do Office para garantir que se trata de uma coisa do Office 2016

  • Windows 8 + Office 2013 - não acontece
  • Windows 7 + Office 2010 - não acontece
  • Windows 10 + Office 2010 - não acontece
  • Windows 10 + Office 2013 - não acontece

Respostas:


6

Peço desculpas se reiterar minhas explicações por toda parte, mas considero esse assunto muito complexo, por isso tentei garantir que contextualmente faça sentido para os leitores:

Embora não se saiba se isso é um bug ou se foi intencional, podemos forçá-lo a abrir na instância "mesma" usando o protocolo DDE (Dynamic Data Exchange Protocol) criando uma mensagem DDE em vez do argumento "% 1 "apontando para o arquivo para a instância abrir ao executar o arquivo. (Embora o DDE seja usado mesmo com o argumento rígido).

A mensagem DDE, neste caso, é usada para dizer ao programa para abrir um arquivo. Para cada arquivo executado, ele realmente cria uma nova instância sempre. Porém, quando o protocolo DDE é usado, ele primeiro examina se uma instância já foi criada e, em caso afirmativo, retransmite a mensagem DDE para a primeira instância encontrada e sai, dando a ilusão de que todos os arquivos são abertos em uma única instância, pois são instantâneos.

Especulações

O problema da abertura de arquivos em várias instâncias provavelmente tem a ver com o quanto uma única instância já foi carregada quando outra instância está sendo chamada. A tendência entre a diferença no tempo de execução de uma primeira e uma segunda instância é que, conforme o tempo entre execuções aumenta, ela tende a render uma única instância e, à medida que diminui, tende a produzir duas instâncias. Isso sugere que a primeira instância deve estar carregada ou "pronta" para abrir um novo arquivo na mesma instância, se outro arquivo for executado e, caso contrário, deverá abrir o arquivo consigo.

Parece que quando o caminho do arquivo é usado como argumento para o programa, parece seguir esta tendência apenas:

  • Word 2016
  • Excel 2016

Quando usada como argumento para criar instâncias além da primeira instância, se a primeira estiver pronta (ou se os primeiros não acharem que está pronta), a não-primeira instância parece capaz de retransmitir o argumento como uma mensagem DDE para a primeira.

No entanto, se executarmos o programa e usarmos uma mensagem DDE para abrir o arquivo, parece seguir o protocolo DDE imediatamente se a primeira instância está pronta ou não para aceitar a mensagem DDE via argumento. A probabilidade de a primeira instância estar ou não pronta depende se o primeiro não vê a primeira instância como pronta e, caso contrário, não envia a mensagem DDE para a primeira, o que parece ocorrer apenas quando é aberto via argumento . A especulação do não-primeiro que vê o primeiro como não "pronto" ou "inexistente" é sugerida pelo fato de que as mensagens DDE (de não-primeiros) são aceitas pelo primeiro quando: o não-primeiro não é executado via uma concatenação de argumento "% 1"; e é dito para abrir através de uma mensagem DDE.

Como tal, minha especulação é: o código para esses aplicativos usa algum método obscuro para determinar se outra instância está "pronta" e, se assim for, usaria o protocolo DDE quando um argumento for usado. Isso parece usar um método diferente do que quando recebe o protocolo DDE para determinar se deve enviá-lo para outra instância. Aparentemente, o pseudocódigo era:

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

Não há como saber se isso é um bug ou se foi pretendido que ele fosse obscuro por um motivo, sem que os programadores nos informassem.

A resolução

Queremos ajustar a execução de determinadas extensões de arquivo para não enviar mais o caminho do arquivo ("% 1") do arquivo que está sendo executado como argumento, mas dizer ao programa que está sendo executado para executar o conteúdo da mensagem DDE, da qual contém uma solicitação para abrir um arquivo, que o retransmitirá para uma instância já existente, se existir e se não for o próprio uso. Que especulativamente, ignorará os requisitos obscuros desses aplicativos para que outra instância seja vista como "pronta" se um argumento para o caminho do arquivo for usado.

Essas são todas as extensões de arquivo correlacionadas às chaves de classe que devem ser substituídas por x:

Para o 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

Para 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

* As extensões de arquivo mais importantes / comuns que devem ser feitas no mínimo. Subjetivo.

† Extensões de arquivo secundárias mais importantes / comuns que devem ser executadas no mínimo. Subjetivo.

Essas listas podem ser replicadas pela linha de comando: assoc | findstr Wordsubstituindo Wordpelo nome abreviado oficial (diferencia maiúsculas de minúsculas).

Tudo o que você tem a opção de fazer se achar necessário. Se quanto mais você quiser, siga as etapas opcionais que darei, o que reduzirá o trabalho necessário.

Você deve seguir as instruções a seguir para cada chave do registro abaixo, substituindo a x(s) classe (s) correspondente (s) de sua escolha:

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

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

Mais uma vez, a OpenAsReadOnlychave é opcional. Isso ficará pronto quando o arquivo for executado, de modo que seria somente leitura.

Uma pequena precaução - um backup

Para lembrar melhor quais eram os valores do registro antes da modificação, clique com o botão direito do mouse na ramificação da chave HKEY_CLASSES_ROOTe, no menu de contexto, clique em "Exportar" e salve o arquivo de registro em um local. Caso o Doc Brown diga "Precisamos voltar", você pode importar a chave do Registro executando-a e seguindo as instruções.

Como alternativa, você também pode executar isso para lembrar quais commanderam os valores e nomes de classe para corrigir pequenos erros com:

assoc>>fileexts.txt que pode ser filtrado usando type fileexts.txt | findstr Word

ftype>>classnames.txt que pode ser filtrado usando type classnames.txt | findstr Word

Instruções

Eles devem ser seguidos para todos os valores-chave listados acima, como você deseja fazer.

Entre no seu editor de registro favorito ou regeditvá para a turma que deseja modificar.

Digite a chave chamada command, clique com o botão direito do mouse no (Default)valor e clique em "Modificar" no menu de contexto.

Atualmente definido deve ser o que foi executado por ftype | findstr Word

Altere-o para remover os argumentos diretos no final do valor, incluindo o espaço, para se tornar:

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

Digite a chave chamada ddeexec(se ela não existir, crie a chave) que estaria ao lado da commandchave, clique com o botão direito do mouse no (Default)valor e clique em "Modificar" no menu de contexto e defina o valor para:

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

Abaixo, ddeexeccrie uma nova chave chamada topic(se ela não existir), clique com o botão direito do mouse no (Default)valor e clique em "Modificar" no menu de contexto e defina o valor para se tornar system(se ainda não existir).

Após as modificações, talvez seja necessário atualizar o shell32.dll executando-o com um prompt de comando ou shell elevado após a criação dessas alterações no registro:

regsvr32 /i shell32.dll

Isso foi testado em um Windows 10 Office 2016 versão 16.0.8625.2127

Atalho alternativo

Você também pode acessar a chave para extensões de arquivo (como HKEY_CLASSES_ROOT\.xlsx) e modificar o valor "(Padrão)" para uma classe singular. Essa abordagem, se seguida, pode apontar várias extensões de arquivo para o mesmo valor de classe (como Excel.Sheet.12) que você só precisa modificar essa classe uma vez com a mensagem DDE. Se você fizer isso, renomeie todas as reiterações do nome da classe dentro dessa ramificação do registro. No entanto, esse caminho não é recomendado, pois pode ser interrompido facilmente e deve ser feito se você fizer todas as extensões de arquivo para economizar tempo.

Sidenotes:

O /oargumento é um argumento para URLs, portanto, não é uma grande preocupação em perder essa funcionalidade, pois raramente é passada. No entanto, se desejar, você pode tentar deixar essa parte do argumento ativada ao ajustar os (Default)valores.

Estou pensando em fazer deste um wiki da comunidade, pois é muito especulativo e também inacabado (se o Word e o Excel não fossem os únicos). Por favor, comente uma opinião sobre isso.


1

Além da excelente resposta de @ El8tedN8te, observo que para o Excel não é necessário modificar a ddeexecchave do registro.

É suficiente definir o valor do (Default)item para:

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

Isso pelos meus testes garante que apenas uma instância do Excel seja executada.


No meu, esse método não funcionou sem sucesso, não foi executado em uma única instância. Eu tentei bastante provar que estava errado. Reiniciei, verifiquei que estava usando o nome e a extensão corretos de classe, inverti seus argumentos e matei "C2R" .exe. De fato, fez o contrário, mesmo que não tenham sido abertos simultaneamente, o argumento extra os fez permanecer instâncias separadas, o que é reconhecido aqui: social.technet.microsoft.com/Forums/office/en-US/…
El8dN8

@ El8tedN8te: Não sei qual é a diferença entre nossos dois computadores. Talvez no menu Arquivo> Opções> Avançado, em Geral, opção "Ignorar outros aplicativos que usam o Dynamic Data Exchange (DDE)". Seu link confirma que /ddedeve forçar uma única instância.
harrymc

Não sei se fiquei delirante quando li esse link ... ha ... ha ... Sim, verifiquei essa configuração ... vale a pena examinar por que a minha está se comportando de maneira diferente. Se meu PC está errado, minha especulação está errada. Posso perguntar, sua versão do escritório?
El8dN8

@ El8tedN8te: Versão 16.0.8625.2121.
harrymc

Na minha máquina também não está funcionando, assim como o @ El8tedN8te.
Rand aleatório

-1

Em esta página é relatado que " Não há opção de compatibilidade MDI no Excel. "

"MDI" significa Multiple Document Interface , e foi substituído por SDI (Single Document Interface), portanto, não há bug. É dessa maneira que o Excel agora funciona.

O que você pode fazer é percorrer a pasta de trabalho pressionando Ctrl+TABe Ctrl+Shift+TABretroceder. Se você quiser, pode instalar aplicativos que adicionam essa funcionalidade a todo o pacote do Office. Verifique estas duas opções:

Infelizmente, não posso testar esses softwares no momento.


Isso não responde à pergunta porque mesmo o link que você forneceu diz quando você abre duas planilhas do Excel uma após a outra: "Na guia Processos, role para baixo até ver o Excel.exe. Lembre-se de que, embora você tenha aberto duas ocorrências do Excel, o duas pastas de trabalho estão contidas na mesma instância única do Excel ". A maneira como o OP cria duas instâncias (com o mesmo método da Microsoft) contradiz a afirmação de que "não há opção de compatibilidade com MDI no Excel" porque várias interfaces de documento (instâncias) estão aparecendo, não dentro da mesma instância que deveria.
El8dN8

Como o @ El8tedN8te apontou, estou falando de 2 instâncias (2 processos) e não de 2 janelas.
Rand aleatório

Gostaria de corrigir meu comentário anterior, a citação fornecida está realmente correta. Então desconsidere minha última frase ... do meu último comentário. Eu estava sendo presunçoso.
El8dN8

Está tudo bem, @ El8tedN8te. Eu queria saber o que estava errado na citação
m2cit 28/11
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.