2017-10-26 17 views
0

私が使用しているプラ​​ットフォームは、私はコンピュータの下に仮想フォルダを作成するには、Windows 7 SDKのサンプルを使用するWindows 7 に仮想フォルダのショートカットを作成する必要がWindows 7である:Windows 7のC++で仮想フォルダのショートカットを作成する方法は?

enter image description here

サンプルプロジェクト名がExplorerDataProviderと呼ばれ、それがIShellFolderクラスのCLSIDを定義しています

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

CFolderViewImplFolder_CreateInstanceの定義は次のとおりです。

そして、CFolderViewImplFolderは、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を使用します。ここで「このPC」の子どもたちのためのショートカットを作成するサンプルコード(別名: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を知っていれば、あなたがする必要はありませんこれはデモンストレーションの目的にすぎません。

関連する問題