2013-08-12 2 views
0

XP 시스템에서 VC6을 사용하고 있습니다.IShellWindows :: Item 올바르게 사용하는 방법을 모른다.

다음은 제 코드입니다. 내 컴퓨터에서 완벽하게 실행되지만 다른 컴퓨터에서는 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)을 사용해야하지만 실수로 SUCCEEDED(hr) 테스트의 루프를 이동했습니다. V_I4(&v)의 모든 값에 대해 SUCCEEDED(hr)을 확인해야합니다.

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 검사를 통과하며 오류가 아닙니다. –

관련 문제