【问题标题】:don't know how to use IShellWindows::Item correctly不知道如何正确使用 IShellWindows::Item
【发布时间】:2013-08-13 13:12:19
【问题描述】:

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

【问题讨论】:

    标签: c++ windows com windows-shell visual-c++-6


    【解决方案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。

    【讨论】:

    • 您的回答说明了很多!非常感谢!
    【解决方案2】:

    MSDNIShellWindows::Item:

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

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

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

    【讨论】:

    • 我不明白。我打开了 3 或 4 个 shell 窗口。怎么找不到指定的窗口???为什么将 pisw->Item(v, &pidisp) 放入 for 语句是可以的,但添加 hr 会出错?
    • 此外,在另一台计算机上,pisw->Item(v, &pidisp) 不等于 S_OK,因此它不会运行以下 for 语句。我该如何解决??
    • Item 调用没有找到给定的v。这就是正在发生的事情。 1 = S_FALSE 的返回值是对您的这种情况的指示。这个值仍然通过SUCCEEDED检查,不是错误。
    • 那么如何给“v”一个值??
    • 并且 item() 函数是否指定了一个窗口?我没有给它一个参数来指定哪个窗口...
    猜你喜欢
    • 1970-01-01
    • 2021-04-21
    • 1970-01-01
    • 1970-01-01
    • 2011-12-13
    • 1970-01-01
    • 2013-08-01
    • 2016-01-03
    • 2023-03-18
    相关资源
    最近更新 更多