0

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

ここに画像の説明を入力

サンプル プロジェクト名は と呼ば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は次のとおりです。

HRESULT CFolderViewImplFolder_CreateInstance(REFIID riid, void **ppv)
{
*ppv = NULL;
CFolderViewImplFolder* pFolderViewImplShellFolder = new (std::nothrow) CFolderViewImplFolder(0);
HRESULT hr = pFolderViewImplShellFolder ? S_OK : E_OUTOFMEMORY;
if (SUCCEEDED(hr))
{
    hr = pFolderViewImplShellFolder->QueryInterface(riid, ppv);
    pFolderViewImplShellFolder->Release();
}
return hr;
}

そしてCFolderViewImplFolder実装IShellFolder2amd IPersistFolder2。ここでプリンターのショートカットを作成するために使用される同様のコードを見つけました: https://www.codeproject.com/Articles/596642/Creating-a-shortcut-programmatically-in-Cplusplus および https://msdn.microsoft. com/en-us/library/aa969393.aspx#Shellink_Item_Identifiers

IShellFolder のクラス識別子を取得したら、CoCreateInstance 関数を呼び出してインターフェイスのアドレスを取得できます。次に、インターフェイスを呼び出してフォルダー内のオブジェクトを列挙し、検索しているオブジェクトのアイテム識別子のアドレスを取得できます。最後に、IShellLink::SetIDList メンバー関数の呼び出しでアドレスを使用して、オブジェクトへのショートカットを作成できます。

改訂しました

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

// 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);

しかし、pVirtualFolder はまだ NULL であり、「対応するインターフェイスが見つかりません」と表示されます。

CoCreateInstance使用時に何か問題はありますか?または、このソリューションを使用しないでください。そのためのサンプルコードはありますか?

4

1 に答える 1