1
0
Fork 0

feat: 배치 결합 모드 + IExplorerCommand DLL 카스케이드

#10 다중 이미지 → 단일 PDF/TIFF/GIF 결합
- ConversionEngine: BatchMode { Independent, CombineToSingle } enum 추가
- ConvertManyAsync에 batchMode 파라미터, CombineToSingle 시 N:1 라우팅
- CombineAsync: MagickImageCollection으로 모든 입력 디코드 후
  단일 다중-페이지 파일로 출력 (PDF/TIFF/GIF만 지원)
- 결합 가능 검증: ImageMagick 디코드 가능 입력 + 결합 가능 출력
- 정적 헬퍼 CanCombine(outputExt), CanCombineInput(sourcePath)

UI
- MainWindow.xaml에 '단일 파일로 결합' CheckBox 추가
  (출력이 결합 가능 + 큐 ≥2 + 모든 입력 결합 가능일 때 활성화)
- 큐 변경/형식 변경 시 토글 상태 + 안내 텍스트 자동 갱신
- MainWindow.xaml.cs UpdateCombineState / OnCombineToggleChanged

#9 IExplorerCommand DLL 카스케이드 (MSIX 메인 메뉴)
- dllmain.cpp 전면 재작성:
  RootCascadeCommand (CLSID F1A2B3C4-...-2B3C4D5E6F70)
  + 11개 동적 SubVerbCommand
  + SubCommandEnumerator (IEnumExplorerCommand)
  + ECF_HASSUBCOMMANDS 플래그
- 서브메뉴 항목: JPEG/PNG/WebP/PDF/TXT/DOCX/AVIF/GIF/TIFF/BMP/변환…
- 기존 Quick/Dialog 핸들러는 backward compat용으로 유지
- 빌드: x64 Release Everything2Everything.Shell.dll (207KB)

Package.appxmanifest
- com:Class에 RootCascadeCommand CLSID 등록
- 모든 desktop5:ItemType verb를 Quick+Dialog 두 개에서 단일 Convert로 통합
  (29개 ItemType × 2 verbs → 29 × 1 verb)

quick CLI는 기본 .jpg 호환 유지, dialog는 메인 창에서 형식 선택

빌드: dotnet 0 errors, MSBuild C++ 0 errors
This commit is contained in:
Yun Chan 2026-05-07 15:46:38 +09:00
parent 9b7e5f0d0c
commit 2633a928c1
7 changed files with 452 additions and 68 deletions

View file

