複数のOfficeドキュメントを開いたときの複数のインスタンス


9

16.0.8625.2121Officeのバージョンから開始(WordおよびExcelでテスト済み)-エクスプローラーで複数のドキュメントを選択し、Enterキーを押してそれらを開くと、前回選択したドキュメントの数までインスタンスが表示されます。

再現するには、次の手順を実行します。

  • マシン上の任意の場所に2つの空のExcelワークブックを作成します
  • それらの2つのファイルを選択します
  • Enterキーを押す
  • タスクマネージャーを確認すると、Excelの2つのインスタンスが表示されます。

以前のバージョンでは、16.0.8625.21211つのインスタンスしかありませんでした。

テスト済み

  • 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メッセージを作成することで、Dynamic Data Exchangeプロトコル(DDE)を使用して、「同じ」インスタンスで強制的に開くことができます。 1 "は、そのインスタンスがファイルの実行時に開くファイルを指します。(ただし、DDEはハード引数でも使用されます)。

この場合、DDEメッセージは、プログラムにファイルを開くように指示するために使用されます。実行されるすべてのファイルに対して、実際には毎回新しいインスタンスが作成されます。しかし、DDEプロトコルが使用されると、最初にインスタンスがすでに作成されているかどうかが調べられ、作成されている場合は、見つかった最初のインスタンスにDDEメッセージが中継されて終了するため、すべてのファイルが単一インスタンスで瞬時に開かれているように見えます。

憶測

複数のインスタンスで開かれるファイルの問題は、別のインスタンスが呼び出されているときに単一のインスタンスがすでにロードされている量に関係している可能性があります。最初のインスタンスと2番目のインスタンスの実行時間の差の傾向は、実行間の時間が増加すると1つのインスタンスを生成する傾向があり、減少すると2つのインスタンスを生成する傾向があります。これは、別のファイルが実行された場合、同じインスタンスで新しいファイルを開くには、最初のインスタンスをロードするか「準備」する必要があり、そうでない場合はそれ自体でファイルを開くことを示唆しています。

ファイルパスがプログラムの引数として使用される場合、この傾向に従うだけのようです。

  • Word 2016
  • エクセル2016

最初のインスタンスが準備ができている場合(または、最初でないインスタンスが準備ができていることを確認した場合)、最初のインスタンスを超えてインスタンスを作成するための引数として使用すると、最初でないインスタンスは、引数をDDEメッセージとして最初のインスタンスにリレーできるようです。

ただし、プログラムを実行し、DDEメッセージを使用してファイルを開くと、最初のインスタンスが引数を介してDDEメッセージを受け入れる準備ができているかどうかに関係なく、すぐにDDEプロトコルに従うようです。最初のインスタンスの準備ができているかどうかは、非最初のインスタンスが最初のインスタンスを準備ができていると見なし、そうでない場合、最初のインスタンスにDDEメッセージを送信しません。これは、引数を介して開いたときにのみ発生するようです。 。「最初」が「準備完了」または「存在しない」と見なされていない最初の推測は、DDEメッセージ(最初からではない)が最初に受け入れられるという事実によって示唆されています。引数の連結 "%1"; DDEメッセージで開くように指示されます。

そのため、私の推測は次のとおりです。これらのアプリケーションのコードは、別のインスタンスが「準備完了」であるかどうかを判断するために不明瞭な方法を使用します。これは、別のインスタンスに送信するかどうかを決定するためにDDEプロトコルを受信するときとは異なる方法を使用しているようです。実際には、疑似コードは次のようになります。

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メッセージの内容を実行するよう指示します。ファイルを開くためのリクエストが含まれています。ファイルが存在する場合、既存のインスタンスに中継し、それを使用しない場合はそれを使用します。投機的には、ファイルパスへの引数が使用されている場合、別のインスタンスが「準備完了」と見なされるように、これらのアプリケーションのあいまいな要件をバイパスします。

これらはすべて、以下で置き換えられるクラスキーに関連付けられたファイル拡張子です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

*最低限必要な最も重要な/共通のファイル拡張子。主観的。

†最低限必要な二次的な最も重要な/共通のファイル拡張子。主観的。

これらのリストはコマンドラインで複製できます。正式な短縮名(大文字と小文字が区別されます)にassoc | findstr Word置き換えWordます。

