Wiele wystąpień po otwarciu wielu dokumentów pakietu Office


9

Począwszy od wersji 16.0.8625.2121pakietu Office (przetestowanej w programach Word i Excel) - po wybraniu wielu dokumentów w Eksploratorze i naciśnięciu klawisza Enter, aby je otworzyć, skończysz wystąpieniem liczby wcześniej wybranych dokumentów.

Aby odtworzyć, wykonaj następujące czynności:

  • Utwórz 2 puste skoroszyty programu Excel w dowolnym miejscu na komputerze
  • Wybierz te 2 pliki
  • Wciśnij Enter
  • Sprawdź Menedżera zadań, a zobaczysz 2 wystąpienia programu Excel

We wcześniejszych wersjach 16.0.8625.2121miałbyś tylko 1 instancję.

Testowane z

  • 16.0.4266.1003 - dość stary obraz, który mieliśmy, niż zaktualizowaliśmy do nowszych wersji za pomocą

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

Ponownie przetestowane krok po kroku z tymi nowymi kompilacjami:

  • 16.0.8431.2094
  • 16.0.8431.2107
  • 16.0.8528.2139
  • 16.0.8528.2147

Zanim oczywiste zostanie wspomniane, DisableMergeInstancenie jest ustawione.

Czy to nowa „funkcja” czy błąd? Wierzę, że to błąd.

Czy jest na to jakiś sposób?

Dalsza informacja:

Testowaliśmy to zachowanie z (zawsze najnowszą wersją)

  • Windows 7 + Office 2016 - zdarza się niewłaściwe zachowanie
  • Windows 10 + Office 2016 - zdarza się złe zachowanie

Sprawdziłem również starszą wersję pakietu Office, aby upewnić się, że jest to rzecz pakietu Office 2016

  • Windows 8 + Office 2013 - tak się nie dzieje
  • Windows 7 + Office 2010 - tak się nie dzieje
  • Windows 10 + Office 2010 - tak się nie dzieje
  • Windows 10 + Office 2013 - tak się nie dzieje

Odpowiedzi:


6

Przepraszam, jeśli powtarzam moje wyjaśnienia, ale uważam ten problem za bardzo złożony, więc starałem się, aby kontekstowo miał on sens dla czytelników:

Chociaż może nie być wiadomo, czy jest to błąd, czy był zamierzony, możemy zmusić go do otwarcia w „tej samej” instancji za pomocą protokołu Dynamic Data Exchange (DDE), tworząc komunikat DDE zamiast twardego argumentu „% 1 ”wskazuje plik, który ma zostać otwarty podczas uruchamiania tego pliku. (Chociaż DDE jest używane nawet z trudnym argumentem).

Komunikat DDE w tym przypadku służy programowi do otwarcia pliku. Dla każdego wykonywanego pliku za każdym razem tworzy nową instancję. Ale gdy używany jest protokół DDE, najpierw sprawdza, czy instancja jest już utworzona, a jeśli tak, przekazuje komunikat DDE do pierwszej znalezionej instancji i wychodzi, dając złudzenie, że wszystkie pliki otwierają się w jednej instancji, ponieważ jest natychmiastowa.

Spekulacje

Problem z otwieraniem plików w wielu instancjach prawdopodobnie ma związek z tym, ile jedna instancja już załadowała, gdy wywoływana jest inna instancja. Tendencja między różnicą czasu wykonania pierwszej i drugiej instancji jest taka, że ​​wraz ze wzrostem czasu między kolejnymi wykonaniami wydaje się pojedyncze wystąpienie, a wraz ze zmniejszaniem ma tendencję do uzyskiwania dwóch instancji. Sugeruje to, że pierwsza instancja musi zostać załadowana lub „gotowa”, aby otworzyć nowy plik w tej samej instancji, jeśli wykonywany jest inny plik, a jeśli nie, otworzy ten plik sam.

Wydaje się, że gdy ścieżka pliku jest używana jako argument do programu, wydaje się podążać za tym trendem tylko dla:

  • Word 2016
  • Excel 2016

