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

时间:2012-02-15 15:22:00

标签: delphi dll delphi-7

有没有人能为我提供传递任意数量字节的工作示例 通过参数到dll函数?

我想在没有任何额外内存单元的情况下完成它,只需对基本的Windows类型进行操作。

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

客户端分配的内存是否也应该在客户端免费?

1 个答案:

答案 0 :(得分:7)

DLL函数应如下所示:

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

假设您是从另一个Delphi模块调用它,则调用可能如下所示:

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;

最好定义一个需要在同一模块中分配和释放内存的接口。

上面的示例在调用者模块中分配和释放。这意味着Test方法要么必须在返回之前完全处理Buffer,要么在返回之前复制Buffer的内容。

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

当数据从调用者传递给被调用者时,调用者分配总是最佳选择。当数据以另一个方向流动时,被调用者分配的可能性更大。