c++ - 如何通过 Delphi 包装器调用 C++ 函数

标签 c++ delphi delphi-10.1-berlin

我的第一个问题。如果我做错了什么,请给我提示。

我的问题:我必须通过 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 代码中调用此函数。意思是我需要向函数发送什么变量/参数?好像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;

最佳答案

应该这样定义:

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 包装器调用 C++ 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40212215/

相关文章:

android - 使用 TStyleBook 时的旧/暗对话框

c++ - QPushButton 动态背景色

delphi - Delphi TClientDataSet查找问题

c++ - 访问控制对已删除的构造函数是否重要?

multithreading - Delphi IDE 在调试线程时挂起

delphi - 如何在不使用第三方组件的情况下在 Delphi 中创建 Outlook 加载项?

delphi - 释放以 MainForm 作为所有者的表单是否是一个错误?

delphi - 访问冲突 - 如何查找原因?

java - 访问客户端服务器设置中的对象

C++ 需要在许多目录中包含头文件