@ -44,10 +44,15 @@
</uap:VisualElements>
<Extensions>
<!-- COM Surrogate Server: hosts the two IExplorerCommand handlers -->
<!-- COM Surrogate Server: hosts the IExplorerCommand handlers -->
<com:Extension Category="windows.comServer">
<com:ComServer>
<com:SurrogateServer DisplayName="Everything2Everything Shell Extension">
<!-- Root cascade ("Everything2Everything으로 변환" + 11 sub-items) -->
<com:Class Id="F1A2B3C4-D5E6-4789-9A01-2B3C4D5E6F70"
Path="Everything2Everything.Shell.dll"
ThreadingModel="STA" />
<!-- Legacy non-cascade verbs (kept for backward compat) -->
<com:Class Id="801B2DD3-632C-4731-9510-AEAE09345264"
Path="Everything2Everything.Shell.dll"
ThreadingModel="STA" />
@ -63,132 +68,103 @@
<desktop4:FileExplorerContextMenus>
<!-- 이미지 -->
<desktop5:ItemType Type=".png">
<desktop5:Verb Id="Quick" Clsid="801B2DD3-632C-4731-9510-AEAE09345264"/>
<desktop5:Verb Id="Dialog" Clsid="CEBA1DB7-9175-4DF6-A362-490DEA49B598"/>
<desktop5:Verb Id="Convert" Clsid="F1A2B3C4-D5E6-4789-9A01-2B3C4D5E6F70"/>
</desktop5:ItemType>
<desktop5:ItemType Type=".jpg">
<desktop5:Verb Id="Quick" Clsid="801B2DD3-632C-4731-9510-AEAE09345264"/>
<desktop5:Verb Id="Dialog" Clsid="CEBA1DB7-9175-4DF6-A362-490DEA49B598"/>
<desktop5:Verb Id="Convert" Clsid="F1A2B3C4-D5E6-4789-9A01-2B3C4D5E6F70"/>
</desktop5:ItemType>
<desktop5:ItemType Type=".jpeg">
<desktop5:Verb Id="Quick" Clsid="801B2DD3-632C-4731-9510-AEAE09345264"/>
<desktop5:Verb Id="Dialog" Clsid="CEBA1DB7-9175-4DF6-A362-490DEA49B598"/>
<desktop5:Verb Id="Convert" Clsid="F1A2B3C4-D5E6-4789-9A01-2B3C4D5E6F70"/>
</desktop5:ItemType>
<desktop5:ItemType Type=".gif">
<desktop5:Verb Id="Quick" Clsid="801B2DD3-632C-4731-9510-AEAE09345264"/>
<desktop5:Verb Id="Dialog" Clsid="CEBA1DB7-9175-4DF6-A362-490DEA49B598"/>
<desktop5:Verb Id="Convert" Clsid="F1A2B3C4-D5E6-4789-9A01-2B3C4D5E6F70"/>
</desktop5:ItemType>
<desktop5:ItemType Type=".bmp">
<desktop5:Verb Id="Quick" Clsid="801B2DD3-632C-4731-9510-AEAE09345264"/>
<desktop5:Verb Id="Dialog" Clsid="CEBA1DB7-9175-4DF6-A362-490DEA49B598"/>
<desktop5:Verb Id="Convert" Clsid="F1A2B3C4-D5E6-4789-9A01-2B3C4D5E6F70"/>
</desktop5:ItemType>
<desktop5:ItemType Type=".tif">
<desktop5:Verb Id="Quick" Clsid="801B2DD3-632C-4731-9510-AEAE09345264"/>
<desktop5:Verb Id="Dialog" Clsid="CEBA1DB7-9175-4DF6-A362-490DEA49B598"/>
<desktop5:Verb Id="Convert" Clsid="F1A2B3C4-D5E6-4789-9A01-2B3C4D5E6F70"/>
</desktop5:ItemType>
<desktop5:ItemType Type=".tiff">
<desktop5:Verb Id="Quick" Clsid="801B2DD3-632C-4731-9510-AEAE09345264"/>
<desktop5:Verb Id="Dialog" Clsid="CEBA1DB7-9175-4DF6-A362-490DEA49B598"/>
<desktop5:Verb Id="Convert" Clsid="F1A2B3C4-D5E6-4789-9A01-2B3C4D5E6F70"/>
</desktop5:ItemType>
<desktop5:ItemType Type=".webp">
<desktop5:Verb Id="Quick" Clsid="801B2DD3-632C-4731-9510-AEAE09345264"/>
<desktop5:Verb Id="Dialog" Clsid="CEBA1DB7-9175-4DF6-A362-490DEA49B598"/>
<desktop5:Verb Id="Convert" Clsid="F1A2B3C4-D5E6-4789-9A01-2B3C4D5E6F70"/>
</desktop5:ItemType>
<desktop5:ItemType Type=".avif">
<desktop5:Verb Id="Quick" Clsid="801B2DD3-632C-4731-9510-AEAE09345264"/>
<desktop5:Verb Id="Dialog" Clsid="CEBA1DB7-9175-4DF6-A362-490DEA49B598"/>
<desktop5:Verb Id="Convert" Clsid="F1A2B3C4-D5E6-4789-9A01-2B3C4D5E6F70"/>
</desktop5:ItemType>
<desktop5:ItemType Type=".psd">
<desktop5:Verb Id="Quick" Clsid="801B2DD3-632C-4731-9510-AEAE09345264"/>
<desktop5:Verb Id="Dialog" Clsid="CEBA1DB7-9175-4DF6-A362-490DEA49B598"/>
<desktop5:Verb Id="Convert" Clsid="F1A2B3C4-D5E6-4789-9A01-2B3C4D5E6F70"/>
</desktop5:ItemType>
<!-- HEIC/HEIF -->
<desktop5:ItemType Type=".heic">
<desktop5:Verb Id="Quick" Clsid="801B2DD3-632C-4731-9510-AEAE09345264"/>
<desktop5:Verb Id="Dialog" Clsid="CEBA1DB7-9175-4DF6-A362-490DEA49B598"/>
<desktop5:Verb Id="Convert" Clsid="F1A2B3C4-D5E6-4789-9A01-2B3C4D5E6F70"/>
</desktop5:ItemType>
<desktop5:ItemType Type=".heif">
<desktop5:Verb Id="Quick" Clsid="801B2DD3-632C-4731-9510-AEAE09345264"/>
<desktop5:Verb Id="Dialog" Clsid="CEBA1DB7-9175-4DF6-A362-490DEA49B598"/>
<desktop5:Verb Id="Convert" Clsid="F1A2B3C4-D5E6-4789-9A01-2B3C4D5E6F70"/>
</desktop5:ItemType>
<!-- RAW -->
<desktop5:ItemType Type=".dng">
<desktop5:Verb Id="Quick" Clsid="801B2DD3-632C-4731-9510-AEAE09345264"/>
<desktop5:Verb Id="Dialog" Clsid="CEBA1DB7-9175-4DF6-A362-490DEA49B598"/>
<desktop5:Verb Id="Convert" Clsid="F1A2B3C4-D5E6-4789-9A01-2B3C4D5E6F70"/>
</desktop5:ItemType>
<desktop5:ItemType Type=".nef">
<desktop5:Verb Id="Quick" Clsid="801B2DD3-632C-4731-9510-AEAE09345264"/>
<desktop5:Verb Id="Dialog" Clsid="CEBA1DB7-9175-4DF6-A362-490DEA49B598"/>
<desktop5:Verb Id="Convert" Clsid="F1A2B3C4-D5E6-4789-9A01-2B3C4D5E6F70"/>
</desktop5:ItemType>
<desktop5:ItemType Type=".cr2">
<desktop5:Verb Id="Quick" Clsid="801B2DD3-632C-4731-9510-AEAE09345264"/>
<desktop5:Verb Id="Dialog" Clsid="CEBA1DB7-9175-4DF6-A362-490DEA49B598"/>
<desktop5:Verb Id="Convert" Clsid="F1A2B3C4-D5E6-4789-9A01-2B3C4D5E6F70"/>
</desktop5:ItemType>
<desktop5:ItemType Type=".cr3">
<desktop5:Verb Id="Quick" Clsid="801B2DD3-632C-4731-9510-AEAE09345264"/>
<desktop5:Verb Id="Dialog" Clsid="CEBA1DB7-9175-4DF6-A362-490DEA49B598"/>
<desktop5:Verb Id="Convert" Clsid="F1A2B3C4-D5E6-4789-9A01-2B3C4D5E6F70"/>
</desktop5:ItemType>
<desktop5:ItemType Type=".arw">
<desktop5:Verb Id="Quick" Clsid="801B2DD3-632C-4731-9510-AEAE09345264"/>
<desktop5:Verb Id="Dialog" Clsid="CEBA1DB7-9175-4DF6-A362-490DEA49B598"/>
<desktop5:Verb Id="Convert" Clsid="F1A2B3C4-D5E6-4789-9A01-2B3C4D5E6F70"/>
</desktop5:ItemType>
<desktop5:ItemType Type=".raf">
<desktop5:Verb Id="Quick" Clsid="801B2DD3-632C-4731-9510-AEAE09345264"/>
<desktop5:Verb Id="Dialog" Clsid="CEBA1DB7-9175-4DF6-A362-490DEA49B598"/>
<desktop5:Verb Id="Convert" Clsid="F1A2B3C4-D5E6-4789-9A01-2B3C4D5E6F70"/>
</desktop5:ItemType>
<desktop5:ItemType Type=".orf">
<desktop5:Verb Id="Quick" Clsid="801B2DD3-632C-4731-9510-AEAE09345264"/>
<desktop5:Verb Id="Dialog" Clsid="CEBA1DB7-9175-4DF6-A362-490DEA49B598"/>
<desktop5:Verb Id="Convert" Clsid="F1A2B3C4-D5E6-4789-9A01-2B3C4D5E6F70"/>
</desktop5:ItemType>
<desktop5:ItemType Type=".rw2">
<desktop5:Verb Id="Quick" Clsid="801B2DD3-632C-4731-9510-AEAE09345264"/>
<desktop5:Verb Id="Dialog" Clsid="CEBA1DB7-9175-4DF6-A362-490DEA49B598"/>
<desktop5:Verb Id="Convert" Clsid="F1A2B3C4-D5E6-4789-9A01-2B3C4D5E6F70"/>
</desktop5:ItemType>
<desktop5:ItemType Type=".srw">
<desktop5:Verb Id="Quick" Clsid="801B2DD3-632C-4731-9510-AEAE09345264"/>
<desktop5:Verb Id="Dialog" Clsid="CEBA1DB7-9175-4DF6-A362-490DEA49B598"/>
<desktop5:Verb Id="Convert" Clsid="F1A2B3C4-D5E6-4789-9A01-2B3C4D5E6F70"/>
</desktop5:ItemType>
<desktop5:ItemType Type=".pef">
<desktop5:Verb Id="Quick" Clsid="801B2DD3-632C-4731-9510-AEAE09345264"/>
<desktop5:Verb Id="Dialog" Clsid="CEBA1DB7-9175-4DF6-A362-490DEA49B598"/>
<desktop5:Verb Id="Convert" Clsid="F1A2B3C4-D5E6-4789-9A01-2B3C4D5E6F70"/>
</desktop5:ItemType>
<!-- PDF -->
<desktop5:ItemType Type=".pdf">
<desktop5:Verb Id="Quick" Clsid="801B2DD3-632C-4731-9510-AEAE09345264"/>
<desktop5:Verb Id="Dialog" Clsid="CEBA1DB7-9175-4DF6-A362-490DEA49B598"/>
<desktop5:Verb Id="Convert" Clsid="F1A2B3C4-D5E6-4789-9A01-2B3C4D5E6F70"/>
</desktop5:ItemType>
<!-- DOCX -->
<desktop5:ItemType Type=".docx">
<desktop5:Verb Id="Quick" Clsid="801B2DD3-632C-4731-9510-AEAE09345264"/>
<desktop5:Verb Id="Dialog" Clsid="CEBA1DB7-9175-4DF6-A362-490DEA49B598"/>
<desktop5:Verb Id="Convert" Clsid="F1A2B3C4-D5E6-4789-9A01-2B3C4D5E6F70"/>
</desktop5:ItemType>
<desktop5:ItemType Type=".doc">
<desktop5:Verb Id="Quick" Clsid="801B2DD3-632C-4731-9510-AEAE09345264"/>
<desktop5:Verb Id="Dialog" Clsid="CEBA1DB7-9175-4DF6-A362-490DEA49B598"/>
<desktop5:Verb Id="Convert" Clsid="F1A2B3C4-D5E6-4789-9A01-2B3C4D5E6F70"/>
</desktop5:ItemType>
<!-- HTML -->
<desktop5:ItemType Type=".html">
<desktop5:Verb Id="Quick" Clsid="801B2DD3-632C-4731-9510-AEAE09345264"/>
<desktop5:Verb Id="Dialog" Clsid="CEBA1DB7-9175-4DF6-A362-490DEA49B598"/>
<desktop5:Verb Id="Convert" Clsid="F1A2B3C4-D5E6-4789-9A01-2B3C4D5E6F70"/>
</desktop5:ItemType>
<desktop5:ItemType Type=".htm">
<desktop5:Verb Id="Quick" Clsid="801B2DD3-632C-4731-9510-AEAE09345264"/>
<desktop5:Verb Id="Dialog" Clsid="CEBA1DB7-9175-4DF6-A362-490DEA49B598"/>
<desktop5:Verb Id="Convert" Clsid="F1A2B3C4-D5E6-4789-9A01-2B3C4D5E6F70"/>
</desktop5:ItemType>
<!-- HWP / HWPX -->
<desktop5:ItemType Type=".hwp">
<desktop5:Verb Id="Quick" Clsid="801B2DD3-632C-4731-9510-AEAE09345264"/>
<desktop5:Verb Id="Dialog" Clsid="CEBA1DB7-9175-4DF6-A362-490DEA49B598"/>
<desktop5:Verb Id="Convert" Clsid="F1A2B3C4-D5E6-4789-9A01-2B3C4D5E6F70"/>
</desktop5:ItemType>
<desktop5:ItemType Type=".hwpx">
<desktop5:Verb Id="Quick" Clsid="801B2DD3-632C-4731-9510-AEAE09345264"/>
<desktop5:Verb Id="Dialog" Clsid="CEBA1DB7-9175-4DF6-A362-490DEA49B598"/>
<desktop5:Verb Id="Convert" Clsid="F1A2B3C4-D5E6-4789-9A01-2B3C4D5E6F70"/>
</desktop5:ItemType>
</desktop4:FileExplorerContextMenus>
</desktop4:Extension>