如何通过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/参数我将需要发送到函数?在c++
中,buffer和ActualLength似乎是指针。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++示例中调用函数,它会工作得很好。就在德尔福这里,一个期望发生了。所以我想我做错了什么。
我希望我提供了所有需要的信息来得到答案。如果没有,请让我知道我错过了什么,谢谢。
新增信息:定义:
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 );
如果FoxBurnerSDKCore
正确定义了c++函数,那么请注意buffer
参数。对于动态数组Bytes
,必须使用Bytes[0]
作为外部Delphi函数的参数
(为了避免c++函数调用'指针指向指针'参数值,因为dyn. array TBytes内部已经是指向数组数据的指针)
我很抱歉,这是人们从c++切换到Delphi的问题。经过几个小时的调试,我发现函数和它的声明没有初始化。我现在添加了:
ReadFileContents:=GetProcAddress(h,'ReadFileContents'); ok:=ok and (@ReadFileContents<>nil);
到包装器中的函数列表,现在一切都很完美。感谢所有给我答案的人。所有这些答案对初学者来说都是完美的,可以学到一些东西。再次感谢。
相关文章:
- 什么时候调用组成单元对象的析构函数
- 对RValue对象调用的LValue ref限定成员函数
- 为什么使用 "this" 指针调用派生成员函数?
- 函数调用中参数的顺序重要吗
- OpenGL - 在抛出"__gnu_cxx::recursive_init_error"实例后终止调用?
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 在c++类上调用void函数
- 为什么 std::unique 不调用 std::sort?
- 调用专用模板时出错"no matching function for call to [...]"
- 选择要调用的构造函数
- C++为什么尽管我调用了void函数,它却不起作用
- 构造函数正在调用一个使用当前类类型的函数
- 变量没有改变?通过向量的函数调用
- 没有为自己的结构调用列表推回方法
- 调用'begin(int [n])'没有匹配函数
- 什么时候调用析构函数
- 如何用参数值调用函数(仅在运行时已知)
- std::cout.imbue()多重调用
- 函数何时会在c++中包含stack_Unwind_Resume调用