あなたがそれが必要だと感じた場合、あなたはそうすることができるすべてを持っています。より多くのことをしたい場合は、私が提供するオプションの手順に従うことをお勧めします。これにより、必要な作業が削減されます。

以下のすべてのレジストリキーについて、次の手順に従って、x選択したクラスを対応するクラスに置き換えます。

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

(例: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メッセージでそのクラスを一度変更するだけで済みます。これを行う場合は、そのレジストリブランチ内のクラス名のすべての繰り返しの名前も変更する必要があります。ただし、この方法は簡単に壊れる可能性があるためお勧めできません。時間を節約するためにすべてのファイル拡張子を使用する場合は、この方法を実行する必要があります。

傍注:

/o引数には、URLの引数であるので、それはほとんど渡されないよう、この機能を失うことは大きな問題ではありません。ただし、必要に応じて、(Default)値を調整するときに、引数のこの部分をそのままにしておくことができます。

これは非常に投機的で未完成であるため(WordとExcelだけではなかった場合)、これをコミュニティーWikiにすることを検討しています。これについての意見をコメントしてください。


1

@ El8tedN8teによる優れた回答に加えて、Excelの場合、ddeexecレジストリキーを変更する必要はありません。

(Default)アイテムの値を次のように設定するだけで十分です。

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

私のテストでは、これによりExcelのインスタンスが1つだけ実行されることが保証されます。


私の場合、このメソッドは機能せず、単一のインスタンスでは実行されませんでした。私は自分が間違っていることを証明するために一生懸命努力しました。私は再起動し、正しいクラス名と拡張子を使用しているかを再確認し、引数をフリップフロップし、 "C2R" .exeを強制終了しました。実際、反対のことが行われました。たとえ同時に開かれていなくても、追加の引数により、それらは別々のインスタンスのままでし
Forums

@ El8tedN8te:2台のコンピューターの違いがわかりません。多分メニューの[ファイル]> [オプション]> [詳細設定]で、[全般]の下にある[Dynamic Data Exchange(DDE)を使用する他のアプリケーションを無視する]オプションを選択してください。リンク/ddeは、単一のインスタンスを強制する必要があることを確認します。
harrymc

私がそのリンクを読んだとき、私が真剣であったかどうかわかりません... ha ... ha ...はい、私はその設定をチェックしました...私の行動がなぜ違うのかを調査する価値があります。私のPCが間違っている場合、私の推測は間違っています。お願いします、あなたのオフィスバージョン?
El8dN8 2017年

@ El8tedN8te:バージョン16.0.8625.2121。
harrymc

私のマシンでは、@ El8tedN8teと同じように機能しません。
ランダムランダム

-1

、このページ「ことが報告されているエクセルにはMDIの互換性オプションはありません。

「MDI」はMultiple Document Interfaceの略で、SDI(Single Document Interface)に置き換えられているため、バグはありません。これがExcelの動作方法です。

できることはCtrl+TAB、を押してブックCtrl+Shift+TABを循環し、逆方向に循環することです。必要に応じて、この機能をOfficeスイート全体に追加するアプリケーションをインストールできます。次の2つのオプションを確認してください。

残念ながら、現在これらのソフトウェアをテストすることはできません。


提供したリンクでも、2つのExcelワークシートを次々に開くと、「プロセスタブでExcel.exeが表示されるまで下にスクロールします。Excelを2回開いたとしても、 2つのブックがExcelの同じ単一のインスタンスに含まれています。」OPが2つのインスタンスを(Microsoftと同じ方法で)作成する方法は、「ExcelにはMDI互換性オプションがない」という記述と矛盾します。これは、想定されている同じインスタンス内ではなく、複数のドキュメントインターフェイス(インスタンス)が表示されるためです。
El8dN8 2017年

@ El8tedN8teが指摘したように、私は2つのウィンドウではなく2つのインスタンス(2つのプロセス)について話しています。
ランダムランダム

以前のコメントを訂正したいのですが、提供された見積もりは実際には正しいものです。ですから、私の最後のコメントはすべて無視してください。ばかげていた。
El8dN8 2017年

大丈夫です、@ El8tedN8te。見積もりの​​どこが間違っていたのか疑問に思いました
m2cit 2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.