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

时间:2013-08-12 09:14:34

标签: c++ windows com windows-shell vc6

我在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-> .."时,它会出现访问冲突错误。步。任何人都可以帮助我吗?

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

MSDN IShellWindows::Item

  

返回值类型:HRESULT S_FALSE(1)指定的窗口不是   找到。

找不到您正在查找的项目,显然您没有获得有效的pidisp。试图在访问冲突中使用它 - 预期 - 。

您需要正确处理“未找到项目”案例,并检查您的v参数。