Saya minta maaf jika saya mengulangi penjelasan saya di seluruh, tetapi saya menemukan masalah ini sangat kompleks sehingga saya mencoba untuk memastikannya secara kontekstual masuk akal untuk pembaca:
Meskipun mungkin tidak diketahui apakah ini bug atau memang dimaksudkan, kami dapat memaksanya untuk membuka dalam instance "sama" dengan menggunakan protokol Dynamic Data Exchange (DDE) dengan membuat pesan DDE alih-alih argumen keras "% 1 "menunjuk ke file untuk contoh itu untuk membuka saat mengeksekusi file. (Meskipun, DDE digunakan bahkan dengan argumen keras).
Pesan DDE, dalam hal ini, digunakan untuk memberi tahu program untuk membuka file. Untuk setiap file yang dieksekusi itu benar-benar membuat contoh baru setiap kali. Tetapi ketika protokol DDE digunakan, pertama-tama memeriksa apakah sebuah instance sudah dibuat dan jika demikian relay pesan DDE ke instance pertama ditemukan dan keluar sehingga memberikan ilusi bahwa semua file terbuka dalam satu instance karena instan.
Spekulasi
Masalah file yang dibuka dalam banyak contoh kemungkinan berkaitan dengan berapa banyak instance tunggal telah dimuat ketika instance lain sedang dipanggil. Kecenderungan antara perbedaan waktu eksekusi dari instance pertama dan kedua adalah ketika waktu antara eksekusi meningkat, cenderung menghasilkan satu instance dan ketika menurun cenderung menghasilkan dua instance. Ini menunjukkan bahwa instance pertama harus dimuat atau "siap" untuk membuka file baru dalam instance yang sama jika file lain dieksekusi, dan jika tidak, ia akan membuka file itu sendiri.
Tampaknya ketika jalur file digunakan sebagai argumen untuk program, tampaknya mengikuti tren ini hanya untuk:
Ketika digunakan sebagai argumen untuk membuat instance di luar instance pertama jika yang pertama siap (atau jika yang bukan yang pertama melihatnya siap), instance yang bukan yang pertama tampaknya dapat menyampaikan argumen sebagai pesan DDE ke yang pertama.
Namun, jika kita menjalankan program dan menggunakan pesan DDE untuk membuka file, sepertinya akan segera mengikuti protokol DDE apakah instance pertama siap menerima pesan DDE melalui argumen. Apakah instance pertama siap atau tidak kemungkinan tergantung apakah yang non-pertama melihat instance pertama sebagai siap, dan jika itu tidak akan mengirim pesan DDE ke yang pertama, yang tampaknya hanya terjadi ketika dibuka melalui argumen . Spekulasi orang yang tidak pertama melihat yang pertama sebagai "tidak siap" atau "tidak ada" disarankan oleh fakta bahwa pesan DDE (dari yang tidak pertama) diterima oleh yang pertama ketika: yang tidak pertama tidak dieksekusi melalui rangkaian argumen "% 1"; dan diperintahkan untuk membuka melalui pesan DDE.
Dengan demikian spekulasi saya adalah: kode untuk aplikasi ini menggunakan beberapa metode yang tidak jelas untuk menentukan apakah instance lain "siap" dan jika demikian maka akan menggunakan protokol DDE ketika argumen digunakan. Ini tampaknya menggunakan metode yang berbeda dari hanya ketika ia menerima protokol DDE untuk menentukan apakah akan mengirimnya ke contoh lain. Akan muncul efek pseudocode:
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();
}
}
Tidak ada cara untuk mengetahui apakah ini adalah bug atau itu dimaksudkan untuk menjadi tidak jelas karena suatu alasan, tanpa programmer memberitahu kami.
Resolusi
Kami ingin menyesuaikan eksekusi ekstensi file tertentu untuk tidak lagi mengirim path file ("% 1") dari file yang dieksekusi sebagai argumen, tetapi memberitahu program yang sedang dieksekusi untuk melakukan ke isi pesan DDE, di antaranya berisi permintaan untuk membuka file, yang akan menyampaikannya ke contoh yang sudah ada jika ada dan jika tidak menggunakannya sendiri. Yang secara spekulatif, akan mem-bypass persyaratan yang tidak jelas dari aplikasi ini untuk contoh lain agar dilihat sebagai "siap" jika argumen ke jalur file digunakan.
Ini semua ekstensi file yang terkait dengan kunci Class yang harus diganti dengan x
:
Untuk kata
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
Untuk 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
* Ekstensi file paling penting / umum yang harus dilakukan sebagai minimum. Subyektif.
Extensions Ekstensi file sekunder paling penting / umum yang harus dilakukan minimal. Subyektif.
Daftar ini dapat direplikasi melalui command-line: assoc | findstr Word
mengganti Word
dengan nama singkat resmi (peka huruf besar kecil).
Semua yang Anda miliki pilihan untuk dilakukan jika Anda merasa perlu. Jika semakin banyak yang ingin Anda lakukan, Anda mungkin ingin mengikuti langkah-langkah yang dapat saya berikan, yang akan mengurangi pekerjaan yang dibutuhkan.
Anda harus mengikuti instruksi berikut untuk setiap kunci registri di bawah ini menggantikan x
dengan Kelas yang sesuai pilihan Anda:
HKEY_CLASSES_ROOT\x\shell\Open
HKEY_CLASSES_ROOT\x\shell\OpenAsReadOnly
(Ex: HKEY_CLASSES_ROOT\Excel.Sheet.12\shell\Open
)
Sekali lagi, OpenAsReadOnly
kuncinya, dapat dipilih karena ini akan siap ketika file dieksekusi sedemikian rupa sehingga hanya bisa dibaca.
Tindakan pencegahan kecil - cadangan
Untuk paling mengingat apa nilai registri sebelum modifikasi, Anda mungkin ingin pergi ke klik kanan cabang kunci HKEY_CLASSES_ROOT
, dan di bawah menu konteks klik "Ekspor" dan simpan File Registrasi ke suatu lokasi. Jika Doc Brown mengatakan "Kita harus kembali," Anda bisa mengimpor kunci registri dengan menjalankannya dan mengikuti instruksi.
Atau, Anda juga dapat menjalankan ini sehingga Anda mengingat apa command
nilai dan nama Kelas untuk memperbaiki kesalahan kecil dengan:
assoc>>fileexts.txt
yang bisa disaring menggunakan type fileexts.txt | findstr Word
ftype>>classnames.txt
yang bisa disaring menggunakan type classnames.txt | findstr Word
Instruksi
Ini harus diikuti untuk setiap nilai kunci yang tercantum di atas, sesuai keinginan Anda.
Masukkan ke editor registri favorit Anda atau regedit
dan pergi ke Kelas yang ingin Anda modifikasi.
Masukkan ke dalam tombol yang disebut command
, klik kanan (Default)
nilainya, dan klik "Ubah" di bawah menu konteks.
Set saat ini harus apa yang dijalankan oleh ftype | findstr Word
Ubah untuk menghapus argumen langsung di akhir nilai, termasuk spasi, untuk menjadi:
"C:\Program Files\Microsoft Office\Root\Office16\EXCEL.EXE"
(Untuk Excel 64-bit)
"C:\Program Files\Microsoft Office\Root\Office16\WINWORD.EXE"
(Untuk Word 64-bit)
"C:\Program Files (x86)\Microsoft Office\Root\Office16\WINWORD.EXE"
(Untuk Word 32-bit)
"C:\Program Files (x86)\Microsoft Office\Root\Office16\EXCEL.EXE"
(Untuk Excel 32-bit)
Masukkan ke dalam kunci yang disebut ddeexec
(jika tidak ada, buat kunci) yang akan berada di samping command
kunci, klik kanan (Default)
nilainya, dan klik "Ubah" di bawah menu konteks, dan atur nilainya menjadi:
[REM _DDE_Direct][FileOpen("%1")]
- (Untuk Kata)
[open("%1")]
- (Untuk Excel)
Di bawahnya ddeexec
buat kunci baru yang disebut topic
(jika tidak ada), klik kanan (Default)
nilainya, dan klik "Ubah" di bawah menu konteks, dan tetapkan nilainya menjadi system
(jika belum ada).
Setelah modifikasi, Anda mungkin harus menyegarkan shell32.dll dengan menjalankan ini dengan Command Prompt atau shell yang ditinggikan setelah membuat perubahan ini ke registri:
regsvr32 /i shell32.dll
Ini telah diuji pada Windows 10 Office 2016 Versi 16.0.8625.2127
Jalan pintas alternatif
Anda juga dapat pergi ke kunci untuk ekstensi file (seperti HKEY_CLASSES_ROOT\.xlsx
) dan memodifikasi nilai "(Default)" ke kelas tunggal, pendekatan ini, jika diikuti, dapat mengarahkan beberapa ekstensi file ke nilai Kelas yang sama (seperti Excel.Sheet.12
) yang Anda hanya perlu memodifikasi kelas itu sekali dengan Pesan DDE. Jika Anda melakukan ini, Anda juga harus menamai ulang semua pengulangan nama kelas di dalam cabang registri itu. Namun, cara ini tidak disarankan, karena dapat dengan mudah dipatahkan, dan harus dilakukan jika Anda melakukan semua ekstensi file untuk menghemat waktu.
Sidenotes:
The /o
argumen argumen untuk URL, sehingga tidak menjadi perhatian besar dalam menurunkan fungsi ini karena jarang dilewatkan. Namun, jika Anda menginginkannya, Anda dapat mencoba dan membiarkan bagian argumen ini pada saat menyesuaikan (Default)
nilai.
Saya mempertimbangkan untuk menjadikan ini sebagai wiki komunitas, karena sangat spekulatif dan juga belum selesai (jika Word & Excel bukan satu-satunya). Berikan komentar tentang ini.