Zugriffsverletzung beim Ausführen native C ++ Anwendung, dass Verwendungen a / clr DLL gebaut

StackOverflow https://stackoverflow.com/questions/2645961

  •  27-09-2019
  •  | 
  •  

Frage

Ich bin reorganzing ein Vermächtnis gemischt (verwaltete und nicht verwaltete DLLs) Anwendung, so dass das Hauptsegment nicht verwalteten MFC ist, und das wird eine C ++ DLL kompiliert mit / CLR-Flag aufrufen, die die Kommunikation zwischen den verwalteten brücken (C # DLLs) und nicht verwalteten Code. Unfortuantely, meine geändert haben in einer Zugriffsverletzung geführt, die vor der Anwendung InitInstance auftritt () aufgerufen wird. Dies macht es zum Debuggen sehr schwierig. Die einzige Information, die ich erhalte, ist der folgende Stack-Trace.

>   64006108()  
ntdll.dll!_ZwCreateMutant@16()  + 0xc bytes 
kernel32.dll!_CreateMutexW@12()  + 0x7a bytes   

So, hier sind einige sceanrios ich versucht habe.
- Dreh auf Exceptions-> Win32 Exceptions-> C0000005 Zugriffsverletzung zu brechen, wenn Geworfen. Immer noch das Detail I get ist aus dem obigen Stack-Trace. Ich habe die Anwendung mit F10 versucht, aber es funktioniert nicht, bevor Haltepunkte getroffen werden und nicht mit dem oben Stack-Trace.
-. Ich habe so die Brücke DLL stubbed heraus, dass es nur eine Methode hat, dass eine Rückkehr Bool und diese Methode nur return false codiert (kein C # -Code genannt)

bool DllPassthrough::IsFailed() { return false; }

Wenn die stubbed aus DLL mit dem / clr-Flag kompiliert wird, schlägt die Anwendung fehl. Wenn es ohne den / clr-Flag kompiliert, die Anwendung ausgeführt wird.
- Ich habe einen Stummel MFC-Anwendung mit dem Visual Studio-Assistenten für Multidokument-Anwendungen und rufen DllPassthrough :: IsFailed () erstellt. Dies gelingt auch mit dem / clr-Flag verwendet, um die DLL zu kompilieren.
- Ich habe versucht, ein Handbuch auf Loadlibrary Winmm.lib tun, wie in der folgenden Anmerkung: Zugriffsverletzung, wenn c ++ / cli . Die Anwendung immer noch nicht.
Also, meine Fragen sind, wie das Problem zu lösen? Für Hinweise, Strategien oder frühere Vorfälle. Und, falls dies nicht möglich, wie kann ich weitere Informationen erhalten, auf welche Codesegment oder Bibliothek wird die Zugriffsausnahme verursacht? Wenn ich mehr beteiligt Abhilfen wie tun Loadlibrary Anrufe versuchen, würde Ich mag es den Fehler Bibliotheken verengen.
Vielen Dank. BTW, wir sind mit Visual Studio 2008 und das Projekt gegen den für die verwalteten Abschnitte .NET 2.0 Framework gebaut wird.

War es hilfreich?

Lösung

Ich glaube, ich mein Problem zu lösen. Durch die systematische jede Bibliothek Referenz zu entfernen und die Anrufe auf die jeweilige Bibliothek im Anwendungscode (unmanaged), habe ich schließlich das Problem Bibliothek entfernt und bekam das Programm kommentieren heraus zu laufen. Es ist ein Brute-Force-Weg, das Problem zu diagnostizieren, und zum Glück habe ich nicht zu viele Bibliotheken zu entfernen, um es zu lösen. Ich würde immer noch neugierig, wenn jemand einen Kommentar hat, wenn die Bibliothek wenn der Debugger identifiziert worden sein könnte.
So ist der nächste Schritt, um diese Bibliothek Anrufe an verwalteten Code bewegen und die Informationen zurück an der nicht verwalteten Seite über meine Brücke DLL übergeben. BTW, ich die Winmm.lib in das Projekt eingegliedert und es funktioniert immer noch.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top