[英]don't know how to use IShellWindows::Item correctly
我在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)
每個值檢查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
。 嘗試使用它會導致訪問沖突。
您需要正確處理“找不到項目”的情況,並檢查v
參數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.