0

我在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->..”步骤时会出现访问冲突错误。谁能帮我?

4

2 回答 2

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。

于 2013-08-12T15:22:14.943 回答
0

MSDN IShellWindows::Item

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

找不到您要查找的项目,并且您显然没有得到有效的pidisp. 尝试使用它会导致 - 预期 - 访问冲突。

您需要正确处理“未找到项目”的情况,并检查您的v论点。

于 2013-08-12T09:19:53.950 回答