使用しているプラットフォームは 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
実装IShellFolder2
amd 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
使用時に何か問題はありますか?または、このソリューションを使用しないでください。そのためのサンプルコードはありますか?