2011-04-22 8 views
0

HKCR \ Folder \ shellex \ DragDropHandlers 아래에 쉘 확장이 등록되어 있고 대상 폴더에서 GetVolumePathName() + GetVolumeInformation()을 호출해야합니다 (IShellExtInit::Initialize에 전달 된 PIDL)DragDropHandlers IShellExtInit :: 초기화 및 NETHOOD UNC 경로

문제는 "Nethood 단축키"(My Network Places\sharename)에 놓을 때 초기화로 전달 된 PIDL이 UNC 경로가 아닌 Nethood 바로 가기를 참조한다는 것입니다!

나는 다양한 SIGDN 값이 a를 PIDL의 IShellItem 및 호출 IShellItem ::하는 getDisplayName을 만들려고합니다 (PIDL에 SHGetPathFromIDList를 호출하면 당신이 기대처럼 "%USERPROFILE%\NetHood\SHARE on MACHINE"하지 "\\MACHINE\SHARE"을 반환)하지만 그들 중 누구도 UNC 경로를 반환하지 않습니다.

어떻게이 PIDL에서 UNC 경로를 얻을 수 있습니까?

+0

AFAIR은 'desktop.ini'및 'target.lnk'이 포함 된 폴더입니다. 폴더에서 'target.lnk'을 해결해야합니다. –

+0

예 그 파일이 포함되어 있음을 알고 있지만 직접 해결하면 올바른 방법이 될 수 없습니다. target.lnk는 nethood 폴더를 처리하는 IShellFolder의 구현 세부 사항입니다. – Anders

답변

1
// error checking omitted 
IShellFolder* pFolder = NULL; 
LPCITEMIDLIST pidlChild = NULL; 
hr = SHBindToParent(pidl, IID_IShellFolder, (void**)&pFolder, &pidlChild); 
SFGAOF Attributes = SFGAO_LINK; 
hr = pFolder->GetAttributesOf(1, &pidlChild, &Attributes); 
if(Attributes & SFGAO_LINK) 
{ 
    // item is a link; get it's target path 
    IShellLink* pLink = NULL; 
    hr = pFolder->GetUIObjectOf(NULL, 1, &pidlChild, IID_IShellLink, NULL, (void**)&pLink); 
    TCHAR szPath[MAX_PATH]; 
    hr = pLink->GetPath(szPath, MAX_PATH, NULL, 0); // szPath now contains path of UNC share 
    pLink->Release(); 
    pLink = NULL; 
} 
pFolder->Release(); 
pFolder = NULL; 
+0

편집 : GetAttributesOf의 SFGAOF 매개 변수가 IN과 OUT 인 경우 SFGAO_LINK은 캐시 된 플래그이며 운이 좋은 것 같아요.) – Anders

+0

IPersistFolder3 :: GetFolderTargetInfo() 또는 SHGetDataFromIDList()를 사용하여이 고양이를 스킨하는 방법이 여러 가지라고 생각됩니다. SHGDFIL_NETRESOURCE)하지만 누군가가 더 나은 (및/또는 문서화 된) 방법을 생각해 내지 않으면 답변으로 받아 들일 것입니다 ... – Anders

+0

멋진 catch; 0을 전달하면 아마 모든 속성을 반환하지만, 이것은 문서화되어 있지 않습니다. 다른 방법들에 관해서는, 나는 좀 더 보편화되어 있기 때문에 이것을 고수 할 것입니다. – Luke