หลายอินสแตนซ์เมื่อเปิดเอกสาร Office หลายชุด


9

เริ่มต้นด้วยรุ่น16.0.8625.2121Office (ทดสอบกับ Word และ Excel) - เมื่อคุณเลือกเอกสารหลายรายการใน Explorer และกด Enter เพื่อเปิดเอกสารคุณจะจบลงด้วยอินสแตนซ์สำหรับการนับเอกสารที่เลือกก่อนหน้า

ในการทำซ้ำให้ทำตามขั้นตอนต่อไปนี้:

  • สร้างเวิร์กบุ๊ก Excel ว่างเปล่า 2 แห่งที่ใดก็ได้บนเครื่องของคุณ
  • เลือก 2 ไฟล์เหล่านั้น
  • กด Enter
  • ตรวจสอบ Taskmanager และคุณจะเห็น 2 อินสแตนซ์ของ Excel

ในรุ่นก่อนหน้านี้มากกว่าที่16.0.8625.2121คุณจะจบลงด้วย 1 อินสแตนซ์เท่านั้น

ทดสอบกับ

  • 16.0.4266.1003 - ภาพเก่าสวย ๆ ที่เรามีกว่าที่เราอัปเดตเป็นเวอร์ชันใหม่กว่าด้วย

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

ทดสอบทีละขั้นตอนกับงานสร้างใหม่เหล่านั้น:

  • 16.0.8431.2094
  • 16.0.8431.2107
  • 16.0.8528.2139
  • 16.0.8528.2147

ก่อนที่จะมีการกล่าวถึงที่ชัดเจนDisableMergeInstanceไม่ได้ตั้งค่า

นั่นคือ "คุณสมบัติ" ใหม่หรือข้อบกพร่อง? ฉันเชื่อว่ามันเป็นข้อผิดพลาด

มีวิธีแก้ไขไหม?

ข้อมูลเพิ่มเติม:

เราทดสอบพฤติกรรมนี้ด้วย (เวอร์ชันล่าสุดเสมอ)

  • Windows 7 + Office 2016 - ความผิดพลาดเกิดขึ้น
  • Windows 10 + Office 2016 - ความผิดพลาดเกิดขึ้น

ตรวจสอบเวอร์ชั่น Office ที่เก่ากว่าด้วยเพื่อให้แน่ใจว่านี่เป็นสิ่งที่ Office 2016

  • Windows 8 + Office 2013 - ไม่เกิดขึ้น
  • Windows 7 + Office 2010 - ไม่เกิดขึ้น
  • Windows 10 + Office 2010 - ไม่เกิดขึ้น
  • Windows 10 + Office 2013 - ไม่เกิดขึ้น

คำตอบ:


6

ฉันขอโทษถ้าฉันย้ำคำอธิบายของฉันตลอด แต่ฉันพบว่าปัญหานี้ซับซ้อนมากดังนั้นฉันจึงพยายามที่จะทำให้แน่ใจว่าผู้อ่านมีบริบท:

แม้ว่ามันอาจไม่เป็นที่รู้จักว่านี่เป็นข้อผิดพลาดหรือตั้งใจให้เราสามารถบังคับให้เปิดในอินสแตนซ์ "เดียวกัน" โดยใช้โปรโตคอลการแลกเปลี่ยนข้อมูลแบบไดนามิก (DDE) โดยการสร้างข้อความ DDE แทนการโต้แย้งอย่างหนัก "% 1 "ชี้ไปที่ไฟล์เพื่อเปิดอินสแตนซ์นั้นเมื่อเรียกใช้งานไฟล์ (แม้ว่า DDE จะถูกใช้แม้กับอาร์กิวเมนต์ที่ยาก)

ข้อความ DDE ในกรณีนี้ใช้เพื่อบอกโปรแกรมให้เปิดไฟล์ สำหรับทุกไฟล์ที่ดำเนินการมันจะสร้างอินสแตนซ์ใหม่ทุกครั้ง แต่เมื่อใช้โปรโตคอล DDE มันจะตรวจสอบก่อนว่ามีการสร้างอินสแตนซ์หรือไม่และหากเป็นเช่นนั้นจะรีเลย์ข้อความ DDE ไปที่อินสแตนซ์แรกที่พบและออกจากจึงให้ภาพลวงตาว่าไฟล์ทั้งหมดเปิดในอินสแตนซ์เดียว

การคาดเดา

