BUG: Viene visualizzato un codice di errore "0xC0000005" quando un evento nativo è generato o sganciamento

Traduzione articoli Traduzione articoli
Identificativo articolo: 811193 - Visualizza i prodotti a cui si riferisce l?articolo.
Espandi tutto | Chiudi tutto

In questa pagina

Sintomi

Quando si attiva l'evento Raise o si scollegare gli eventi nativi (unhook), in un'applicazione non gestita, è possibile che venga visualizzato il seguente messaggio di errore:
Eccezione non gestita in indirizzo virtuale in eseguibile: 0xC0000005: violazione di accesso lettura posizione indirizzo virtuale
dove indirizzo virtuale e eseguibile sono valori che sono specifici per l'applicazione.

Cause

Il problema si verifica quando il costruttore dell'origine eventi viene definito all'esterno dell'ambito di classe. L'elenco del gestore di evento non viene inizializzata nel costruttore dell'origine eventi nel codice inserito. Pertanto, la violazione di accesso si verifica quando si accede a memoria non inizializzata.

Workaround

Per ovviare a questo problema, utilizzare uno dei seguenti metodi:

Metodo 1

Definire il costruttore dell'origine eventi nell'ambito della classe. A tale scopo, sostituire il codice esistente:
struct A {
	__event void Event(); 
	A(); 
	void bar(){} 
};
//Constructor defined outside class scope.
A::A() { } 
con il codice riportato di seguito:
struct A {
	__event void Event(); 
	A() { }; //Contructor defined in class scope.
	void bar(){} 
};

Metodo 2

Includere il codice di inizializzazione eventHandlerList nel costruttore di origine evento. Ciò presuppone che il file cpp contenente la definizione di classe di origine evento Event. Il codice inserito generato dal compilatore può essere archiviato in un file intermedio con supporto dell'opzione del compilatore della riga di comando /Fx .
  1. Al prompt dei comandi, digitare il seguente comando:
    cl /Fx event.cpp
    Il codice inserito generato dal compilatore viene salvato in un file con il. estensione mrg.cpp. Per Event, il file con il codice inserito è event.mrg.cpp.
  2. Nel file intermedio che viene generato (event.mrg.cpp), aggiungere il codice riportato di seguito al costruttore di origine evento:
    • Se la classe di origine eventi denominata A è definita in uno spazio dei nomi X, aggiungere il codice riportato di seguito:
      __eventHandlerList_X_A_Event = 0;
      al costruttore per A.
    • Se la classe di origine eventi denominata A non è definita in qualsiasi spazio dei nomi, aggiungere il codice riportato di seguito:
      __eventHandlerList_A_Event = 0;
      al costruttore per A.
    Dove A è la classe di origine evento, X è lo spazio dei nomi per Aed evento è che l'evento identificato dalla parola chiave Event nell'evento alla classe di origine.
  3. Compilare il file intermedio dal prompt dei comandi con il comando seguente:
    cl event.mrg.cpp

Status

Microsoft ha confermato che si tratta di un bug nei prodotti Microsoft elencati all'inizio di questo articolo.

Informazioni

Procedura per riprodurre il comportamento


È possibile riprodurre il problema con uno dei due seguenti scenari:

Scenario 1

Definire un'origine eventi all'interno di uno spazio dei nomi. Inoltre, l'origine eventi e il ricevente di eventi vengono implementati dalla stessa classe o struttura. A tale scopo, attenersi alla seguente procedura:
  1. In Visual Studio .NET, creare un progetto applicazione Console Win32 in Visual C++.
  2. Nel. cpp file predefinito generato per l'applicazione, sostituire il codice esistente con il codice riportato di seguito:
    #include "stdafx.h"
    namespace X 
    { 
    //Both event source and event receiver
    	struct A {
    	 	__event void Event(); 
    		A(); 
    		void bar(){} 
    	};
    }
     
    X::A::A() { } 
    
    int main()
    { 
    	X::A a; 
    	__hook(&X::A::Event, &a, &X::A::bar, &a); 
    	a.Event(); 
    	__unhook(&X::A::Event, &a, &X::A::bar, &a); 
    } 
  3. Compilare ed eseguire l'applicazione.
Viene visualizzato il messaggio di errore descritto nella sezione "Sintomi" di questo articolo.

Scenario 2

Definire un'origine eventi e il ricevente di eventi in due diverse classi o strutture. A tale scopo, attenersi alla seguente procedura:
  1. In Visual Studio .NET, creare un progetto applicazione Console Win32 in Visual C++.
  2. Nel. cpp file predefinito generato per l'applicazione, sostituire il codice esistente con il codice riportato di seguito:
    #include "stdafx.h"
    //Event source
    struct A {
    	__event void Event();
    	A();
    };
     
    //Event Receiver
    struct B
    {
    	void bar();
    };
    
    void B::bar(){} 
    A::A() { } 
    
    int main()
    {
    	A a;
    	B b;
    	__hook(&A::Event, &a, &B::bar, &b);
    	a.Event();
    	__unhook(&A::Event, &a, &B::bar, &b); 
    }
  3. Compilare ed eseguire l'applicazione.
