2017-12-31 94 views
-1

Windows 7 64 비트 및 Visual Studio C++ 2017 커뮤니티를 사용하고 있습니다. 내가 IFileOpenDialog를 사용하여 Windows 파일 열기 대화 상자를 만들기 위해 노력하고 있지만, 프로그램이 종료 할 때 나는이 두 가지 액세스 위반 오류가 계속 :IFileOpenDialog 액세스 위반

Exception thrown at 0x00000000771ED1CB (ntdll.dll) in p.exe: 0xC0000005: Access violation reading location 0x0000000000000074. 

Exception thrown at 0x00000000771DDC9D (ntdll.dll) in p.exe: 0xC0000005: Access violation reading location 0x0000000000000074. 

를 액세스 위반을 디버깅하기 위해, 나는 모든 주석과 코드를 복사 Microsoft's online example에서 오류가 사라지지 않을 것입니다. pFileOpen->Show(NULL); 전화로 인한 것으로 보입니다. 그러나, 나는 새로운 프로젝트를 만들고, 같은 코드를 넣었고, 그 결과는 효과가있었습니다!

#include <windows.h> 
#include <shobjidl.h> 

int main() 
{ 
    HRESULT hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | 
     COINIT_DISABLE_OLE1DDE); 
    if (SUCCEEDED(hr)) 
    { 
     IFileOpenDialog *pFileOpen; 

     // Create the FileOpenDialog object. 
     hr = CoCreateInstance(CLSID_FileOpenDialog, NULL, CLSCTX_ALL, 
       IID_IFileOpenDialog, reinterpret_cast<void**>(&pFileOpen)); 

     if (SUCCEEDED(hr)) 
     { 
      // Show the Open dialog box. 
      hr = pFileOpen->Show(NULL); <-------**Culprit** 

      // Get the file name from the dialog box. 
      if (SUCCEEDED(hr)) 
      { 
       IShellItem *pItem; 
       hr = pFileOpen->GetResult(&pItem); 
       if (SUCCEEDED(hr)) 
       { 
        PWSTR pszFilePath; 
        hr = pItem->GetDisplayName(SIGDN_FILESYSPATH, &pszFilePath); 

        // Display the file name to the user. 
        if (SUCCEEDED(hr)) 
        { 
         MessageBox(NULL, pszFilePath, L"File Path", MB_OK); 
         CoTaskMemFree(pszFilePath); 
        } 
        pItem->Release(); 
       } 
      } 
      pFileOpen->Release(); 
     } 
     CoUninitialize(); 
    } 
    return 0; 
} 

그래서, 나는 두 프로젝트의 속성 페이지를 통해 확인 내 원래의 프로젝트가 GLFW 및 GLEW 라이브러리를 연결했기 때문에 그들이 비난했다 그래서 어쩌면,이이 같은 예는 속입니다. 일단 내가 그들을 제거하고 두 속성 페이지 (예 : 그들은 같은 libs 포함), 내 원래의 프로젝트에 오류가 사라지지 않을 것 같아 보이는 확인했다.

왜 이런 일이 발생하는지 알면 누구나 도움을받을 수 있습니다.

또한이 프로그램이 실행되는 것을 방해하지 않는다는 점에 유의하십시오. 나는 그것을 제거하고 싶습니다.

+2

잘 모르는 코드로 인해 흔하게 발생하는 것은 아닙니다. 프로세스에로드되는 셸 확장은 거기에 많은 나쁜 것들이 있으며 프로그래머의 Win7 시스템에는 뭉툭 해지는 많은 시간이있었습니다. 도움을 얻으려면 스택 추적을 표시해야합니다. –

+2

첫 번째 예외입니까, 두 번째 예외입니까? 첫 번째 예외 일 경우 무시하십시오. 누군가 그것을 키웠고 누군가 그것을 처리했습니다. 계속 전진해라. 누군가가 망 쳤어. 다른 누군가가 망쳐 버릴 준비가되어 있었어. – IInspectable

답변

-2

win32 그룹의 디버그 -> windows-> 예외 설정에서 0xc0000005 예외가 선택되어 있습니까? 내가 그걸 확인하면 당신이 묘사하는 행동 만받습니다. 특히 호출 스택을 살펴보면 예외는 ValidateTreeItem에 있습니다. 0xC0000005를 사용할 수있는 돌파가있는 경우 해당 동작을 얻지 못할 수 있습니다.