【发布时间】:2017-10-26 18:14:13
【问题描述】:
我使用的平台是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 使用时有什么问题吗?或者我不应该使用这个解决方案?有没有示例代码?
【问题讨论】:
-
简短回答:你不能在 C++ 中做到这一点。您可以使用特定于操作系统/平台的 API 来执行此操作,但是您应该指定您拥有的操作系统、平台以及您希望使用的 API。
-
windows 7. 这就是你要问的吗?
-
您不应该直接使用 CoCreateInstance。让 shell 来做吧。
-
@DenisAnisimov 不明白。你能解释一下吗?还是一些代码?你是什么意思让shell来做?
-
我要求正确地提出问题,而不是提供必要的信息作为评论。您的问题可以并且应该用于其他人解决类似问题。目前听起来像是“我如何使用汽车赚钱?”你有卡车吗?你想把它出租吗?等
标签: c++ shortcut windows-shell clsid shell-namespace-extension