我正在开发一个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进行原子调用的最佳方法是什么?
答案 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中没有意义,应该删除以避免混淆。