W przypadku użycia jako argumentu do tworzenia instancji poza pierwszą instancją, jeśli pierwsza jest gotowa (lub jeśli nie-pierwsze widzą, że jest gotowa), pierwsza instancja wydaje się być w stanie przekazać argument jako wiadomość DDE do pierwszej.

Jeśli jednak uruchomimy program i użyjemy komunikatu DDE do otwarcia pliku, wydaje się, że postępuje on zgodnie z protokołem DDE od razu, czy pierwsza instancja jest gotowa zaakceptować komunikat DDE za pomocą argumentu. To, czy pierwsza instancja jest gotowa, prawdopodobnie zależy od tego, czy pierwsza nie uzna pierwszej instancji za gotową, a jeśli nie, nie wyśle ​​komunikatu DDE do pierwszej, co wydaje się występować tylko wtedy, gdy otwiera się za pomocą argumentu . Spekulacje, że nie pierwszy widzi pierwszy jako „nie gotowy” lub „nieistniejący” jest sugerowany przez fakt, że wiadomości DDE (od nie-pierwszych) są akceptowane przez pierwsze, gdy: nie-pierwszy nie jest wykonywany przez konkatenacja argumentu „% 1”; i mówi się, aby otworzyć za pomocą wiadomości DDE.

W związku z tym spekuluję: kod dla tych aplikacji korzysta z niejasnej metody określania, czy inna instancja jest „gotowa”, a jeśli tak, to użyje protokołu DDE, gdy użyty zostanie argument. Wydaje się, że używa innej metody niż tylko po otrzymaniu protokołu DDE w celu ustalenia, czy wysłać go do innej instancji. Wyglądałoby na to, że pseudokod to:

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

Nie ma sposobu, aby stwierdzić, czy jest to błąd, czy z jakiegoś powodu miał on być niejasny, bez informowania nas przez programistów.

Rezolucja

Chcemy dostosować wykonanie niektórych rozszerzeń plików, aby nie wysyłać ścieżki pliku („% 1”) wykonywanego pliku jako argumentu, ale raczej powiedzieć programowi, który jest wykonywany, aby działał zgodnie z treścią komunikatu DDE, którego zawiera żądanie otwarcia pliku, który przekaże go do już istniejącej instancji, jeśli istnieje, a jeśli nie, skorzystaj z niej. Który spekulacyjnie ominie niejasne wymagania tych aplikacji, aby inna instancja była postrzegana jako „gotowa”, jeśli użyty zostanie argument ścieżki pliku.

Są to wszystkie rozszerzenia plików powiązane z kluczami klas, które należy zastąpić x:

Dla słowa

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

Dla programu 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

* Najważniejsze / najczęstsze rozszerzenia plików, które należy wykonać jako minimum. Subiektywny.

† Drugorzędne najważniejsze / najczęstsze rozszerzenia plików, które należy wykonać jako minimum. Subiektywny.

Listy te można replikować za pomocą wiersza polecenia: assoc | findstr Wordzastępując Wordoficjalną skróconą nazwą (z rozróżnianiem wielkości liter).

Wszystko to możesz zrobić, jeśli uważasz, że jest to konieczne. Jeśli chcesz więcej, możesz wykonać opcjonalne kroki, które przedstawię, co powinno zmniejszyć wymaganą pracę.

Należy postępować zgodnie z następującymi instrukcjami dla każdego klucza rejestru poniżej, zastępując xodpowiadającą wybraną klasą (klasami):

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

(Np HKEY_CLASSES_ROOT\Excel.Sheet.12\shell\Open)

Po raz kolejny OpenAsReadOnlyklucz jest opcjonalny, będzie gotowy, gdy plik zostanie wykonany tak, aby był tylko do odczytu.

Mała ostrożność - kopia zapasowa

