我使用的平台是windows 7。我需要为windows 7上的虚拟文件夹创建快捷方式。我使用windows 7 SDK示例在Computer下创建一个虚拟文件夹:
示例项目名称为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
吗?或者我不应该使用这个解决方案?有任何示例代码吗?