2012-11-20 4 views
0

내 질문을 설명하는 것은 약간 까다 롭지 만 최선을 다할 것입니다.동시에 여러 개의 파일을 탐색기에서 여는 방법은 무엇입니까?

먼저 C 및 WinAPI를 사용하여 다중 문서 인터페이스 응용 프로그램을 개발하고 있습니다. 내 프로그램은 명령 줄 인수를 구문 분석하여 여러 파일을 열 수 있습니다. 이 문자열을 넣으려면 : "X : \ MyAppName.exe" "% 1" txt 파일의 명령 목록에서 열기를 클릭하면 이제 Windows 탐색기에서 .txt 파일을 마우스 오른쪽 단추로 클릭하여 열 수 있습니다. 앱. 그러나 여러 파일을 선택하면 탐색기가 "X : \ MyAppName.exe" "% 1" 번 명령을 여러 번 실행하여 내 응용 프로그램의 여러 인스턴스가 시작됩니다.

하지만 잠깐! 그것은 가장 까다로운 부분이 아닙니다. 대신, 내 응용 프로그램은 하나의 파일을 열고 한 번에 여러 개의 파일을 별도의 시각적 스타일을 사용하여 두 가지 다른 것으로 여는 것입니다. 나는 한 번에 하나의 인스턴스를 유지하는 아이디어를 알고있다. (구현할 C 코드는 모르지만). 하지만 여러 파일을 하나씩 열고 여러 파일을 동시에 열 때의 차이점을 알려주는 방법을 모르겠습니다.

나는 분명히하기를 희망한다.

+0

여러 옵션이 있습니다. 아마도 가장 좋은 방법은 [앱이 여러 객체를 포함하는 데이터 객체를 수용 할 수 있다고 가정하는 것입니다 (http://blogs.msdn.com/b/oldnewthing/archive/2010/05/03/10006065.aspx). –

답변

1

현재와 같이 레지스트리를 사용하면 단일 파일에서 여러 파일을 직접 구별 할 수 없습니다. 요청한 각 파일은 이미 알았 듯이 앱의 새로운 사본을 시작합니다. 당신이 할 수있는 단일 인스턴스 (single-instancing)를 구현한다면, 첫 번째 파일이 요청되었을 때이를 감지하고 짧은 타이머를 시작한 다음 각 후속 파일에 해당 타이머를 다시 설정하게 할 수 있습니다. 마침내 경과 할 때 수집 한 파일 수를 확인하고 필요에 따라 조치를 취하십시오.

IDropTarget 인터페이스를 구현하는 응용 프로그램에서 out-of-process COM 개체를 대신 작성하는 것이 더 좋고 더 좋습니다. 그러면 Windows는 앱에 대한 단일 진입 점을 통해 파일 정보를 퍼널 할 수 있습니다. 앱에서 정보가 어디서 왔는지 신경 쓸 필요가 없습니다. 한 번에 여러 파일을 지원할 수있을뿐만 아니라 다른 형식의 파일 정보도 지원할 수 있습니다. Windows는 파일 이름 만 전달하거나 실제 파일 데이터 자체를 전달할 수 있습니다.

Windows는 어떤 파일 정보 가든 보유 할 단일 IDataObject 개체를 생성 한 다음 IDropTarget 개체로 전달합니다. 앱이 이미 실행중인 경우 COM은 기존 IDropTarget 개체에 액세스 할 수 있습니다. 앱이 아직 실행되고 있지 않으면 COM은 앱을 자동으로 시작한 다음 IDropTarget 개체에 액세스합니다. 어느 쪽이든, 그것이 실행되면, 당신의 IDropTarget은 어떤 데이터가 전달되었는지를보고 그것을 받아들이거나 거절 할지를 결정할 수 있습니다.

원하는 파일 확장자에 대한 DropTarget로 COM 개체의 CLSID는, 사용자는 파일을 두 번 클릭하거나 파일을 선택하고 Enter를 누르 수있을 것 등록하고 그들이 당신의 IDropTarget 객체에 전달됩니다.

앱에 대한 AppPath를 등록하고 사용자가 앱의 EXE 파일 자체에 관계없이 확장자의 파일을 드래그 할 수있을 것입니다, 그것을 위해 DropTargetCLSID를 등록하고 그들이 당신의 IDropTarget에 전달 될 경우 목적.

RegisterDragDrop() 기능이있는 동일한 COM 개체를 사용하는 경우 사용자는 확장명에 관계없이 파일을 앱의 UI로 직접 드래그 할 수 있으며 IDropTarget 개체로 전달됩니다.

+0

고맙습니다. 이것은 정말 멋진 답변입니다! 하지만 내가 혼란스러워하는 한 가지는 : 사용자가 "사용자가 그러한 파일을 두 번 클릭하거나 해당 파일을 선택하고 Enter 키를 누를 수 있습니다"라고 말한 것입니다.이 명령은 레지스트리에서 명령을 사용하여 기본 열기 명령을 덮어 씁니까? 아니면 레지스트리를 수정해야합니까? – LeOpArD

+0

그것은 그것을 대체하지 않으며, 그것을 향상시킵니다. 더블 클릭으로 무언가를하기 위해서는 여전히 파일 확장자에 대한 기본 동사를 만들어야하지만 "명령"대신 동사에 대해 "DropTarget"을 지정할 수 있습니다 (쉘은 또한 호출을위한 세 번째 옵션을 지원합니다 DDE,하지만 그 대신에'IDropTarget'이 선호됩니다). –

관련 문제