Viene visualizzato il messaggio di errore descritto nella sezione "Sintomi" di questo articolo.

Il problema si verifica perché il compilatore genera il codice inserito non corretto per il costruttore dell'origine eventi. Per visualizzare il codice inserito generato dal compilatore, compilare il codice precedente al prompt dei comandi come segue:
cl /Fx event.cpp
dove il codice viene salvato in Event. Il codice generato dal compilatore è disponibile in un file denominato event.mrg.cpp. Il costruttore della classe di evento non contiene il seguente codice di inizializzazione eventHandlerList quando il costruttore della classe di evento è definito all'esterno dell'ambito di classe:
  • Quando la classe di origine eventi denominata A è definita in uno spazio dei nomi X
    __eventHandlerList_X_A_Event = 0;
  • Quando la classe di origine eventi denominata A non è definita in qualsiasi spazio dei nomi
    __eventHandlerList_A_Event = 0;
Dove A è la classe di origine evento e X è lo spazio dei nomi per unevento è identificato dalla parola chiave Event nell'evento origine classe.

Nota. La parola chiave Raise evento visualizza inoltre lo stesso comportamento che viene visualizzato dalla parola chiave unhook evento.

Riferimenti

Per ulteriori informazioni sulle parole chiave e attributi di gestione degli eventi nativi, vedere il seguente sito Web MSDN:
Parole chiave di gestione degli eventi
http://msdn2.microsoft.com/en-us/library/6f01ek09 (vs.71).aspx

Proprietà

Identificativo articolo: 811193 - Ultima modifica: martedì 3 settembre 2013 - Revisione: 2.0
Le informazioni in questo articolo si applicano a:
  • Microsoft Visual C++ .NET 2002 Standard Edition
Chiavi: 
kbcompiler kberrmsg kbbug kbmt KB811193 KbMtit
Traduzione automatica articoli
IMPORTANTE: il presente articolo è stato tradotto tramite un software di traduzione automatica di Microsoft ed eventualmente revisionato dalla community Microsoft tramite la tecnologia CTF (Community Translation Framework) o da un traduttore professionista. Microsoft offre articoli tradotti manualmente e altri tradotti automaticamente e rivisti dalla community con l?obiettivo di consentire all'utente di accedere a tutti gli articoli della Knowledge Base nella propria lingua. Tuttavia, un articolo tradotto automaticamente, anche se rivisto dalla community, non sempre è perfetto. Potrebbe contenere errori di vocabolario, di sintassi o di grammatica. Microsoft declina ogni responsabilità per imprecisioni, errori o danni causati da una traduzione sbagliata o dal relativo utilizzo da parte dei clienti. Microsoft aggiorna frequentemente il software e gli strumenti di traduzione automatica per continuare a migliorare la qualità della traduzione.
Clicca qui per visualizzare la versione originale in inglese dell?articolo: 811193
LE INFORMAZIONI CONTENUTE NELLA MICROSOFT KNOWLEDGE BASE SONO FORNITE SENZA GARANZIA DI ALCUN TIPO, IMPLICITA OD ESPLICITA, COMPRESA QUELLA RIGUARDO ALLA COMMERCIALIZZAZIONE E/O COMPATIBILITA' IN IMPIEGHI PARTICOLARI. L'UTENTE SI ASSUME L'INTERA RESPONSABILITA' PER L'UTILIZZO DI QUESTE INFORMAZIONI. IN NESSUN CASO MICROSOFT CORPORATION E I SUOI FORNITORI SI RENDONO RESPONSABILI PER DANNI DIRETTI, INDIRETTI O ACCIDENTALI CHE POSSANO PROVOCARE PERDITA DI DENARO O DI DATI, ANCHE SE MICROSOFT O I SUOI FORNITORI FOSSERO STATI AVVISATI. IL DOCUMENTO PUO' ESSERE COPIATO E DISTRIBUITO ALLE SEGUENTI CONDIZIONI: 1) IL TESTO DEVE ESSERE COPIATO INTEGRALMENTE E TUTTE LE PAGINE DEVONO ESSERE INCLUSE. 2) I PROGRAMMI SE PRESENTI, DEVONO ESSERE COPIATI SENZA MODIFICHE, 3) IL DOCUMENTO DEVE ESSERE DISTRIBUITO INTERAMENTE IN OGNI SUA PARTE. 4) IL DOCUMENTO NON PUO' ESSERE DISTRIBUITO A SCOPO DI LUCRO.

Invia suggerimenti

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com