2016-08-11 2 views
0

타사에서 제공 한 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에서 사용할 수 있습니까?

+0

괜찮아 보입니다. 그게 정말로 모든 코드입니다. 2000 자 정도면 어떻게 알 수 있습니까? –

+0

DLL을 제공 한 회사는 DLL 호출 방법을 보여주는 샘플 Delphi 응용 프로그램을 제공했습니다. 그것들은 2000 자로 정의 된 것들입니다. 그들은 또한 "결과 변수 버퍼는 함수를 호출하기 전에 최소 2000 바이트로 사전 할당되어야합니다."라는 사용 설명서를 제공했습니다. –

+0

표시된 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 오류는 무엇이라고 말합니까? 아직 디버깅을 시도 했습니까? –

답변

0

저는 X-charge (신용 카드 통합 용) 용 DLL을 제공하는 OpenEdge에 연락했습니다. 문제를 해결하려면 핸들은 이어야하며 dll로 전송되는 매개 변수 목록에 /IGNOREHANDLEPARAMETER을 추가해야합니다. 이 매개 변수는 XC8.1.1.6.exe 풀 버전 설치 이상에서만 작동합니다.

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; 
관련 문제