2013-10-02 2 views
0

나는 그것의 하나 CMFCShellTreeCtrl와 응용 프로그램이 대화의 일부 Win8 시스템에서 실행하는 경우가 충돌한다. 이 트리 컨트롤 afxshelltreectrl.cpp의이 부분에 SHGetFileInfo를 초기화하는 및 호출 할 때 발생 :SHGetFileInfo 함수 원인이 처리되지 않은 예외

int CMFCShellTreeCtrl::OnGetItemIcon(LPAFX_SHELLITEMINFO pItem, BOOL bSelected) 
{ 
    ENSURE(pItem != NULL); 

    SHFILEINFO sfi; 

    UINT uiFlags = SHGFI_PIDL | SHGFI_SYSICONINDEX | SHGFI_SMALLICON; 

    if (bSelected) 
    { 
     uiFlags |= SHGFI_OPENICON; 
    } 
    else 
    { 
     uiFlags |= SHGFI_LINKOVERLAY; 
    } 

    if (SHGetFileInfo((LPCTSTR)pItem->pidlFQ, 0, &sfi, sizeof(sfi), uiFlags)) 
    { 
     return sfi.iIcon; 
    } 

    return -1; 
} 

응용 프로그램 Win7에 32 비트에 VS2010에 구축했다. 클라이언트 PC에서 원격으로 디버깅 할 수 있도록 VM에서이 버그를 복제 할 수 없습니다. SHGetFileInfo 함수의 인수 값을 비교해 보았는데 메모리 주소를 제외하고 내 컴퓨터와 클라이언트에서 동일한 것으로 보입니다. 예외 후

콜 스택 : screenshot

WinDbg는 로그 :

ModLoad: 02b70000 02bc9000 cmd.exe 
ModLoad: 60780000 607ca000 C:\windows\SysWOW64\mscoree.dll 
ModLoad: 60700000 6077a000 C:\Windows\Microsoft.NET\Framework\v4.0.30319\mscoreei.dll 
ModLoad: 711b0000 71250000 C:\windows\SysWOW64\sxs.dll 
ModLoad: 60150000 606ff000 C:\Windows\Microsoft.NET\Framework\v2.0.50727\mscorwks.dll 
ModLoad: 70e30000 70ecb000 C:\windows\WinSxS\x86_microsoft.vc80.crt_1fc8b3b9a1e18e3b_8.0.50727.6910_none_d089c358442de345\MSVCR80.dll 
*** ERROR: Symbol file could not be found. Defaulted to export symbols for C:\windows\WinSxS\x86_microsoft.vc80.crt_1fc8b3b9a1e18e3b_8.0.50727.6910_none_d089c358442de345\MSVCR80.dll - 
ModLoad: 5f650000 6014a000 C:\windows\assembly\NativeImages_v2.0.50727_32\mscorlib\7f763721bf47dc8d58ec21cb64cbec91\mscorlib.ni.dll 
ModLoad: 71770000 71778000 C:\Windows\Microsoft.NET\Framework\v2.0.50727\culture.dll 
(c18.227c): CLR exception - code e0434f4d (first chance) 
(c18.227c): Access violation - code c0000005 (first chance) 
First chance exceptions are reported before any exception handling. 
This exception may be expected and handled. 
*** ERROR: Symbol file could not be found. Defaulted to export symbols for C:\windows\SysWOW64\combase.dll - 
eax=002d0068 ebx=80040154 ecx=04b1f654 edx=04b1f678 esi=0018b654 edi=76cbbda0 
eip=002d0068 esp=0018b63c ebp=0018b648 iopl=0   nv up ei ng nz ac pe cy 
cs=0023 ss=002b ds=002b es=002b fs=0053 gs=002b    efl=00010297 
002d0068 ??    ??? 

호출 스택 오류에 따르면 일부 COM 기능에서 발생합니다. COM에 익숙하지 않아서 SHGetFileInfo가 예외를 발생시키는 이유를 찾는 데 도움이 될 수 있습니다.

+0

'pItem-> pidlFQ'가 유효합니까? 그리고'CoInitialize' /'OleInitialize'가 스레드에서 호출 되었습니까? –

+0

조나단, 감사합니다, CoInitialize OnInitDialog()의 시작 부분에서 문제를 해결하십시오. –

답변

0

C0000005 메모리 액세스 예외이다. 이 함수를 호출하기 전에 pItem이 초기화되었는지 확인하십시오. 또는 'pItem-> pidlFQ'가 유효한지 확인할 수 있습니다.