타사에서 제공 한 DLL이 있으며 Delphi 2007에서 호출 할 때 완벽하게 정상적으로 작동합니다. 나는 DLL이 컴파일 있었는지 확실하지 않다사전 유니 코드 컴파일 된 DLL은 Delphi XE5에서 호출 할 때 액세스 위반을 발생시킵니다.
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;
: 여기
Procedure XC_eXpressLink(hHandle: Hwnd; Parameters: pChar; Result: pChar); stdcall; external 'XCClient.dll';
프로 시저를 호출 한 방법입니다 : 다음 코드는 DLL이 델파이 2007에 사용 된 방법의 샘플입니다 하지만 그것은 ansi가 아니라 유니 코드가 아니라고 예상하고 있습니다. 다음 델파이 XE5에서 ANSI하는 코드로 변환 후, 코드는 이제 :
Procedure XC_eXpressLink(hHandle: Hwnd; Parameters: pAnsiChar; Result: pAnsiChar); stdcall; external 'XCClient.dll';
및
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는 DLL 절차에 대한 매개 변수를 제공하는 형태에 잇는 TMemo이다. RemoveCRLF는 memoParameters에서 캐리지 리턴 및 줄 바꿈을 제거하는 함수입니다. MemoResults는 dll 프로 시저의 반환 결과를 제공하는 폼의 또 다른 TMemo입니다.
변경된 코드가 Delphi XE5에서 실행되면 액세스 위반이 발생합니다. 전에 ansi를 사용하기 위해 모든 매개 변수를 변경했기 때문에 dll이 이전과 동일한 매개 변수 형식을 사용해서는 안됩니까? 내가 뭔가 잘못하고 있는거야? 이 오래된 컴파일 된 DLL을 Delphi XE5에서 사용할 수 있습니까?
괜찮아 보입니다. 그게 정말로 모든 코드입니다. 2000 자 정도면 어떻게 알 수 있습니까? –
DLL을 제공 한 회사는 DLL 호출 방법을 보여주는 샘플 Delphi 응용 프로그램을 제공했습니다. 그것들은 2000 자로 정의 된 것들입니다. 그들은 또한 "결과 변수 버퍼는 함수를 호출하기 전에 최소 2000 바이트로 사전 할당되어야합니다."라는 사용 설명서를 제공했습니다. –
표시된 Ansi로 변환 된 코드는 기술적으로 정확합니다. AccessViolation을 일으킬 수있는 잘못된 것은 없습니다 ** IF ** 1) DLL이 버퍼 오버 플로우가 아니며 2) 버퍼 출력이 항상 null로 종료됩니다. 반면에 XE5에서 'XC_eXpressLink()'사용과 관련하여 AccessVioation이보고 된 것은 이번이 처음이 아닙니다 ([this] (http://www.codenewsfast.com/cnf/thread/1606749003/permalink) 참조). .thr-ng1909q22754) 및 [this] (http://www.devsuperpage.com/search/Articles.aspx?G=2&ArtID=91383)). * 실제 * AV 오류는 무엇이라고 말합니까? 아직 디버깅을 시도 했습니까? –