推荐一种从 App 到 DLL 对缓冲区进行原子访问的策略

Recommend a strategy for atomic access to a buffer from App to DLL

我正在开发一个 Delphi XE6 应用程序,我创建了一个 DLL 和调用 EXE 应用程序。

假设一个 DLL 导出以下方法:

procedure GetBuffer(out_buffer: PChar; out_buffer_length: integer); stdcall; export;

调用应用程序通常需要做这样的事情来检索缓冲区的内容:

// Call #1 => get the length of the buffer
GetBuffer(nil, aLength);
// Allocate memory
SetLength(aBuffer, aLength);
// Call #2 => get the actual content
GetBuffer(aBuffer, aLength);

如果此缓冲区是文件的内容,并且它在调用 #1 和调用 #2 之间发生了变化怎么办:结果 aBuffer 可能会被截断。

在这种情况下,对 GetBuffer 进行原子调用的最佳方法是什么?

如果你请求的内容可以在调用之间改变,那么我认为你现在的设计不是很站得住脚。我会用基于单个调用的设计替换它。使用 COM BSTR 类型来促进这一点。它由 WideString 类型包装在 Delphi 中。

procedure GetBuffer(out buffer: WideString); stdcall;

由于 COM BSTR 是在共享 COM 堆上分配的,所以在 DLL 中分配字符串然后在主机可执行文件中释放是安全的。

您应该避免使用 WideString 作为函数 return 类型,因为这里讨论的问题:Why can a WideString not be used as a function return value for interop? 正如我在上面显示的那样,out 参数很好.

顺便说一句,export 关键字在 Delphi 中不再具有任何意义,应将其删除以避免混淆。