Beberapa contoh saat membuka beberapa Dokumen Office

9

Dimulai dengan Versi 16.0.8625.2121Office (diuji dengan Word dan Excel) - ketika Anda memilih beberapa dokumen di Explorer dan tekan Enter untuk membukanya, Anda akan berakhir dengan instance ke hitungan dokumen yang dipilih sebelumnya.

Untuk mereproduksi lakukan langkah-langkah berikut:

  • Buat 2 Buku Kerja Excel kosong di mana saja di mesin Anda
  • Pilih 2 file itu
  • Tekan Enter
  • Periksa Taskmanager dan Anda akan melihat 2 contoh Excel

Dalam versi yang lebih lama dari 16.0.8625.2121pada akhirnya hanya ada 1 instance.

Diuji dengan

  • 16.0.4266.1003 - Gambar lama yang kami miliki di sekitar daripada yang kami perbarui ke versi yang lebih baru

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

Diuji ulang langkah demi langkah dengan bangunan baru itu:

  • 16.0.8431.2094
  • 16.0.8431.2107
  • 16.0.8528.2139
  • 16.0.8528.2147

Sebelum yang jelas disebutkan, DisableMergeInstancetidak diatur.

Apakah itu "fitur" baru atau bug? Saya percaya ini bug.

Apakah ada jalan lain?

Informasi lebih lanjut:

Kami menguji perilaku ini dengan (selalu versi terbaru)

  • Windows 7 + Office 2016 - perilaku buruk terjadi
  • Windows 10 + Office 2016 - perilaku buruk terjadi

Juga memeriksa Versi Office yang lebih lama untuk memastikan bahwa ini adalah Office 2016 Thing

  • Windows 8 + Office 2013 - tidak terjadi
  • Windows 7 + Office 2010 - tidak terjadi
  • Windows 10 + Office 2010 - tidak terjadi
  • Windows 10 + Office 2013 - tidak terjadi
Rand Acak
sumber

Jawaban:

6

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:

  • Word 2016
  • Excel 2016

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 Wordmengganti Worddengan 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 xdengan 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, OpenAsReadOnlykuncinya, 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 commandnilai 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 regeditdan 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 commandkunci, 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 ddeexecbuat 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 /oargumen 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.

El8dN8
sumber
1

Selain jawaban yang sangat baik oleh @ El8tedN8te, saya berkomentar bahwa untuk Excel tidak perlu memodifikasi ddeexeckunci registri.

Cukup untuk mengatur nilai (Default)item ke:

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

Ini oleh pengujian saya memastikan bahwa hanya satu contoh Excel dieksekusi.

harrymc
sumber
Pada saya, metode ini tidak berhasil tetapi tidak berjalan dalam satu contoh. Saya berusaha cukup keras untuk membuktikan diri saya salah. Saya memulai kembali, memeriksa dua kali saya menggunakan nama dan ekstensi Kelas yang tepat, flip-menjatuhkan argumen Anda, dan membunuh "C2R" .exe. Bahkan melakukan sebaliknya, bahkan jika mereka tidak dibuka secara bersamaan, argumen tambahan membuat mereka tinggal contoh yang terpisah, yang diakui di sini: social.technet.microsoft.com/Forums/office/en-US/...
El8dN8
@ El8tedN8te: Saya tidak tahu apa perbedaan antara dua komputer kami. Mungkin di menu File> Options> Advanced, di bawah General, opsi "Abaikan aplikasi lain yang menggunakan Dynamic Data Exchange (DDE)". Tautan Anda mengonfirmasi bahwa /ddeharus memaksa satu instance.
harrymc
Saya tidak tahu apakah saya serius ketika saya membaca tautan itu ... ha ... ha ... Ya, saya memeriksa pengaturan itu ... layak untuk melihat mengapa perilaku saya berbeda. Jika PC saya salah, spekulasi saya salah. Bolehkah saya bertanya, versi kantor Anda?
El8dN8
@ El8tedN8te: Versi 16.0.8625.2121.
harrymc
Di komputer saya ini juga tidak berfungsi, seperti @ El8tedN8te.
Rand Random
-1

Dalam hal ini halaman ini melaporkan bahwa " Tidak ada pilihan kompatibilitas MDI di Excel. "

"MDI" adalah singkatan dari Multiple Document Interface , dan telah digantikan oleh SDI (Single Document Interface), oleh karena itu tidak ada bug. Ini adalah cara di mana Excel sekarang berfungsi.

Apa yang dapat Anda lakukan adalah menggilir buku kerja dengan menekan Ctrl+TAB, dan Ctrl+Shift+TABuntuk siklus mundur. Jika mau, Anda dapat menginstal aplikasi yang menambahkan fungsi ini ke seluruh paket Office. Periksa dua opsi ini:

Sayangnya saya tidak dapat menguji perangkat lunak ini sekarang.

m2cit
sumber
Ini tidak menjawab pertanyaan karena bahkan tautan yang Anda berikan mengatakan ketika Anda membuka dua lembar kerja excel satu demi satu, "Pada tab Proses gulir ke bawah hingga Anda melihat Excel.exe. Ketahuilah bahwa meskipun Anda membuka dua kemunculan Excel, dua buku kerja terkandung dalam instance Excel yang sama. " Cara OP membuat dua instance (dengan metode yang sama dengan Microsoft) bertentangan dengan pernyataan bahwa "tidak ada opsi kompatibilitas MDI di Excel" karena beberapa antarmuka dokumen (instance) muncul, tidak dalam instance yang sama dengan yang seharusnya.
El8dN8
Sebagai @ El8tedN8te menunjukkan saya berbicara tentang 2 instance (2 proses) dan bukan 2 windows.
Rand Random
Saya ingin mengoreksi komentar saya sebelumnya, kutipan yang diberikan sebenarnya benar. Jadi abaikan seluruh kalimat terakhir saya ... dari komentar terakhir saya. Saya menjadi lancang.
El8dN8
Tidak apa-apa, @ El8tedN8te. Saya bertanya-tanya apa yang salah dalam kutipan
m2cit