2017-12-31 67 views
-1

Ich verwende Windows 7 64-Bit und Visual Studio C++ 2017 Community. Ich versuche, einen Windows-Datei-Dialog zu erstellen IFileOpenDialog, aber ich halte diese beide Zugriffsverletzung Fehler bekommen, wenn das Programm beendet:IFileOpenDialog Zugriffsverletzung

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. 

In einem Versuch, die Zugriffsverletzungen zu debuggen, kommentierte ich alles aus und Code kopiert von Microsoft's online example, aber der Fehler würde nicht weggehen. Es schien durch pFileOpen->Show(NULL); Anruf verursacht werden. Allerdings habe ich ein neues Projekt erstellt und den gleichen Code eingefügt, und voila, es hat funktioniert! Dies ist, was das Beispiel aussah:

#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; 
} 

Also, ich durch beiden Projekte Eigenschaftsseiten überprüft, da mein ursprüngliches Projekt GLFW und GLEW Bibliotheken verknüpft hatte, vielleicht waren sie schuld. Sobald ich sie entfernte und sicherstellte, dass beide Eigenschaftenseiten gleich aussahen (zB: sie enthielten die gleichen Bibliotheken), würde der Fehler in meinem ursprünglichen Projekt nicht verschwinden.

Wenn jemand eine Idee hat, warum dies geschieht, würde jede Hilfe geschätzt werden.

Beachten Sie auch, dies verhindert nicht, dass das Programm ausgeführt wird, ich möchte es einfach loswerden.

+2

Es wird nicht selten von Code verursacht, den Sie nicht kennen. Shell-Erweiterungen, die in Ihren Prozess geladen werden, gibt es eine Menge schlechter da draußen und ein Win7-Rechner eines Programmierers hatte viel Zeit, um Cruft zu sammeln. Sie müssen den Stack-Trace anzeigen, um Hilfe zu erhalten. –

+2

Ist dies eine Ausnahme der ersten Chance oder eine Ausnahme der zweiten Chance? Wenn es eine Ausnahme der ersten Chance ist, ignoriere es einfach. Jemand hob es auf, und jemand kümmerte sich darum. Einfach weitergehen. Jemand hat es vermasselt, und jemand anderes war darauf vorbereitet, dass jemand anderes etwas vermasselte. – IInspectable

Antwort

-2

Haben Sie die Ausnahme 0xc0000005 unter Debug-> Windows-> Ausnahmeeinstellungen in der Win32-Gruppe aktiviert? Ich bekomme nur das Verhalten, das du beschreibst, wenn ich das überprüft habe. Und insbesondere, wenn ich auf den Aufruf-Stapel schaue, ist die Ausnahme in ValidateTreeItem. Mir ist keine Möglichkeit bekannt, dieses Verhalten nicht zu erhalten, wenn Sie für 0xC0000005 aktiviert haben.