gpt4 book ai didi

c++ - 在 IShellFolder::EnumObjects() 中使用 IShellBrowser::BrowseObject()

转载 作者:行者123 更新时间:2023-11-28 01:32:18 24 4
gpt4 key购买 nike

我有一个命名空间扩展,可以进行网络调用以显示其内容。

当资源管理器想要显示文件夹的内容时,它会在我的实现中调用 EnumObjects。当进行 webcall 时出错,我想将用户返回到我的 NSE 的根目录。目前我调用以下代码:

LPITEMIDLIST pidl = /*The piddle to navigate to, in my case root*/;

IShellBrowser* browser = (IShellBrowser*)SendMessage(m_hWnd, (WM_USER + 7), 0, 0);
if (browser != NULL) {

hr = browser->BrowseObject(pidl, SBSP_SAMEBROWSER | SBSP_ABSOLUTE);
}

有时,对 BrowseObject 的方法调用会因无效访问异常 (x0000005) 而失败。

我们还使用了一个变体,该变体将使用以下变体:

hr = GetSite(IID_IServiceProvider, (void**)&serviceProvider);
if (FAILED(hr))
return false;

IShellBrowser *browser;
hr = serviceProvider->QueryService(SID_SShellBrowser, &browser);
if(FAILED(hr))
return false;

站点是通过接口(interface)IObjectWithSite获取的。这也随机失败。我注意到,当网络调用失败时,m_siteNULL

EnumObject 在资源管理器的单独线程中调用,当我进行网络调用时,UI 不会卡住。我假设我可能不会从枚举文件夹的线程调用 Browse 对象,但如何在正确的线程上调用浏览?

在新线程中调用 BrowseObject 并等待 1 秒不会导致崩溃。但我不会将此 hack 视为有效的解决方案。

最佳答案

您似乎没有正确地添加对您正在使用的 COM 接口(interface)的引用,这可能导致它实际上被销毁。所以要么使用 CComPtr ,或者至少调用 AddRef/Release 来保存对该对象的有效引用。

此外,如果使用多个线程,您是否从所有线程调用 CoInitialize

关于c++ - 在 IShellFolder::EnumObjects() 中使用 IShellBrowser::BrowseObject(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50965804/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com