Violazione di accesso quando si esegue un'applicazione nativa C ++ che utilizza un / CLR DLL costruiti

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

  •  27-09-2019
  •  | 
  •  

Domanda

Sono reorganzing un'eredità mista (DLL gestiti e non gestiti) applicazione in modo che il segmento principale non è gestito MFC e che chiamerà a ++ DLL C compilato con / CLR flag che colmerà la comunicazione tra il gestito (C # DLL) e il codice non gestito. Sfortunatamente, la mia cambiato hanno provocato una violazione di accesso che si verifica prima che l'applicazione InitInstance () è chiamato. Questo rende molto difficile per il debug. L'unica informazione che ottengo è il seguente stack trace.

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

Quindi, ecco alcuni sceanrios che ho provato.
- Acceso eccezioni-> Win32 eccezioni-> c0000005 violazione di accesso a rompere quando viene lanciato. Ancora più particolare che ottengo è da quanto sopra traccia dello stack. Ho provato l'applicazione con F10, ma viene a mancare prima che i punti di interruzione sono colpiti e non riesce con l'analisi dello stack sopra.
-. Ho spense la DLL ponte in modo che abbia un solo metodo che restituisce un bool e che il metodo è codificato per solo falsa ritorno (nessun codice C # chiamato)

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

Se la spense DLL viene compilato con il flag / CLR, l'applicazione non riesce. Se viene compilato senza il flag / CLR, l'applicazione viene eseguita.
- Ho creato un'applicazione stub MFC utilizzando la procedura guidata di Visual Studio per applicazioni multidocumento e chiamo DllPassthrough :: IsFailed (). Questo succede anche con il flag / CLR utilizzato per compilare la DLL.
- Ho provato a fare un LoadLibrary manuale su Winmm.lib come indicato nel seguente nota violazione di accesso quando si utilizza C ++ / CLI . L'applicazione non riesce ancora.
Quindi, le mie domande sono come risolvere il problema? Eventuali suggerimenti, strategie, o incidenti precedenti. E, in mancanza di questo, come posso ottenere maggiori informazioni su cosa segmento di codice o la libreria sta causando l'eccezione di accesso? Se provo soluzioni alternative più coinvolti come fare chiamate LoadLibrary, vorrei restringere alle biblioteche fallimento.
Grazie. A proposito, stiamo usando Visual Studio 2008 e il progetto è in costruzione contro il framework .NET 2.0 per le sezioni gestite.

È stato utile?

Soluzione

Credo di risolvere il mio problema. Eliminando sistematicamente ogni riferimento biblioteca e commentando le chiamate a quel particolare libreria nel codice dell'applicazione (non gestito), alla fine ho rimosso la biblioteca problema e ottenuto il programma da eseguire. E 'un modo forza bruta di diagnosticare il problema, e per fortuna non ho dovuto rimuovere anche molte biblioteche per risolverlo. Mi piacerebbe essere ancora curioso di sapere se qualcuno ha un commento se la libreria avrebbe potuto essere identificato anche se il debugger.
Quindi, il passo successivo è quello di spostare queste chiamate di libreria di codice gestito e passare la parte posteriore informazioni al lato non gestito tramite il mio DLL ponte. A proposito, ho reintegrato il Winmm.lib nel progetto e funziona ancora.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top