如何通过 Delphi 包装器调用 C++ 函数
How do call C++ function through Delphi wrapper
这是我的第一个问题。如果我做错了,请给我提示。
我的问题:我必须通过 Delphi 包装器 (VCL) 调用 C++ 函数。 delphi 包装器看起来像:
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
如何从 Delphi 代码中调用此函数。意思是 var/parameter 我需要发送给函数?好像buffer和ActualLength在C++中是指针
int32 BS_CALL ReadFileContents( HSESSION hSession, const TCHAR* lpszFilePath, int64 nOffset, void* pBuffer, int32 nBufferSize, int32* pRead );
这就是我的问题,如何处理 Delphi 中的指针。我认为这是 Delphi:
中的正确调用
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;
但这会导致内存预期。如果我从 C++ 示例调用该函数,它运行良好。就在 Delphi 这里,一个预期发生了。所以我想我做错了什么。
我希望我提供了所有需要的信息以获得答案。如果没有,请让我知道我想念什么。谢谢。
补充信息:定义:
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;
如果 FoxBurnerSDKCore
正确定义了 C++ 函数,那么请注意 buffer
参数。对于动态数组 Bytes
你必须使用 Bytes[0]
作为外部 Delphi 函数的参数
(避免使用 'pointer to pointer' 参数值调用 c++ 函数,因为动态数组 TBytes 内部已经是指向数组数据的指针)
应该这样定义:
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 );
不好意思,这是从C++转Delphi的人的问题。经过数小时的调试,我发现函数及其声明未初始化。
我现在添加了:
ReadFileContents:=GetProcAddress(h,'ReadFileContents'); ok:=ok and (@ReadFileContents<>nil);
添加到包装器中的函数列表,现在一切正常。感谢所有给我答案的人。所有这些答案对于初学者和学习一些东西来说都是完美的。再次感谢。
这是我的第一个问题。如果我做错了,请给我提示。
我的问题:我必须通过 Delphi 包装器 (VCL) 调用 C++ 函数。 delphi 包装器看起来像:
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
如何从 Delphi 代码中调用此函数。意思是 var/parameter 我需要发送给函数?好像buffer和ActualLength在C++中是指针
int32 BS_CALL ReadFileContents( HSESSION hSession, const TCHAR* lpszFilePath, int64 nOffset, void* pBuffer, int32 nBufferSize, int32* pRead );
这就是我的问题,如何处理 Delphi 中的指针。我认为这是 Delphi:
中的正确调用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;
但这会导致内存预期。如果我从 C++ 示例调用该函数,它运行良好。就在 Delphi 这里,一个预期发生了。所以我想我做错了什么。
我希望我提供了所有需要的信息以获得答案。如果没有,请让我知道我想念什么。谢谢。
补充信息:定义:
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;
如果 FoxBurnerSDKCore
正确定义了 C++ 函数,那么请注意 buffer
参数。对于动态数组 Bytes
你必须使用 Bytes[0]
作为外部 Delphi 函数的参数
(避免使用 'pointer to pointer' 参数值调用 c++ 函数,因为动态数组 TBytes 内部已经是指向数组数据的指针)
应该这样定义:
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 );
不好意思,这是从C++转Delphi的人的问题。经过数小时的调试,我发现函数及其声明未初始化。 我现在添加了:
ReadFileContents:=GetProcAddress(h,'ReadFileContents'); ok:=ok and (@ReadFileContents<>nil);
添加到包装器中的函数列表,现在一切正常。感谢所有给我答案的人。所有这些答案对于初学者和学习一些东西来说都是完美的。再次感谢。