2012-04-10 6 views
1

Ich habe sowohl Delphi7 und DelphiXE2 (beide 32-Bit) auf meinem Rechner installiert. Und ich muss eine Funktion openSocket() von DLL 'libnodave.dll' verwenden.DelphiXE2 vs Delphi7. DLL-Verhalten hängt von Aufruf Prozess

Das Problem ist, dass in Delphi7 und in .exe-Datei kompiliert von D7 diese Funktion in einem Moment ausgeführt wird und einige Integer-Wert zurückgibt, aber in DelphiXE2 stoppt es für 3 Sekunden (Timeout ich denke) und gibt Null zurück. Ich habe versucht, eine Art "Proxy-DLL" in D7 zu schreiben, die dieselbe Funktion von der ursprünglichen DLL intern aufruft, aber es funktioniert nicht. Nun interessiert mich, welche anderen Informationen der Programmausführung neben lokalen Funktionsparametern an dll übergeben wird. Wie es dazu kommen konnte, dass die Bibliothek Unterschiede in ihrem Verhalten macht, hängt davon ab, wer die Funktion aufruft. Und gibt es eine Möglichkeit, den DelphiXE-Compiler als D7-Compiler zu konfigurieren? Noch eine kleine Frage: Wie kann ich beim Debuggen alle im Programm definierten globalen Parameter (wie {$ DEFINE WIN32}) durchsehen.

Danke für irgendwelche Ideen.

Antwort

1

Das Problem ist, dass in Delphi7 und in EXE-Datei, die von D7 kompilierte diese Funktion in einem Moment ausgeführt wird, und gibt einen Integer-Wert, aber in DelphiXE2 stoppt sie für 3 Sekunden (timeout i guess) und kehrt Null.

Wie sieht die Deklaration der Funktion openSocket() aus? Stimmen die Aufrufkonventionen in beiden Versionen überein? Verfügt die Funktion über String Parameter? Denken Sie daran, dass String Ansi in D7 und Unicode in DXE2 ist. Stellen Sie sicher, dass die Funktion mit derselben Aufrufkonvention deklariert ist und alle Parameter in beiden Versionen mit den richtigen Datentypen deklariert sind.

Ich bin interessiert, welche anderen Informationen der Programmausführung zu DLL neben lokalen Funktionsparameter übergeben wird.

Mit Ausnahme der Parameterwerte werden keine Informationen an die Funktion übergeben.

Gibt es eine Möglichkeit, den DelphiXE-Compiler als D7-Compiler zu konfigurieren?

Nein, Sie können nicht den XE2-Compiler wie den D7-Compiler handeln.

Wie kann ich während der Fehlersuche alle im Programm definierten globalen Parameter (wie {$ DEFINE WIN32}) durchsehen.

Es gibt keine Möglichkeit, die aktiven Compiler DEFINEs zur Debug-Zeit anzuzeigen. Zur Bearbeitungszeit gibt es jedoch eine Tastenkombination, Ctrl + O + O, das die aktuell aktiven DEFINEs in Ihren Quellcode einfügt.

+0

Das wäre 'Strg + O + O', aber es enthält keine Dinge wie' WIN32' oder 'POSIX'. Es enthält Dinge wie Warnungen, Bereichsüberprüfung und Überlauf, Minengröße und dergleichen (IOW, die Definition, die Sie ändern können, nicht die eingebauten Konstanten). –

+0

@KenWhite: Danke für die Info. –

2

Es gibt keinen Unterschied zwischen dem Aufruf von DLL-Funktionen in Delphi 7 und XE2. Aber Funktion deklariert als

function openSocket(port:longint;name:pchar):longint; stdcall; 
    external LibName {$ifdef WIN32} name 'openSocket'{$ENDIF}; 

wo PChar AnsiChar in Delphi 7, aber Unicode (WideChar) in XE2 war.Ich kann mir denken, es ist immer noch AnsiChar in dieser DLL und Sie können:

  1. openSocket (Ihr_Port, PAnsiChar (UTF8Encode (name))), wobei Name string Typ ist (Sie werden Warnungen sehen)
  2. Umbenennungs alle Vorkommen von pchar bis PAnsiChar in nodave.pas und verwenden Sie AnsiString und PAnsiString anstelle von string und pchar.
Verwandte Themen