내내 설명을 반복하면 사과하지만이 문제는 매우 복잡하여 독자에게 상황에 맞는지 확인하려고 노력했습니다.
이것이 버그인지 또는 의도 된 것인지는 알 수 없지만, "%"인수 대신 DDE 메시지를 작성하여 DDE (Dynamic Data Exchange Protocol)를 사용하여 "동일한"인스턴스에서 강제로 열 수 있습니다. 1 "은 파일을 실행할 때 열리는 해당 인스턴스의 파일을 가리 킵니다. (단, DDE는 어려운 논증에도 사용됩니다).
이 경우 DDE 메시지는 프로그램에게 파일을 열도록 지시하는 데 사용됩니다. 모든 파일이 실행될 때마다 매번 새로운 인스턴스가 생성됩니다. 그러나 DDE 프로토콜을 사용하는 경우 먼저 인스턴스가 이미 작성되어 있는지 확인하고, 발견 된 경우 발견 된 첫 번째 인스턴스에 DDE 메시지를 중계하고 종료하므로 모든 파일이 즉시 단일 인스턴스에서 열리라는 착각을줍니다.
투기
다중 인스턴스에서 파일을 여는 문제는 다른 인스턴스가 호출 될 때 단일 인스턴스가 이미로드 한 양과 관련이있을 수 있습니다. 첫 번째와 두 번째 인스턴스의 실행 시간 차이 사이의 추세는 실행 사이의 시간이 증가함에 따라 단일 인스턴스를 생성하는 경향이 있고 감소함에 따라 두 개의 인스턴스를 생성하는 경향이 있습니다. 즉, 다른 파일이 실행 된 경우 동일한 인스턴스에서 새 파일을 열려면 첫 번째 인스턴스를로드하거나 "준비"해야하며 그렇지 않은 경우 파일을 자체적으로 열어야합니다.
파일 경로가 프로그램의 인수로 사용될 때이 추세를 따르는 것 같습니다.
첫 번째 인스턴스가 준비된 경우 (또는 첫 번째가 아닌 것이 준비된 경우) 첫 번째 인스턴스가 아닌 경우 인스턴스를 첫 번째 인스턴스에 DDE 메시지로 릴레이 할 수있는 것으로 보입니다.
그러나 프로그램을 실행하고 DDE 메시지를 사용하여 파일을 열면 첫 번째 인스턴스가 인수를 통해 DDE 메시지를 수락 할 준비가되었는지 여부에 관계없이 DDE 프로토콜을 따르는 것 같습니다. 첫 번째 인스턴스가 준비되었는지 여부는 첫 번째 인스턴스가 아닌 것이 첫 번째 인스턴스가 준비된 것으로 인식하는지 여부와 첫 번째 인스턴스에 DDE 메시지를 보내지 않으면 인수를 통해 열 때만 발생하는 것으로 보입니다. . 첫 번째가 "준비되지 않은"또는 "존재하지 않은"것으로 첫 번째가 아닌 것으로 보는 추측은 다음과 같은 경우 첫 번째에 의해 DDE 메시지 (첫 번째가 아닌)가 첫 번째로 수락된다는 사실에 의해 제안됩니다. 인수 연결 "% 1"; DDE 메시지를 통해 열도록 지시됩니다.
내 추측은 :이 응용 프로그램의 코드는 다른 인스턴스가 "준비"되었는지 여부를 결정하기 위해 모호한 방법을 사용하며, 그렇다면 인수가 사용될 때 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 메시지의 내용을 전달하도록 특정 파일 확장자의 실행을 조정하려고합니다. 파일을 여는 요청이 포함되어 있습니다.이 요청은 파일이 존재하고 사용하지 않는 경우 이미 존재하는 인스턴스로 파일을 릴레이합니다. 파일 경로에 대한 인수가 사용되는 경우 다른 인스턴스가 "준비"된 것으로 보이기 위해 이러한 응용 프로그램의 모호한 요구 사항을 무시할 수 있습니다.
이것들은 Class 키와 관련된 모든 파일 확장자로 x
다음 과 같이 대체됩니다 :
단어
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
엑셀
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")]
-(단어)
[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이 유일한 것이 아니라면). 이에 대한 의견을 적어주십시오.