我在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
参数。