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

我在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)值的V_I4(&v) SUCCEEDED(hr) V_I4(&v)

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

MSDN IShellWindows::Item

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

你正在寻找的物品没有找到,你显然没有得到有效的pidisp 。 尝试使用它的结果 – 预期 – 在访问冲突。

你需要正确处理“item not found”情况,并检查你的v参数。