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:
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 Word
zastępując Word
oficjalną 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 x
odpowiadają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 OpenAsReadOnly
klucz 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ć command
wartoś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 regedit
przejdź 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 command
klucza, 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 ddeexec
utwó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:
/o
Argument 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.