不知道如何正确使用IShellWindows::Item

don't know how to use IShellWindows::Item correctly

本文关键字:IShellWindows Item 何正确 不知道      更新时间:2023-10-16

我在XP系统上使用VC6。

以下是我的代码。它在我的计算机上运行得很好,但在其他计算机上,pisw->Item(v,&pidisp)似乎不等于S_OK。现在我正试图弄清楚这里出了什么问题

  IShellWindows *pisw;
  if (SUCCEEDED(CoCreateInstance(CLSID_ShellWindows, NULL, CLSCTX_ALL,
                             IID_IShellWindows, (void**)&pisw))) {
  VARIANT v;
  V_VT(&v) = VT_I4;
  IDispatch  *pidisp;
  found = FALSE;
  for (V_I4(&v) = 0; !found && pisw->Item(v, &pidisp) == S_OK; V_I4(&v)++) {
     IWebBrowserApp *piwba;
    if (SUCCEEDED(pidisp->QueryInterface(IID_IWebBrowserApp, (void**)&piwba))) {
               //  blablabla....do something..
  }

所以我把一些代码改成了

...
IDispatch *pidisp;
hr = pisw->Item(v, &pidisp);
if (SUCCEEDED(hr))
{
      for (V_I4(&v) = 0; !found ; V_I4(&v)++) {
     IWebBrowserApp *piwba;
     if (SUCCEEDED(pidisp->QueryInterface(IID_IWebBrowserApp, (void**)&piwba))) {
               //  blablabla....do something..
   }

}

则hr的返回值变为1。当运行到"pidisp->.."步骤时,它会出现访问冲突错误。有人能帮我吗?

原始代码错误地测试了pisw->Item(v, &pidisp)的结果。奇怪,因为它稍后确实使用了正确的检查。

问题是除了S_OK之外还有许多成功返回值。您的修复是正确的,您应该使用SUCCEEDED(hr),但您在SUCCEEDED(hr)测试中错误地移动了循环。您应该针对V_I4(&v)的每个值检查SUCCEEDED(hr)

您的S_FALSE结果是因为您现在在循环之前调用hr = pisw->Item(v, &pidisp);,这意味着v未初始化(垃圾)。暂时假设其垃圾值为728365。S_FALSE表示:调用成功,但窗口数少于728365个。

MSDN IShellWindows::Item:

返回值类型:HRESULT S_FALSE(1)指定的窗口不是建立

找不到您要查找的项目,而且您显然没有得到有效的pidisp。尝试使用它会导致访问违规。

您需要正确处理"itemnotfound"的情况,并检查您的v参数。