2016-10-24 2 views
1

첫 번째 질문은 여기에 있습니다. 내가 잘못하면 힌트를주세요.Delphi wrapper를 통해 C++ 함수를 호출하는 방법

내 질문 : 델파이 래퍼 (VCL)를 통해 C++ 함수를 호출해야합니다. 델파이 래퍼는 다음과 같습니다.

function TFoxBurnerSDK.ReadFileContents(FilePath: string; Offset: int64; var Buffer; Length: integer; var ActualLength: integer): boolean; 
begin 
    CheckActive; 
    if FSessionHandle=nil then begin 
     FLastError:=BS_SDK_ERROR_BAD_REQUEST; 
     Result:=false; 
     Exit; 
    end; 
    Result:=DLLResult(FoxBurnerSDKCore.ReadFileContents(FSessionHandle, 
     PFoxSDKChar(FoxSDKString(FilePath)), Offset, @buffer, Length, @ActualLength)); 
end 

델파이 코드에서이 함수를 호출하는 방법. var/parameter를 함수에 보내야한다는 것을 의미합니까? 이 버퍼와 ActualLength 포인터는 C++로

int32 BS_CALL ReadFileContents(HSESSION hSession, const TCHAR* lpszFilePath, int64 nOffset, void* pBuffer, int32 nBufferSize, int32* pRead); 

을 것 같다 그리고 델파이에서 포인터를 처리하는 방법, 나에 대한 문제입니다.

procedure TForm1.Button1Click(Sender: TObject); 
var Bytes: TBytes; 
iRead : integer; 
begin 
SetLength(Bytes, 2352*27); 
iRead:=0; 

Burner.ReadFileContents('\autorun.inf', 0, Bytes, 2352*27, iRead); 

end; 

그러나이 메모리 expection가 발생합니다 :이 델파이 옳은이라고 생각했다. C++ 샘플에서 함수를 호출하면 잘 작동합니다. 델파이에서 방금 expection이 일어납니다. 그래서 나는 뭔가 잘못했다고 생각합니다.

답변을 얻으려는 데 필요한 모든 정보를 제공했으면합니다. 그렇지 않다면 내가 놓친 것을 알려주십시오. 고맙습니다.

추가 정보 : 정의 :

ReadFileContents : function (Session: HSESSION; FilePath: PFoxSDKChar; Offset: int64; Buffer: pointer; BufferSize: integer; Read: pinteger): integer; stdcall; 

function ReadFileContents(FilePath: string; Offset: int64; var Buffer; Length: integer; var ActualLength: integer): boolean; 
+0

'FoxBurnerSDKCore.ReadFileContents'의 정의를 보여 주어야합니다. – AmigoJack

+0

안녕하세요 AmigoJack, 질문에 견적을 추가했습니다. – IFDev

+0

여기에 충분한 정보가 없습니다. 따라서 downvote 및 닫기 투표. 함수를 호출하는 방법에 대한 자세한 설명을 제공하고 코드를 쉽게 읽을 수 있도록 형식을 지정하십시오. –

답변

0

그것은이 방법으로 정의해야합니다

ReadFileContents: function 
(Session: HSESSION // HSESSION 
; FilePath: PChar // TCHAR* 
; Offset: Int64 // int64 
; Buffer: Pointer // void* 
; BufferSize: Integer // int32 
; Read: PInteger // int32* 
): Integer; // int32 
cdecl; // C++, don't know why you use stdcall 

을 그리고 전화가

var 
    iResult, iLength, iRead: Integer; 
    sFilePath: String; 
    iOffset: Int64; 
    aBuf: Array of Byte; 
begin 
    iLength:= 5; 
    SetLength(aBuf, iLength); 
    iResult:= ReadFileContents(FSessionHandle, PChar(sFilePath), iOffset, @aBuf[0], iLength, @iRead); 
+0

@buffer [0]은 컴파일러 오류를 일으 킵니다. – IFDev

+0

"a"를 정의하십시오.또한 전체 호출 예제에 대한 내 대답을 편집했기 때문에 우리가 모르는 유형을 피델 리얼하지 않습니다. – AmigoJack

+0

이 함수에서 모든 것이 주석 처리 된 DLL 버전이 있습니다. 그래서 함수는 충돌을 일으킬 것입니다. 그렇다면 C++ 함수의 선언이 잘못되었을 가능성이 있습니까? – IFDev

0

FoxBurnerSDKCore가 제대로 C++ 함수를 정의하면, 관리에 대한 buffer 인수를. 동적 배열 Bytes 위해 당신은 외부 델파이 함수의 인수로 Bytes[0]를 사용할 필요가

(DYN. 배열 테라 바이트가 내부적으로 이미 배열 데이터 포인터 때문에, C++ 인수 값 '포인터 포인터'와 함수 호출을 피하기 위해)

+0

질문에 정의를 추가했습니다. 나는 또한 Bytes [0] 같은 결과를 시도했다. – IFDev

+0

어떤 델파이 버전을 사용하고 있습니까? 유니 코드라면'FilePath'에 대해'AnsiString'을 확인하십시오 – MBo

+0

저는 Rad Studio 10.1을 사용합니다 – IFDev

-1

내가해야 죄송합니다. C++에서 Delphi로 전환하는 사람들의 문제입니다. 디버깅 후 Function과 그 선언이 초기화되지 않았다는 것을 알게되었습니다. 래퍼의 기능 목록에

ReadFileContents:=GetProcAddress(h,'ReadFileContents'); ok:=ok and (@ReadFileContents<>nil); 

지금은 모든 것이 완벽하게 작동합니다 나는 지금 추가했습니다. 나에게 대답을 주신 모든 분들께 감사드립니다. 이 모든 대답은 초보자와 뭔가 배우기에 완벽했습니다. 다시 한번, 많은 감사합니다.

+0

MCVE를 보여 주면이 문제가 5 분 안에 해결 될 수 있음에 유의하십시오. MCVE http://stackoverflow.com/help/mcve – MBo

+0

질문에 대한 답변이 아닙니다. 우리는 그것을 짐작할 수 없었습니다. 그런 질문을 할 때 MCVE를 만드는 방법을 배우십시오. –

관련 문제