ปัญหาของการเปิดไฟล์ในอินสแตนซ์หลายรายการน่าจะเกี่ยวข้องกับจำนวนอินสแตนซ์เดียวที่โหลดแล้วเมื่อมีการเรียกอินสแตนซ์อื่น แนวโน้มระหว่างความแตกต่างของเวลาดำเนินการของอินสแตนซ์แรกที่สองคือเวลาที่อยู่ระหว่างการดำเนินการเพิ่มขึ้นมีแนวโน้มที่จะให้อินสแตนซ์เดียวและลดลงซึ่งมีแนวโน้มที่จะให้ผลลัพธ์สองอินสแตนซ์ สิ่งนี้ชี้ให้เห็นว่าจะต้องโหลดอินสแตนซ์แรกหรือ "พร้อม" เพื่อเปิดไฟล์ใหม่ในอินสแตนซ์เดียวกันหากมีการเรียกใช้งานไฟล์อื่นและหากไม่ใช่จะเป็นการเปิดไฟล์ด้วยตัวเอง

ดูเหมือนว่าเมื่อใช้พา ธ ไฟล์เป็นอาร์กิวเมนต์ของโปรแกรมดูเหมือนว่าจะเป็นไปตามแนวโน้มนี้เพียง:

  • Word 2016
  • Excel 2016

เมื่อใช้เป็นอาร์กิวเมนต์สำหรับการสร้างอินสแตนซ์เกินกว่าอินสแตนซ์แรกถ้าแรกพร้อม (หรือถ้าไม่ใช่คนแรกเห็นว่าพร้อม), อินสแตนซ์ที่ไม่ใช่คนแรกดูเหมือนว่าจะสามารถถ่ายทอดอาร์กิวเมนต์เป็นข้อความ DDE ไปที่แรก

อย่างไรก็ตามหากเรารันโปรแกรมและใช้ข้อความ DDE เพื่อเปิดไฟล์ดูเหมือนว่าจะทำตามโปรโตคอล DDE ทันทีว่าอินสแตนซ์แรกพร้อมที่จะรับข้อความ DDE ผ่านการโต้แย้งหรือไม่ ไม่ว่าอินสแตนซ์แรกจะพร้อมหรือไม่นั้นขึ้นอยู่กับว่าผู้ที่ไม่ได้เห็นอินสแตนซ์แรกนั้นพร้อมหรือไม่และจะไม่ส่งข้อความ DDE ไปที่แรกซึ่งดูเหมือนว่าจะเกิดขึ้นเฉพาะเมื่อมันเปิดผ่านการโต้แย้ง . การคาดเดาของผู้ที่ไม่ใช่คนแรกที่เห็นเป็นคนแรกที่ "ไม่พร้อม" หรือ "ไม่มีอยู่จริง" ได้รับการแนะนำโดยข้อเท็จจริงที่ว่าข้อความ DDE (จากคนที่ไม่ใช่คนแรก) ได้รับการยอมรับโดยคนแรกเมื่อ: ไม่ใช่คนแรก การเชื่อมอาร์กิวเมนต์เข้าด้วยกัน "% 1"; และมันบอกให้เปิดผ่านข้อความ DDE

เช่นการเก็งกำไรของฉันคือ: รหัสสำหรับการใช้งานเหล่านี้ใช้วิธีการปิดบังบางอย่างสำหรับการตรวจสอบว่าอินสแตนซ์อื่น "พร้อม" และถ้าเป็นเช่นนั้นจะใช้โปรโตคอล DDE เมื่อมีการโต้แย้ง ดูเหมือนว่าจะใช้วิธีการอื่นที่ต่างจากเมื่อได้รับโปรโตคอล DDE เพื่อพิจารณาว่าจะส่งไปยังอินสแตนซ์อื่นหรือไม่ มันจะปรากฏขึ้นในความเป็นจริง 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();
    }
}

ไม่มีทางที่จะบอกได้ว่านี่เป็นข้อผิดพลาดหรือตั้งใจจะคลุมเครือด้วยเหตุผลโดยที่โปรแกรมเมอร์ไม่แจ้งเรา

ความละเอียด

