Catturare l'eccezione AccessViolationException

di il
10 risposte

Catturare l'eccezione AccessViolationException

Salve,
ho iniziato da poco a programmare e conosco ancora poco di c++. Ho scritto un programma che in fase di compilazione non mi da nessun errore ma a runtime viene sollevata un'Eccezione col seguente messaggio:
An unhandled exception of type 'System.AccessViolationException' occurred.

Il mio problema è che quando utilizzo il try{ }catch(){} per trattare l'eccezione sbaglio qualche cosa.
Il mio utilizzo è il seguente:

try{
<riga che solleva l'eccezione>
}catch(AccessViolationException ex){ <faccio quzlche cosa> }

Dov'è che sbaglio? Quale header non ho incluso?
Grazie in anticipo.

10 Risposte

  • Re: Catturare l'eccezione AccessViolationException

    AccessViolationException NON è C++, se mai è .Net.
  • Re: Catturare l'eccezione AccessViolationException

    Mmmmmm.... allora non ho chiara la situazione. Come faccio a trattare questa eccezione?
  • Re: Catturare l'eccezione AccessViolationException

    Non so molto sul .Net ma mi sembra che stai andando a leggere/scrivere su una indirizzo inesistente, Ciò significa rivedere il codice se c'è qualche bug.
  • Re: Catturare l'eccezione AccessViolationException

    Sono del tuo stesso parere quando dici di dover rivedere il codice; è da questa mattina che lo rivedo e non riesco a trovare il problema. in debug, mi viene sollevato il problema, e successivamente continuo l'esecuzione e tutto funziona perfettamente. Vorrei catturare l'eccezione e ignorarla di modo che riesco a continuare senza problemi l'esecuzione del codice. Il problema è che non so utilizzare il try{} catch in c++. in C# o java è molto facile, in c++ sto avendo problemi.
  • Re: Catturare l'eccezione AccessViolationException

    Allora posta il codice. Ti sto dicendo che non stai programmando in C++
  • Re: Catturare l'eccezione AccessViolationException

    Il codice è il seguente:
    
    void GetVersion(BYTE ver[3])
    {
    	CString C;
    	C.Format("#%i", VS_VERSION_INFO);
    	HMODULE h = g_WinApp.m_hInstance;
    	HRSRC	hFileResource = FindResource(h, C, RT_VERSION);
    	if (!hFileResource) return;
    
    	HGLOBAL hMemoryRes = LoadResource (h, hFileResource);
    	if (!hMemoryRes) return;
    
    	LPVOID lpLockedResource = LockResource (hMemoryRes);
    	if (!lpLockedResource) return;
    
    	VS_FIXEDFILEINFO * FileInfo = NULL;
    	unsigned int nLen                = 0;
    	BOOL BRetVal	                  = NULL;
    	try{
    		BRetVal = VerQueryValue(lpLockedResource, "\\", (void **)&FileInfo, &nLen);
    	}catch(...){}
    	if (!BRetVal) return;
    
    	ver[0] = (BYTE) (FileInfo->dwFileVersionMS >>  16);
    	ver[1] = (BYTE) (FileInfo->dwFileVersionMS  & 0xf);
    	ver[2] = (BYTE) (FileInfo->dwFileVersionLS >>  16);
    	return;
    }
    
    L'eccezione mi viene sollevata alla seguente riga:
    BRetVal = VerQueryValue(lpLockedResource, "\\", (void **)&FileInfo, &nLen);
    che attualmente ho messo in un try{}catch che in teoria dovrebbe catturare tutti i tipi di eccezione.
  • Re: Catturare l'eccezione AccessViolationException

    
    VS_FIXEDFILEINFO *FileInfo = NULL;
    .....
    
     BRetVal = VerQueryValue(lpLockedResource, "\\", (void **)&FileInfo, &nLen);
    
    come ti sembra? Secondo me stai sbagliando scrivendo su una variabile NULL.

    soluzione
    
    VS_FIXEDFILEINFO FileInfo;
    .....
    
     BRetVal = VerQueryValue(lpLockedResource, "\\", &FileInfo, &nLen);
    
  • Re: Catturare l'eccezione AccessViolationException

    Avevo valorizzato a null quella variabile per tentarle tutte. Ad ogni modo, ho provato a dichiararlo senza inizializzarlo e ottengo sempre lo stesso errore.

    Non posso poi scrivere
    BRetVal = VerQueryValue(lpLockedResource, "\\", &FileInfo, &nLen);
    senza (void **) altrimenti ottengo il seguente errore:

    error C2664: 'VerQueryValueA' : cannot convert parameter 3 from 'VS_FIXEDFILEINFO **' to 'LPVOID *'
  • Re: Catturare l'eccezione AccessViolationException

    Questo a me funziona.
    
        void GetVersion(BYTE ver[3])
        {
           CString C;
           C.Format("#%i", VS_VERSION_INFO);
           HMODULE h = theApp.m_hInstance;
           HRSRC   hFileResource = FindResource(h, C, RT_VERSION);
           if (!hFileResource) return;
    
           HGLOBAL hMemoryRes = LoadResource (h, hFileResource);
           if (!hMemoryRes) return;
    
           LPVOID lpLockedResource = LockResource (hMemoryRes);
           if (!lpLockedResource) return;
    
    	   VS_FIXEDFILEINFO FileInfo = {0};
           unsigned int nLen                = 0;
           BOOL BRetVal                     = NULL;
           BRetVal = VerQueryValue(lpLockedResource, "\\", reinterpret_cast<LPVOID *>(&FileInfo), &nLen);
          
           ver[0] = (BYTE) (FileInfo.dwFileVersionMS >>  16);
           ver[1] = (BYTE) (FileInfo.dwFileVersionMS  & 0xf);
           ver[2] = (BYTE) (FileInfo.dwFileVersionLS >>  16);
           return;
        }
    
  • Re: Catturare l'eccezione AccessViolationException

    Ecco una versione di un programma che avevo fatto tempo fa per recuperare la versione del eseguibile. E' + o meno come la tua ma un pò meglio.
    
    CString CPM2Dlg::GetVersion(void)
    {
    	CString csRet;
    	HMODULE hLib = AfxGetResourceHandle();
    	HRSRC hVersion = FindResource( hLib, MAKEINTRESOURCE(VS_VERSION_INFO), RT_VERSION );
    	if (hVersion != NULL)
    	{
    		HGLOBAL hGlobal = LoadResource( hLib, hVersion ); 
    		if ( hGlobal != NULL)  
    		{  
    
    			LPVOID versionInfo  = LockResource(hGlobal);  
    			if (versionInfo != NULL)
    			{
    				DWORD unused;
    				VS_FIXEDFILEINFO * pFileInfo = NULL;
    				if (!VerQueryValue(versionInfo, _T("\\"), (LPVOID *)&pFileInfo, (UINT *)&unused))
    				{
    					csRet = L"";
    				}
    				else
    				{
    					csRet.Format(L"Version - %d.%d.%d.%d",
    								HIWORD(pFileInfo->dwProductVersionMS),
    								LOWORD(pFileInfo->dwProductVersionMS),
    								HIWORD(pFileInfo->dwProductVersionLS),
    								LOWORD(pFileInfo->dwProductVersionLS));
    				}
    			}
    		}
    
    		UnlockResource( hGlobal );  
    		FreeResource( hGlobal );  
    	}
    
    	return csRet;
    }
    
Devi accedere o registrarti per scrivere nel forum
10 risposte