Delforex Delphi Xe5


sto porting di un server costruita su Indy TCP componenti da Delphi 7 a XE5 per abilitare il supporto a 64-bit. Ora, dopo che ho fatto tutto il porting e corse il server ha funzionato bene in ambiente di test. Ha funzionato grande fino ad il numero di utenti ha superato 400. Dopo di che inizia la creazione di errori di violazione di accesso. A volte la rottura sull'errore mi indica nei file di origine indy e, talvolta, alla finestra della CPU. Non posso individuare la zona di codice nelle mie fonti in cui viene generato l'errore. Anche se questo tipo di accesso errore di violazione significa che sono l'accesso un oggetto che non è ancora istanziato, ma perché non è il generatore di errore quando meno gli utenti sono in linea e tutto il codice è esattamente uguale al codice Delphi 7, gli oggetti sono accessibili e liberati in allo stesso modo come stavo facendo in Delphi 7. ho letto da qualche parte che la fusione cose relative puntatore dovrebbe usare nativeint invece di IntegerCardinal, Ora, nel codice in cui i dati di processo in ingresso, il codice simile a questo FPacketBuffe r è un puntatore globale dichiarata in ogni classe TMyContext e PacketBufferPtr è una variabile intera dichiarata in ogni classe TMyContext dovrei usare nativeint qui invece del cardinale potrebbe essere questa la radice del problema, se sì, perché non viene creando errore quando il numero di utenti è inferiore a 400, ho provato con tutti le funzioni in ambiente locale e nessuna porzione singola di codice genera un errore. Quello che si deve capire circa 64 bit di codice è che i puntatori sono 64 bit di larghezza. In contrasto con codice a 32 bit in cui i puntatori sono 32 bit di larghezza. Ora, i tipi interi nativi intero e Cardinali sono sempre ampio 32 bit. Chiaramente non si può andare bene tutti i valori a 64 bit in un tipo a 32 bit. Lei ha ragione che questo codice è suddiviso in 64 bit. Casting un puntatore a 64 bit a un intero a 32 bit può portare a troncamento. Il codice può funzionare se l'indirizzo si inserisce nel vostro tipo a 32 bit. Se è necessario eseguire un cast così allora avete bisogno di lanciare a nativeint o NativeUInt. E così come cambiare i calchi, si avrebbe bisogno di dichiarare le variabili che contengono i puntatori come nativeint o NativeUInt. Naturalmente, idealmente si dovrebbe cercare di evitare tali calchi del tutto. È possibile farlo non utilizzando una variabile Integer in per memorizzare i puntatori. puntatori negozio come puntatori, evitare la fusione di numeri interi e non soffrono mai puntatore bug troncamento. Detto questo, il nome di PacketBufferPtr è molto fuorviante. Non è un puntatore come suggerisce il nome. E 'un offset. Dovrebbe essere nominato PacketBufferOffset. Sembra plausibile che non potrà mai superare alto (intero) e quindi forse intero è una scelta sana. Ma non farebbe mai del male a dichiarare di essere NativeUInt. Quindi, supponendo che si dichiara come i puntatori PBYTE. e l'offset come NativeUInt allora il codice dovranno essere scritte in questo modo: E ora il codice è libero di calchi. Vi consiglio di attivare top-down di allocazione della memoria come un aiuto di debug. Questo sarà scovare più bug di questa natura. Grazie, in realtà ho bisogno di questo tipo di operazioni di memoria come i dati ricevuti devono essere memorizzati in una memoria globale e ho bisogno di tenere traccia dei dati che sono stati precedentemente memorizzati in esso e dove aggiungere altri dati in quello spazio di memoria allocato. così io li typecast come nativeint invece del cardinale, e come abilitare dall'alto verso il basso l'allocazione di memoria. ndash Junaid Noor 20 maggio 14 alle 8:09 dall'alto verso il basso memoria dettagli di allocazione qui: msdn. microsoften-uslibrarybb190527.aspx anche se non stupitevi se il vostro AV gag software quando si attiva questa impostazione ndash David Heffernan 20 maggio 14 alle 8: 13I hanno stato per alcune versioni di tempo rilasciando GExperts sperimentali che includono il codice di formattazione precedentemente noto come DelForEx con alcuni miglioramenti e correzioni. L'ultima versione è del 2008-12-26 e supporta le seguenti versioni: Delfi 6-7 Delphi 2005-2010 Delphi XE Delphi XE2 per XE7 Si prega di notare, però, che sto usando solo con Delphi 2007, in modo che le altre versioni può avere bug sconosciuti. Inoltre, non tutti i miglioramenti linguistici di versioni successive Delphi funzioneranno, per esempio tipi nidificati, farmaci generici e metodi anonimi. BTW: Qualsiasi aiuto migliorare il formattatore, in particolare l'aggiunta di nuovi costrutti del linguaggio sarebbe apprezzato. Il codice sorgente può essere scaricato dal repository subversion legato dalla mia homepage. La versione TWM di GExperts funziona bene ed è ben integrato nel IDE. Vi permette di scrivere e modificare il codice senza preoccuparsi troppo di formattazione esatto, quindi basta premere il tasto rapido assegnato e riformatta immediatamente. Ho sempre trovato facile da configurare per abbinare lo stile che preferisco, e non così complesso come Codice Jedi Format, che sembrava eccessivo per me. La versione Delphi 2009 è ora disponibile dal link postato sopra, anche se sulla base di una versione beta di GExperts. E 'ancora molto simile formattatore sotto, però, e non è a conoscenza della sintassi di alcuni dei più recenti miglioramenti Delphi. risposto 31 8 Dicembre a 00:19

Comments