2017-10-26 48 views
0

내가 사용하고있는 플랫폼은 내가 컴퓨터에서 가상 폴더를 만들 윈도우 7 SDK 샘플을 사용 7. 창에 가상 폴더에 대한 바로 가기를 만들 필요가 윈도우 7입니다 프로젝트 이름이 ExplorerDataProvider라고, 그것은 IShellFolder 클래스의 CLSID를 정의Windows 7의 C++에서 가상 폴더에 대한 바로 가기를 만드는 방법은 무엇입니까?</p> <p><a href="https://i.stack.imgur.com/t6leq.jpg" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/t6leq.jpg" alt="enter image description here"></a></p> <p>샘플 :

// add classes supported by this module here 
const CLASS_OBJECT_INIT c_rgClassObjectInit[] = 
{ 
{ &CLSID_FolderViewImpl,   CFolderViewImplFolder_CreateInstance }, 
{ &CLSID_FolderViewImplContextMenu,CFolderViewImplContextMenu_CreateInstance }, 
}; 

CFolderViewImplFolder_CreateInstance에 대한 정의는 다음과 같습니다

IShellFolder2 amd IPersistFolder2을 구현합니다. https://www.codeproject.com/Articles/596642/Creating-a-shortcut-programmatically-in-Cplusplus 하고 IShellFolder에 대한 클래스 식별자를 갖게되면, 당신은 인터페이스의 주소를 검색 할 수 CoCreateInstance 함수를 호출 할 수 있습니다 https://msdn.microsoft.com/en-us/library/aa969393.aspx#Shellink_Item_Identifiers

에서 : 여기 프린터에 대한 바로 가기를 만드는 데 사용되는 유사한 코드를 발견 . 그런 다음 인터페이스를 호출하여 폴더의 개체를 열거하고 검색 할 개체의 항목 식별자 주소를 검색 할 수 있습니다. 마지막으로 IShellLink :: SetIDList 멤버 함수 호출에서 주소를 사용하여 개체에 대한 바로 가기를 만들 수 있습니다.

나는

// testFolder is the CLSID for the virtual folder implementation 
hr = CoCreateInstance(testFolder, NULL, CLSCTX_INPROC_SERVER, IID_IShellFolder, (LPVOID*)&pVirtualFolder); 

또는

hr = CoCreateInstance(testFolder, NULL, CLSCTX_INPROC_SERVER, IID_IShellFolder2, (LPVOID*)&pVirtualFolder); 

hr = SHGetMalloc(&pMalloc); 
hr = SHGetDesktopFolder(&pDesktopFolder); 
hr = SHGetSpecialFolderLocation(NULL, CSIDL_PRINTERS, &netItemIdLst); 
hr = pDesktopFolder->BindToObject(netItemIdLst, NULL, IID_IShellFolder, (void **)&pPrinterFolder); 

을 개정 그러나 pVirtualFolder은 여전히 ​​NULL이며,이 "해당 인터페이스를 찾을 수 없습니다"라는 인쇄합니다.

사용할 때 CoCreateInstance에 문제가 있습니까? 아니면이 솔루션을 사용하지 않아야합니까? 그것을위한 어떤 샘플 코드?

+0

짧은 대답 : C++에서는 그렇게 할 수 없습니다. OS/플랫폼 특정 API를 사용하여이를 수행 할 수 있지만, 사용중인 OS, 사용하고자하는 플랫폼 및 API를 지정해야합니다. – Slava

+0

windows 7. 그게 당신이 요구하는 것입니까? – beasone

+0

CoCreateInstance를 직접 사용하면 안됩니다. 껍질이 그것을하게하십시오. –

답변

1

바로 가기를 만들려면 official documentation을 사용할 수 있습니다. (: ComputerFolder 일명) 물론

int main() 
{ 
    CoInitialize(NULL); 
    // I've used my Apple's iCloud as an example (name is in french) 
    // it's a virtual folder, a shell namespace extension 
    HRESULT hr = CreateComputerChildShortCut(L"Photos iCloud", L"c:\\temp\\my icloud"); 
    printf("hr:0x%08X\n", hr); 
    CoUninitialize(); 
    return 0; 
} 

HRESULT CreateComputerChildShortCut(LPWSTR childDisplayName, LPWSTR path) 
{ 
    // get My Computer folder's ShellItem (there are other ways for this...) 
    CComPtr<IShellItem> folder; 
    HRESULT hr = SHCreateItemInKnownFolder(FOLDERID_ComputerFolder, 0, NULL, IID_PPV_ARGS(&folder)); 
    if (FAILED(hr)) return hr; 

    // enumerate children 
    CComPtr<IEnumShellItems> items; 
    hr = folder->BindToHandler(NULL, BHID_EnumItems, IID_PPV_ARGS(&items)); 
    if (FAILED(hr)) return hr; 

    for (CComPtr<IShellItem> item; items->Next(1, &item, NULL) == S_OK; item.Release()) 
    { 
     // get parsing path (if's often useful) 
     CComHeapPtr<wchar_t> parsingPath; 
     item->GetDisplayName(SIGDN_DESKTOPABSOLUTEPARSING, &parsingPath); 
     wprintf(L"Path: %s\n", parsingPath); 

     // get display name 
     CComHeapPtr<wchar_t> displayName; 
     item->GetDisplayName(SIGDN_NORMALDISPLAY, &displayName); 
     wprintf(L" Name: %s\n", displayName); 

     if (!lstrcmpi(childDisplayName, displayName)) 
     { 
      // get pidl 
      // it's the unambiguous way of referencing a shell thing 
      CComHeapPtr<ITEMIDLIST> pidl; 
      hr = SHGetIDListFromObject(item, &pidl); 
      if (FAILED(hr)) return hr; 

      // create an instance of the standard Shell's folder shortcut creator 
      CComPtr<IShellLink> link; 
      hr = link.CoCreateInstance(CLSID_FolderShortcut); 
      if (FAILED(hr)) return hr; 

      // just use the pidl 
      hr = link->SetIDList(pidl); 
      if (FAILED(hr)) return hr; 

      CComPtr<IPersistFile> file; 
      hr = link->QueryInterface(&file); 
      if (FAILED(hr)) return hr; 

      // save the shortcut (we could also change other IShellLink parameters) 
      hr = file->Save(path, FALSE); 
      if (FAILED(hr)) return hr; 
      break; 
     } 
    } 
    return S_OK; 
} 

당신은 절대 구문 분석 경로 또는 절대 PIDL을 알고 있다면, 당신은 필요 없어, 여기에 "이 PC"의 어린이에 대한 바로 가기를 생성하는 샘플 코드입니다 아무것도 열거하지 말고, 이것은 데모 용 일뿐입니다.