เราต้องการปรับการดำเนินการของนามสกุลไฟล์บางอย่างเพื่อไม่ให้ส่งพา ธ ไฟล์ ("% 1") ของไฟล์ที่ถูกเรียกใช้เป็นอาร์กิวเมนต์ แต่บอกให้โปรแกรมดำเนินการเพื่อให้ตรงกับเนื้อหาของข้อความ DDE มีคำร้องขอให้เปิดไฟล์ซึ่งจะถ่ายทอดไปยังอินสแตนซ์ที่มีอยู่แล้วหากมีอยู่และหากไม่ได้ใช้มันเอง ซึ่ง speculatively จะข้ามข้อกำหนดที่คลุมเครือของแอปพลิเคชันเหล่านี้เพื่อให้อินสแตนซ์อื่นถูกมองว่า "พร้อม" หากมีการใช้อาร์กิวเมนต์ไปยังพา ธ ของไฟล์

นี่คือนามสกุลไฟล์ทั้งหมดที่สัมพันธ์กับคีย์คลาสซึ่งจะถูกแทนที่ด้วยx:

สำหรับ 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

สำหรับ 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

* นามสกุลไฟล์ที่สำคัญ / ทั่วไปที่ควรทำอย่างน้อยที่สุด อัตนัย

extensions นามสกุลไฟล์ที่สำคัญที่สุด / รองทั่วไปที่ควรทำอย่างน้อยที่สุด อัตนัย

รายการเหล่านี้สามารถทำซ้ำผ่าน command-line: assoc | findstr Wordแทนที่Wordด้วยชื่อที่สั้นลงอย่างเป็นทางการ

ทั้งหมดที่คุณมีตัวเลือกที่จะทำถ้าคุณรู้สึกว่ามันจำเป็น หากคุณต้องการทำมากกว่านี้คุณอาจต้องการทำตามขั้นตอนที่เป็นทางเลือกซึ่งฉันจะให้ซึ่งควรลดงานที่จำเป็น

คุณจะต้องปฏิบัติตามคำแนะนำต่อไปนี้สำหรับรีจิสตรีคีย์ทั้งหมดด้านล่างแทนที่xคลาสที่เกี่ยวข้องที่คุณเลือก:

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

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

อีกครั้งที่OpenAsReadOnlyสำคัญคือตัวเลือกนี้จะพร้อมเมื่อไฟล์ถูกดำเนินการดังกล่าวว่ามันจะเป็นแบบอ่านอย่างเดียว

ข้อควรระวังเล็ก ๆ - การสำรองข้อมูล

เพื่อให้จำได้ดีที่สุดว่าค่ารีจิสตรี้นั้นคืออะไรก่อนการปรับเปลี่ยนคุณอาจต้องการคลิกขวาที่สาขาหลักHKEY_CLASSES_ROOTและภายใต้เมนูบริบทให้คลิก "ส่งออก" และบันทึกไฟล์ลงทะเบียนไปยังตำแหน่ง ในกรณีที่ Doc Brown บอกว่า "เราต้องย้อนกลับไป" คุณสามารถนำเข้ารีจิสตรีคีย์ได้โดยดำเนินการและทำตามคำแนะนำ

นอกจากนี้คุณยังสามารถเรียกใช้สิ่งนี้เพื่อให้คุณจำได้ว่าcommandค่าและชื่อชั้นคือการแก้ไขข้อผิดพลาดเล็ก ๆ ด้วย:

assoc>>fileexts.txt ซึ่งสามารถกรองโดยใช้ type fileexts.txt | findstr Word

ftype>>classnames.txt ซึ่งสามารถกรองโดยใช้ type classnames.txt | findstr Word

คำแนะนำ

สิ่งเหล่านี้จะถูกติดตามสำหรับทุกค่านิยมที่ระบุไว้ข้างต้นตามที่คุณต้องการ

เข้าสู่ตัวแก้ไขรีจิสทรีที่คุณชื่นชอบหรือregeditไปที่กลุ่มที่คุณต้องการแก้ไข

ป้อนรหัสที่เรียกว่าcommandคลิกขวาที่(Default)ค่าแล้วคลิก "แก้ไข" ใต้เมนูบริบท

ชุดปัจจุบันควรเป็นสิ่งที่ถูกดำเนินการโดย ftype | findstr Word

เปลี่ยนเป็นลบการขัดแย้งโดยตรงที่ส่วนท้ายของค่ารวมถึงช่องว่างที่จะกลายเป็น:

  • "C:\Program Files\Microsoft Office\Root\Office16\EXCEL.EXE"
    (สำหรับ Excel 64 บิต)
  • "C:\Program Files\Microsoft Office\Root\Office16\WINWORD.EXE"
    (สำหรับ Word 64 บิต)
  • "C:\Program Files (x86)\Microsoft Office\Root\Office16\WINWORD.EXE"
    (สำหรับ Word 32 บิต)
  • "C:\Program Files (x86)\Microsoft Office\Root\Office16\EXCEL.EXE"
    (สำหรับ Excel 32 บิต)