Aby jak najlepiej zapamiętać wartości rejestru przed modyfikacją, możesz kliknąć prawym przyciskiem myszy gałąź klucza HKEY_CLASSES_ROOT, a następnie w menu kontekstowym kliknąć „Eksportuj” i zapisać plik rejestracyjny w lokalizacji. W przypadku, gdy Doc Brown powie „Musimy wrócić”, możesz po prostu zaimportować klucz rejestru, wykonując go i postępując zgodnie z instrukcjami.

Możesz również uruchomić to, aby zapamiętać commandwartości i nazwy klas, aby naprawić małe błędy za pomocą:

assoc>>fileexts.txt które można filtrować za pomocą type fileexts.txt | findstr Word

ftype>>classnames.txt które można filtrować za pomocą type classnames.txt | findstr Word

Instrukcje

Należy je przestrzegać dla każdej kluczowej wartości wymienionej powyżej, tak jak chcesz.

Wejdź do swojego ulubionego edytora rejestru lub regeditprzejdź do klasy, którą chcesz zmodyfikować.

Wprowadź klucz o nazwie command, kliknij prawym przyciskiem myszy (Default)wartość i kliknij „Modyfikuj” w menu kontekstowym.

Aktualnie ustawione powinno być to, co zostało wykonane ftype | findstr Word

Zmień go, aby usunąć bezpośrednie argumenty na końcu wartości, w tym spację, aby stać się:

  • "C:\Program Files\Microsoft Office\Root\Office16\EXCEL.EXE"
    (Dla Excela 64-bitowego)
  • "C:\Program Files\Microsoft Office\Root\Office16\WINWORD.EXE"
    (Dla programu Word 64-bit)
  • "C:\Program Files (x86)\Microsoft Office\Root\Office16\WINWORD.EXE"
    (Dla programu Word 32-bit)
  • "C:\Program Files (x86)\Microsoft Office\Root\Office16\EXCEL.EXE"
    (Dla Excela 32-bitowego)

Wprowadź klucz o nazwie ddeexec(jeśli nie istnieje, utwórz klucz), który będzie obok commandklucza, kliknij (Default)wartość prawym przyciskiem myszy i kliknij „Modyfikuj” w menu kontekstowym i ustaw wartość na:

  • [REM _DDE_Direct][FileOpen("%1")] - (dla słowa)
  • [open("%1")] - (dla Excela)

Poniżej ddeexecutwórz nowy klucz o nazwie topic(jeśli nie istnieje), kliknij prawym przyciskiem myszy (Default)wartość, a następnie kliknij „Modyfikuj” w menu kontekstowym i ustaw wartość na system(jeśli jeszcze nie jest).

Po modyfikacji może być konieczne odświeżenie pliku shell32.dll, uruchamiając go z podniesionym wierszem polecenia lub powłoką po utworzeniu tych zmian w rejestrze:

regsvr32 /i shell32.dll

Zostało to przetestowane w systemie Windows 10 Office 2016 w wersji 16.0.8625.2127

Alternatywny skrót

Możesz także przejść do klucza dla rozszerzeń plików (np. HKEY_CLASSES_ROOT\.xlsx) I zmodyfikować wartość „(Domyślna)” do pojedynczej klasy. Jeśli to zastosujesz, możesz wskazać wiele rozszerzeń plików na tę samą wartość klasy (np. Excel.Sheet.12), Którą wystarczy zmodyfikować tę klasę tylko raz za pomocą komunikatu DDE. Jeśli to zrobisz, należy również zmienić nazwę wszystkich reiteratów nazwy klasy w tej gałęzi rejestru. Jednak ten sposób nie jest zalecany, ponieważ może łatwo się zepsuć i należy to zrobić, jeśli chcesz zrobić wszystkie rozszerzenia plików, aby zaoszczędzić czas.

Sidenotes:

/oArgument jest argumentem dla adresów URL, więc nie jest to duży problem w utracie tej funkcji, gdyż rzadko jest przekazywana. Jeśli jednak chcesz, możesz spróbować pozostawić tę część argumentu włączoną podczas dostosowywania (Default)wartości.

