2016-08-11 1 views
0

Ich habe eine DLL, die von einer Drittanbieter-Firma zur Verfügung gestellt wurde, und als es von Delphi 2007 aufgerufen wurde, funktionierte es einwandfrei. Der folgende Code ist ein Beispiel dafür, wie die DLL in Delphi 2007 verwendet wurden:Pre-Unicode kompilierte DLL gibt Zugriffsverletzungen beim Aufruf von Delphi XE5

Procedure XC_eXpressLink(hHandle: Hwnd; Parameters: pChar; Result: pChar); stdcall; external 'XCClient.dll'; 

Hier ist, wie die Prozedur aufgerufen wurde:

procedure TForm1.Button1Click(Sender: TObject); 
    var Result: array[0..2000] of char; 
    sParams: String; 
begin 
    sParams := RemoveCRLF(memoParameters.Text); //Remove TMemo CR/LF 
    XC_eXpressLink(Handle, pChar(sParams), Result); 
    memoResults.Text := String(Result); 
end; 

Ich bin nicht sicher, was die DLL kompiliert wurde in, aber ich nehme an, dass es Ansi und nicht Unicode erwartet. Nachdem der Code Umwandlung in Delphi XE5 ANSI-, ist der Code nun wie folgt:

Procedure XC_eXpressLink(hHandle: Hwnd; Parameters: pAnsiChar; Result: pAnsiChar); stdcall; external 'XCClient.dll'; 

und

procedure TForm1.Button1Click(Sender: TObject); 
    var Result: array[0..2000] of Ansichar; 
    sParams: AnsiString; 
begin 
    sParams := RemoveCRLF(memoParameters.Text); //Remove TMemo CR/LF 
    XC_eXpressLink(Handle, pAnsiChar(sParams), Result); 
    memoResults.Text := AnsiString(Result); 
end; 

memoParameters eine TMemo auf der Form vorliegt, die die Parameter für die DLL-Prozedur bietet. Die RemoveCRLF ist eine Funktion, die alle Wagenrücklaufzeichen und Zeilenvorschübe aus MemoParameters entfernt. MemoResults ist ein anderes TMemo in dem Formular, das die Rückgabeergebnisse der Dll-Prozedur bereitstellt.

Ich bekomme Zugriffsverletzungen, wenn der geänderte Code in Delphi XE5 ausgeführt wird. Da ich alle Parameter geändert habe, um Ansi zu verwenden, sollte die DLL nicht das gleiche Parameterformat wie zuvor bekommen? Mache ich etwas falsch? Kann ich diese ältere kompilierte DLL in Delphi XE5 verwenden?

+0

Das sieht gut aus. Ist das wirklich der ganze Code? Und woher wissen Sie 2000 Zeichen ist genug. –

+0

Die Firma, die die DLL zur Verfügung stellte, gab eine Delphi-Beispielanwendung, die zeigte, wie man ihre DLL aufruft. Sie waren diejenigen, die es bei 2000 Zeichen definiert haben. Sie stellten auch eine Bedienungsanleitung zur Verfügung, die besagt: "Der Puffer der Ergebnisvariablen muss vor dem Aufruf der Funktion auf mindestens 2000 Bytes vorbelegt werden." –

+0

Der angezeigte Ansi-konvertierte Code ist technisch korrekt, es ist nichts falsch daran, das eine AccessViolation verursachen sollte ** IF ** 1) die DLL überläuft den Puffer nicht, und 2) der Pufferausgang ist immer null-terminiert. Auf der anderen Seite ist dies nicht das erste Mal, dass eine AccessVioation im Zusammenhang mit der Verwendung von 'XC_eXpressLink()' in XE5 berichtet wurde (siehe [dies] (http://www.codeenwsfast.com/cnf/thread/1606749003/permalink) .thr-ng1909q22754) und [dies] (http://www.devsuperpage.com/search/Articles.aspx?G=2&ArtID=91383)). Was sagt der * aktuelle * AV Fehler? Hast du schon versucht es zu debuggen? –

Antwort

0

Ich kontaktierte die Firma, OpenEdge, die die DLL für X-Charge (für Kreditkartenintegration) liefert. Um das Problem zu lösen, muss der Handle einen Wert von haben und Sie müssen /IGNOREHANDLEPARAMETER zu der Parameterliste hinzufügen, die an die DLL gesendet wird. Beachten Sie, dass dieser Parameter nur mit der Vollversion XC8.1.1.6.exe Installation oder höher funktioniert.

procedure TForm1.Button1Click(Sender: TObject); 
    var Result: array[0..2000] of Ansichar; 
    sParams: AnsiString; 
begin 
    sParams := RemoveCRLF(memoParameters.Text); //Remove TMemo CR/LF 
    XC_eXpressLink(0, pAnsiChar(sParams), Result); 
    memoResults.Text := AnsiString(Result); 
end; 
Verwandte Themen