Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2006
    Messaggi
    54

    APPCRASH ntdll.dll Framework 4.0

    Buongiorno a tutti
    Di nuovo uno di quei problemi incomprensibii

    Ho un applicativo sviluppato in VB.Net che, per comunicare con un determinato dispositivo, esegue delle chiamate API alla relativa DLL.
    L'applicativo, viene compilato in "x86" e viene eseguito sia su macchine x86 che x64.
    La chiamata alla funzione API ha sempre funzionato correttamente...compilata con VS2005 e Framework2.0 oppure con VS2010 e Framework 3.0.
    Adesso, quando cerco di compilarla con VS2010 e Framework 4.0, funziona correttamente se utilizzo il "Debug" di visualstudio mentre se eseguo il file ".exe" (Debug o Release non cambia) compilato dallo stesso Visual Studio, la funzione mi genera un errore.

    Ho provato anche a modificare la chiamata alla DLL da "Declare Function" a "DllImport" impostando "CallingConvention:=CallingConvention.Cdecl" ma il problema non si risolve. (La CallingConvention è corretta a "Cdecl" in quanto tutte le altre chiamate API funzionano)
    L'errore generato è il seguente:
    Nome evento problema: APPCRASH
    Nome applicazione: xxxx.exe
    Versione applicazione: 4.0.0.0
    Timestamp applicazione: 55361b6e
    Nome modulo con errori: ntdll.dll
    Versione modulo con errori: 6.3.9600.17031
    Timestamp modulo con errori: 5308893d
    Codice eccezione: c0000005
    Offset eccezione: 00041619
    Versione SO: 6.3.9600.2.0.0.256.48
    ID impostazioni locali: 1040
    Informazioni aggiuntive 1: 5861
    Ulteriori informazioni 2: 5861822e1919d7c014bbb064c64908b2
    Ulteriori informazioni 3: bb02
    Ulteriori informazioni 4: bb02c3b29c3f075104f1d0629e885cfc

    Ho provato ad eseguire l'exe compilato con il framework 3.0 sulla stessa macchina e funziona correttamente...non sembra nè un problema di computer (lo fa anche su altri) nè di sistema operativo.
    Qualcuno ha qualche idea di come risolvere o debuggare il problema?
    Grazie mille
    Ultima modifica di mmjc23; 21-04-2015 a 17:43

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    L'eccezione c0000005 indica un puntatore sbagliato. Devi dare maggiori dettagli sulla dichiarazione e su come l'hai usata.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it
    Registrato dal
    May 2006
    Messaggi
    54
    Buongiorno oregon e grazie mille per la risposta e la disponibilità
    Il produttore della DLL, fornisce, con essa, due file (C e C#) contenente la dichiarazione delle funzioni e delle variabili così da prenderne spunto.
    Di seguito, la dichiarazione della funzione data dal produttore:

    Codice PHP:
    // Returns:
    public const Int32 INVALID_PARAMETER = -1;  // Invalid parameter
    public const Int32 NOT_CONNECTED 0;  // Not connected (trying to connect)
    public const CONNECTED 1;  // Connected

    // Method C#:
    [DllImport(ApiDllCallingConvention CallingConvention.Cdecl)]
    public static 
    extern Int32 GetConnectionStatus(out UInt16 NodeNumberout UInt8 BNumberout UInt32 GatewayControlIpAddrOfNodeout UInt16 GatewayControlIpPortOfNodeout string NodeDescriptionString);

    // Method C:
    Int32 __cdecl GetConnectionStatus(UInt16  *NodeNumberUInt8   *BNumberUInt32  *GatewayControlIpAddrOfNodeUInt16  *GatewayControlIpPortOfNode,  char **NodeDescriptionString); 
    Di seguito, la dichiarazione della funzione nel mio codice Vb.Net
    codice:
    //Vecchia dichiarazione (remmata) che, nel Framework 4.0, non passava "CallingConvention.Cdecl"
    //Declare Function GetConnectionStatus Lib "ApiDll" (ByRef NodeNumber As Int16, ByRef BNumber As Byte, ByRef GatewayControlIpAddrOfNode As Int32, ByRef GatewayControlIpPortOfNode As Int16, ByRef NodeDescriptionString As String) As Int32
    
    //Nuova dichiarazione della funzione per Framework 4.0
    <DllImport("ApiDll.dll", CallingConvention:=CallingConvention.Cdecl)> _
    Public Shared Function GetConnectionStatus(ByRef NodeNumber As UInt16, ByRef BNumber As Byte, ByRef GatewayControlIpAddrOfNode As UInt32, ByRef GatewayControlIpPortOfNode As UInt16, ByRef NodeDescriptionString As String) As Int32
    End Function
    Qui di seguito, il suo utilizzo all'interno del codice:
    codice:
    Dim NodeNumber As UInt16
    Dim BNumber As Byte
    Dim GatewayControlIpAddrOfNode As UInt32
    Dim GatewayControlIpPortOfNode As UInt16
    Dim NodeDescriptionString As String = ""
    Dim newRes as Int32 = GetConnectionStatus(NodeNumber, BNumber,  GatewayControlIpAddrOfNode, GatewayControlIpPortOfNode, NodeDescriptionString)
    Niente di particolarmente complicato quindi, se non fosse che con i Framework 2.0 e 3.0 la funzione restituisce correttamente il valore "1 - CONNECTED", mentre, con il framework 4.0, genera l'errore "c0000005" quando viene eseguito l'exe compilato in "Debug" o "Release" da VS2010 mentre funziona correttamente se eseguito in "modalità Debug" all'interno di Visual Studio.

    Grazie a chiunque riuscirà a risolvermi questo maledetto arcano...purtroppo, non posso tornare indietro a Framework precedenti perchè, nuove DLL interne all'applicazione, necessitano l'utilizzo del Framework 4.0

    Buona giornata
    Ultima modifica di mmjc23; 22-04-2015 a 08:35

  4. #4
    Utente di HTML.it
    Registrato dal
    May 2006
    Messaggi
    54
    Aggiornamento della situazione in base agli ultimi test:

    Allora...premetto che il produttore, fornisce due DLL diverse a seconda che l'applicativo giri su CPU x86 o x64.
    La mia applicazione, viene compilata in "x86" e viene eseguita sia su sitemi operativi x86 che x64. Per questo motivo, utilizzo sempre la DLL "x86"; infatti, se utilizzo la DLL "x64" sull'applicativo compilato "x86" la DLL genera un errore in fase di avvio/caricamento.

    Come si può vedere dagli esiti postati qui sotto, la cosa moooltooo strana è che la funzione/applicativo Framework 4.0 funziona correttamente su di un sistema Windows XP x86, mentre "crasha" (ignorando perfino i "Try-Catch") sugli altri sistemi operativi.
    Inutile ribadire che la stessa funzione/applicazione, funziona correttamente su tutti i Sistemi Operativi x86 o x64 con Framework 2.0 e 3.0 (nessuna modifica al codice è stata fatta...si è solo trasportato l'applicativo da Framework 3.0 a 4.0)
    -Windows 8.1 (x64) + DLL (x86): APPCRASH
    -Windows 7 (x64) + DLL (x86): APPCRASH
    -Windows 7 (x86) + DLL (x86): APPCRASH
    -Windows XP (x86) + DLL (x86): NESSUN ERRORE

    Grazie

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.