Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 将二进制数据传递给D7中的dll函数_Delphi_Dll_Delphi 7 - Fatal编程技术网

Delphi 将二进制数据传递给D7中的dll函数

Delphi 将二进制数据传递给D7中的dll函数,delphi,dll,delphi-7,Delphi,Dll,Delphi 7,有人能给我提供一个传递任意字节数的工作示例吗 通过参数调用dll函数 我想这样做没有任何额外的内存单元,只是对基本的windows类型操作 每次通话我需要“发送”大约300 kb的数据 在客户端分配的内存是否也应该在客户端释放?DLL函数应如下所示: procedure Test(Buffer: Pointer; Length: Integer); stdcall; begin //Buffer points to the start of the buffer. //The Buff

有人能给我提供一个传递任意字节数的工作示例吗 通过参数调用dll函数

我想这样做没有任何额外的内存单元,只是对基本的windows类型操作

每次通话我需要“发送”大约300 kb的数据


在客户端分配的内存是否也应该在客户端释放?

DLL函数应如下所示:

procedure Test(Buffer: Pointer; Length: Integer); stdcall;
begin
  //Buffer points to the start of the buffer. 
  //The Buffer size if Length bytes.
end;
procedure Test(Buffer: Pointer; Length: Integer); stdcall; external 'test.dll';

procedure CallTest;
var
  Buffer: array of Byte;
begin
  SetLength(Buffer, 1000);
  //populate Buffer
  Test(@Buffer[0], Length(Buffer));
end;
假设您是从另一个Delphi模块调用它,调用可能如下所示:

procedure Test(Buffer: Pointer; Length: Integer); stdcall;
begin
  //Buffer points to the start of the buffer. 
  //The Buffer size if Length bytes.
end;
procedure Test(Buffer: Pointer; Length: Integer); stdcall; external 'test.dll';

procedure CallTest;
var
  Buffer: array of Byte;
begin
  SetLength(Buffer, 1000);
  //populate Buffer
  Test(@Buffer[0], Length(Buffer));
end;
最好定义一个需要在同一模块中分配和释放内存的接口

上面的示例在调用方的模块中分配和取消分配。这意味着
测试
方法必须在返回前完全处理
缓冲区
,或者在返回前复制
缓冲区
的内容

现在,虽然可以在被叫方的模块中进行分配和解除分配,但这种情况不太常见。它不太常见,因为这样做通常不太方便。它通常需要更多的API函数,或者更复杂的接口。当调用者无法确定合适的缓冲区大小时,您将被推入被调用者分配路由


当数据从调用方传递到被调用方时,调用方分配始终是最佳选择。当数据流向另一个方向时,被调用者分配更合适。

我们会这样做,但我们希望看到您在分配和解除分配方面做了一些尝试:要么在调用者端同时进行,要么在被调用者端同时进行。因此,如果您想在客户端分配它,也可以在客户端释放它。您没有提到释放:因为
Buffer
是一个动态数组,它将在
CallTest
离开时释放。因此,如果DLL打算在
测试
调用后保留数据,则必须创建自己的副本。我认为,当您从模块函数返回缓冲区,然后在调用方函数中释放缓冲区时,应该完成模块分配(例如,模块中的
LocalAlloc
和调用方中的
LocalFree
)@kobik通常情况下,如果可能的话,尽量避免被叫方分配。但是是的,有时它是正确的解决方案。OP要求传递“任意字节”,因此我将声明该函数采用
指针
参数,而不是
PByte
参数。当需要时,函数可以在内部将
指针
强制转换为
PByte
,但这种方式允许调用方传递任何类型的内存地址,而无需手动将其强制转换为端。@kobik:如果DLL必须将内存返回给调用方,最好从DLL中导出一个额外的函数,允许DLL释放内存,因为只有它知道如何首先分配内存,从而知道如何正确地释放内存。最好的选择是让调用方分配内存并将其传递给DLL,以便根据需要填充内容。这两种模式都有各自的优点和利弊。