簡體   English   中英

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

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM