2013-08-12 2 views
0

Я использую систему VC6 в XP.Не знаю, как использовать IShellWindows :: Правильный товар

Ниже приведен мой код. Он отлично работает на моем компьютере, но на других компьютерах кажется, что 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.. 
    } 

}

то возвращаемое значение ч становится равным 1. И он получает доступ ошибки при запуске на шаг «pidisp-> ..». Может кто-нибудь мне помочь?

ответ

1

Исходный код неправильно проверяет результат pisw->Item(v, &pidisp). Странно, потому что он использует правильную проверку позже.

Проблема заключается в том, что существует много возвратных значений успеха, кроме S_OK. Ваше исправление верное, вы должны использовать SUCCEEDED(hr), но вы неправильно переместили петлю INSIDE на тест SUCCEEDED(hr). Вы должны проверить SUCCEEDED(hr) за каждое значение V_I4(&v).

Ваш S_FALSE результат потому, что вы звоните hr = pisw->Item(v, &pidisp); перед тем, как петля, что означает v неинициализирован (мусор). Предположим на мгновение, что его значение для мусора составляет 728365. S_FALSE означает: вызов преуспел, но есть менее 728365 окон.

+0

Ваш ответ объясняет многое! Спасибо! – Michael

0

MSDN IShellWindows::Item:

тип возвращаемого значения: HRESULT S_FALSE не (1) Указанное окно было найдено.

Товар не найден, и вы, очевидно, не получаете действительный номер pidisp. Попытка использовать его результаты - как ожидается - при нарушении прав доступа.

Вам необходимо обработать «предмет не найден» и проверить свой аргумент v.

+0

Я не понимаю. Я открыл 3 или 4 окна оболочки. Как получилось, что указанное окно не было найдено ??? И зачем положить pisw-> Item (v, & pidisp) в оператор for в порядке, но добавление hr становится неправильным? – Michael

+0

Кроме того, на другом компьютере pisw-> Item (v, & pidisp) не равен S_OK, поэтому для операторов не выполняется следующее. Как я могу решить это? – Michael

+1

Вызов 'Item' не находит ничего для данного' v'. Это то, что происходит. Возвращаемое значение '1' =' S_FALSE' является индикатором этого случая для вас. Это значение все еще проходит проверку 'SUCCEEDED' и не является ошибкой. –