推荐一种策略,用于从App到DLL的缓冲区的原子访问

时间:2015-04-28 16:21:01

标签: delphi 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进行原子调用的最佳方法是什么?

1 个答案:

答案 0 :(得分:0)

如果您要求的内容可以在不同呼叫之间切换,那么我认为您当前的设计不是很稳固。我会用基于单个调用的设计替换它。使用COM BSTR类型可以实现此目的。它由WideString类型包含在Delphi中。

procedure GetBuffer(out buffer: WideString); stdcall;

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

由于此处讨论的问题,您应该避免使用WideString作为函数返回类型:Why can a WideString not be used as a function return value for interop?如上所示,out参数很好。

另外,export关键字在Delphi中没有意义,应该删除以避免混淆。