ป้อนรหัสที่เรียกว่าddeexec(หากไม่มีอยู่ให้สร้างคีย์) ซึ่งจะอยู่ด้านข้างcommandคีย์คลิกขวาที่(Default)ค่าแล้วคลิก "แก้ไข" ใต้เมนูบริบทและตั้งค่าเป็น:

  • [REM _DDE_Direct][FileOpen("%1")] - (สำหรับ Word)
  • [open("%1")] - (สำหรับ Excel)

ภายใต้ddeexecสร้างคีย์ใหม่ที่เรียกว่าtopic(หากไม่มี) ให้คลิกขวาที่(Default)ค่าแล้วคลิก "แก้ไข" ใต้เมนูบริบทและตั้งค่าเป็นsystem(ถ้ายังไม่ได้ดำเนินการ)

หลังจากการแก้ไขคุณอาจต้องรีเฟรช shell32.dll ด้วยการรันคำสั่งนี้พร้อมรับคำสั่งหรือเชลล์หลังจากสร้างการเปลี่ยนแปลงเหล่านี้ในรีจิสตรี:

regsvr32 /i shell32.dll

สิ่งนี้ได้รับการทดสอบบน Windows 10 Office 2016 เวอร์ชัน 16.0.8625.2127

ทางลัดอื่น ๆ

คุณยังสามารถไปที่ปุ่มสำหรับนามสกุลไฟล์ (เช่นHKEY_CLASSES_ROOT\.xlsx) และปรับเปลี่ยนค่า "(ค่าเริ่มต้น)" เป็นคลาสเอกพจน์วิธีการนี้หากปฏิบัติตามสามารถชี้ส่วนขยายไฟล์หลายไฟล์ไปเป็นค่าระดับชั้นเดียวกัน (เช่นExcel.Sheet.12) ที่คุณ ต้องแก้ไขคลาสนั้นเพียงครั้งเดียวด้วยข้อความ DDE หากคุณทำสิ่งนี้ควรตั้งชื่อ reiterations ทั้งหมดของชื่อ Class ภายในสาขารีจิสตรีนั้น อย่างไรก็ตามไม่แนะนำวิธีนี้เนื่องจากอาจทำให้แตกได้ง่ายและควรทำหากคุณต้องทำนามสกุลไฟล์ทั้งหมดเพื่อประหยัดเวลา

Sidenotes:

/oอาร์กิวเมนต์เป็นอาร์กิวเมนต์สำหรับ URL จึงไม่ได้เป็นกังวลใหญ่ในการสูญเสียการทำงานนี้มันไม่ค่อยจะถูกส่ง อย่างไรก็ตามหากคุณต้องการคุณสามารถลองและปล่อยให้ส่วนนี้ของอาร์กิวเมนต์เกิดขึ้นเมื่อทำการปรับ(Default)ค่า

ฉันกำลังพิจารณาที่จะทำให้ชุมชนนี้เป็นวิกิเนื่องจากมันเป็นการเก็งกำไรมากและยังไม่เสร็จ (ถ้า Word & Excel ไม่ใช่คนเดียว) กรุณาแสดงความคิดเห็นความคิดเห็นเกี่ยวกับเรื่องนี้


1

นอกจากคำตอบที่ยอดเยี่ยมโดย @ El8tedN8te ฉันสังเกตว่าสำหรับ Excel ไม่จำเป็นต้องแก้ไขddeexecคีย์รีจิสทรี

การตั้งค่าของ(Default)รายการเป็น:

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

สิ่งนี้โดยการทดสอบของฉันทำให้มั่นใจได้ว่ามีการใช้งาน Excel อินสแตนซ์เดียวเท่านั้น


สำหรับฉันวิธีนี้ใช้ไม่ได้กับประโยชน์ใด ๆ มันไม่ได้ทำงานในอินสแตนซ์เดียว ฉันพยายามอย่างหนักเพื่อพิสูจน์ว่าตัวเองผิด ฉันเริ่มต้นใหม่อีกครั้งตรวจสอบอีกครั้งว่าฉันใช้ชื่อคลาสและส่วนขยายที่ถูกต้องพลิกข้อโต้แย้งของคุณและฆ่า "C2R" .exe ในความเป็นจริงแล้วตรงกันข้ามแม้ว่าพวกเขาจะไม่ได้เปิดพร้อมกันอาร์กิวเมนต์พิเศษทำให้พวกเขาอยู่แยกอินสแตนซ์ซึ่งเป็นที่ยอมรับที่นี่: social.technet.microsoft.com/Forums/office/en-US/ …
El8dN8