Zastanawiam się nad stworzeniem tej wiki społeczności, ponieważ jest bardzo spekulacyjna i niedokończona (jeśli nie tylko Word i Excel). Proszę skomentować opinię na ten temat.


1

Oprócz doskonałej odpowiedzi @ El8tedN8te, zauważam, że w przypadku programu Excel nie trzeba modyfikować ddeexecklucza rejestru.

Wystarczy ustawić wartość (Default)przedmiotu na:

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

To dzięki moim testom gwarantuje, że zostanie uruchomione tylko jedno wystąpienie programu Excel.


W moim przypadku ta metoda nie zadziałała, nie zadziałała ani razu. Bardzo starałem się udowodnić, że się mylę. Zrestartowałem, dwukrotnie sprawdziłem, czy używam odpowiedniej nazwy i rozszerzenia klasy, przerzuciłem argumenty i zabiłem „C2R” .exe. W rzeczywistości było odwrotnie, nawet jeśli nie zostały otwarte jednocześnie, dodatkowy argument sprawił, że pozostały osobnymi instancjami, co potwierdza się tutaj: social.technet.microsoft.com/Forums/office/en-US/…
El8dN8

@ El8tedN8te: Nie wiem, jaka jest różnica między naszymi dwoma komputerami. Może w menu Plik> Opcje> Zaawansowane, w obszarze Ogólne opcja „Ignoruj ​​inne aplikacje korzystające z dynamicznej wymiany danych (DDE)”. Twój link potwierdza, że /ddepowinien wymusić pojedyncze wystąpienie.
harrymc

Nie wiem, czy byłem szalony, kiedy czytałem ten link ... ha ... ha ... Tak, sprawdziłem to ustawienie ... warto sprawdzić, dlaczego moje zachowanie zachowuje się inaczej. Jeśli mój komputer jest błędny, moje spekulacje są błędne. Czy mogę zapytać o twoją wersję biurową?
El8dN8,

@ El8tedN8te: Wersja 16.0.8625.2121.
harrymc

Na mojej maszynie też nie działa, podobnie jak @ El8tedN8te.
Rand Losowo

-1

Na tej stronie zgłoszono, że „ W programie Excel nie ma opcji zgodności MDI ”.

„MDI” oznacza interfejs wielu dokumentów i został zastąpiony przez SDI (interfejs pojedynczego dokumentu), dlatego nie ma błędu. W ten sposób działa teraz Excel.

Możesz przełączyć się przez skoroszyt, naciskając Ctrl+TABi, Ctrl+Shift+TABaby przejść do tyłu. Jeśli chcesz, możesz zainstalować aplikacje, które dodają tę funkcjonalność do całego pakietu Office. Sprawdź te dwie opcje:

Niestety nie mogę teraz przetestować tego oprogramowania.


To nie odpowiada na pytanie, ponieważ nawet podany link mówi, gdy otwierasz dwa arkusze programu Excel jeden po drugim: „Na karcie Procesy przewiń w dół, aż zobaczysz Excel.exe. Pamiętaj, że mimo otwarcia dwóch wystąpień programu Excel dwa skoroszyty są zawarte w tym samym pojedynczym wystąpieniu programu Excel. ” Sposób, w jaki OP tworzy dwie instancje (tą samą metodą co Microsoft), jest sprzeczny ze stwierdzeniem, że „w Excelu nie ma opcji kompatybilności MDI”, ponieważ pojawia się wiele interfejsów dokumentów (instancji), a nie w tej samej instancji, jaką ma być.
El8dN8,

Jak zauważył @ El8tedN8te, mówię o 2 instancjach (2 procesach), a nie o 2 oknach.
Rand Random,

Chciałbym poprawić mój wcześniejszy komentarz, podany cytat jest w rzeczywistości poprawny. Więc zignoruj ​​całe moje ostatnie zdanie ... mojego ostatniego komentarza. Byłem zarozumiały.
El8dN8,

W porządku, @ El8tedN8te. Zastanawiałem się, co było nie tak w cytacie
m2cit
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.