Domanda

Sto avendo un problema con un'applicazione Delphi su alcuni server Windows 2003. Esso utilizza una chiamata webservice per la connessione con un altro server e trasmettere i dati avanti e indietro. Non appena l'applicazione arriva al metodo di autenticazione, l'applicazione muore. L'applicazione ha lavorato per anni su scatole precedenti con Windows Server 2003, ma non su di fresco macchine costruite. Le macchine sono impostati allo stesso modo per la maggior parte, ma non v'è chiaramente una certa regolazione di configurazione diversa che io non sono in grado di rintracciare. Inoltre, mentre l'errore diventa evidente nella chiamata per l'autenticazione, packet sniffing dimostra che non succede mai niente tra l'applicazione e il server sta cercando di contattare, che rafforza il mio pensiero che qualcosa sta morendo nella fase iniziale nella creazione della connessione. Non riesco a riprodurre l'errore a livello locale, quindi non posso fare un passo attraverso l'applicazione in un debugger sia. Dei pensieri su perché un Delfi connessione web Indy 9 potrebbe fallire in modo silenzioso?

È stato utile?

Soluzione

Ecco dove si soffiava su:

MySoapObject := GetNewSoapObject(usewsdl, addr, FHTTPRIO);  
 ...   
if MySoapObject <> nil then   
  MySoapObject.SomeFunction(); // BOOM! Access Violation here.

soluzione trovata! Si è scoperto essere DEP (Data Execution Prevention). Quando ho ricostruito il nostro codice con le librerie di sapone Delphi2007, il problema soltanto se ne andò. Dato che non ho voglia di fare che (de-serializzazione ha causato problemi che hanno reso lo starter server sul nostro XML), e la mia mons davvero non voleva farlo (numerosi test di regressione coinvolti), ho cercato le differenze tra il SOAP codice sorgente tra la D2005 e D2007, con l'idea di fare un cambiamento mirato su qualunque era differente tra i due. vale a dire la differenza che fa la differenza. Beyond Compare era il mio amico qui. Un cambiamento di tipo si è distinto come strano - il RIO.PAS ora include un nuovo PrivateHeap.pas unità. Chiedendo perché, ho cercato su google e ho trovato un problema simile con una spiegazione che sembrava essere proprio sulla destinazione.

  

Il DEP problema è fondamentalmente che   a partire da Windows XP Service Pack   2, se l'hardware è in grado ,   Windows impedisce l'esecuzione di codice   dalla memoria non eseguibile.   Purtroppo la SOAP runtime Delphi   crea un gruppo di thunk e il   memoria allocata per questi non erano   marcata eseguibile. Così, quando il sistema operativo   aggiornamento è stato rilasciato il grado   hardware, si otterrebbe un AV quando   invocando un metodo sostenuto da un RIO   componente . Questo problema è stato affrontato in   un aggiornamento con l'unità PrivateHeap.
  - Jean-Marie Babet
       http://delphigroups.info/2/11/344230.html

Bingo! Ora qui è dove ottiene ingannevole. Il DEP è sempre stata abilitata sui nostri server. Così in un primo momento, questo sembrava non era probabile. Ma DEP è difficile, e l'hardware più recente è più capace rispetto al vecchio hardware. Quindi penso che abbiamo ottenuto eliminando i problemi DEP in passato, e ora l'hardware più recente degli Stati Uniti è inciampare. Il nostro amministratore del server capovolto protezione DEP off (per le applicazioni terze parti), riavviato, e il nostro vecchio codice ha funzionato! Mentre ci poi passare alle librerie più recenti, questa sarà una grande correzione a breve termine per noi in quanto ci permette di evitare di dover test di regressione questa applicazione che funziona bene altrimenti.

Quindi, per riassumere: La nostra applicazione è stata Delphi2005 blocca sul server Windows2003 di nuova costruzione a causa di Data Execution Prevention (DEP) interferendo con la creazione dell'oggetto HTTPRIO. Il RIO sarebbe stato creato senza eccezioni, è apparso valido. Ma quando è stato utilizzato l'oggetto IInvokable associato, si getterebbe una violazione di accesso, prima di tentare di comunicare sul filo a tutti. Complimenti ai nostri amministratori cooperative e molto paziente, collega dev Mcmar, Beyond Compare, e Jean-Marie Babet.

Altri suggerimenti

Potrebbe essere il firewall che causa problemi nel 2003?

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