@ El8tedN8te: ฉันไม่รู้ว่าความแตกต่างระหว่างคอมพิวเตอร์สองเครื่องของเราคืออะไร อาจอยู่ในเมนูไฟล์> ตัวเลือก> ขั้นสูงภายใต้ทั่วไปตัวเลือก "ละเว้นแอปพลิเคชันอื่น ๆ ที่ใช้ Dynamic Data Exchange (DDE)" ลิงก์ของคุณยืนยันว่า/ddeควรบังคับอินสแตนซ์เดียว
harrymc

ฉันไม่รู้ว่าฉันอ่อนเพลียหรือเปล่าเมื่อฉันอ่านลิงค์นั้น ... ฮ่า ๆ ... ฮ่า ... ใช่ฉันตรวจสอบการตั้งค่านั้น ... คุ้มค่าที่จะดูว่าทำไมตัวฉันถึงทำงานต่างออกไป หากพีซีของฉันผิดการเก็งกำไรของฉันก็ผิด ฉันขอถามรุ่นออฟฟิศของคุณได้ไหม
El8dN8

@ El8tedN8te: เวอร์ชัน 16.0.8625.2121
harrymc

บนเครื่องของฉันมันยังไม่ทำงานเหมือน @ El8tedN8te
แรนด์สุ่ม

-1

ในหน้านี้มีรายงานว่า " ไม่มีตัวเลือกความเข้ากันได้กับ MDI ใน Excel "

"MDI" ย่อมาจากMultiple Document Interfaceและถูกแทนที่ด้วย SDI (Single Document Interface) ดังนั้นจึงไม่มีข้อผิดพลาด นี่คือวิธีที่ Excel ใช้งานได้ในขณะนี้

สิ่งที่คุณสามารถทำได้คือหมุนเวียนไปตามเวิร์กบุ๊กโดยกดCtrl+TABและCtrl+Shift+TABหมุนไปข้างหลัง หากคุณต้องการคุณสามารถติดตั้งแอปพลิเคชั่นที่เพิ่มฟังก์ชั่นนี้ไปยังชุดโปรแกรม Office ทั้งหมด ตรวจสอบสองตัวเลือกเหล่านี้:

น่าเสียดายที่ฉันไม่สามารถทดสอบซอฟต์แวร์เหล่านี้ได้ในขณะนี้


สิ่งนี้ไม่ตอบคำถามเพราะแม้กระทั่งลิงก์ที่คุณระบุจะบอกว่าเมื่อคุณเปิดแผ่นงาน Excel สองแผ่นทีละรายการ "บนแท็บกระบวนการเลื่อนลงจนกว่าคุณจะเห็น Excel.exe โปรดทราบว่าแม้ว่าคุณจะเปิด Excel สองครั้ง สมุดงานสองเล่มมีอยู่ในอินสแตนซ์เดียวของ Excel " วิธีที่ OP สร้างสองอินสแตนซ์ (ด้วยวิธีเดียวกันกับของ Microsoft) ขัดแย้งกับคำสั่งที่ว่า "ไม่มีตัวเลือกความเข้ากันได้กับ MDI ใน Excel" เนื่องจากเอกสารอินเทอร์เฟซ (อินสแตนซ์) หลายรายการไม่ปรากฏภายในอินสแตนซ์เดียวกัน
El8dN8

ดังที่ @ El8tedN8te ชี้ให้เห็นว่าฉันกำลังพูดถึง 2 อินสแตนซ์ (2 โพรเซส) ไม่ใช่ 2 windows
แรนด์สุ่ม

ฉันต้องการแก้ไขความคิดเห็นก่อนหน้าของฉันราคาที่ระบุนั้นถูกต้องจริง ดังนั้นไม่ต้องสนใจประโยคสุดท้ายทั้งหมดของฉัน ... จากความคิดเห็นล่าสุดของฉัน ฉันถูกเกรงใจ
El8dN8

ไม่เป็นไร @ El8tedN8te ฉันสงสัยว่ามีอะไรผิดปกติในใบเสนอราคา
m2cit
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.