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