有没有办法直接将我的指针和大小传递给 varArray 类型的 OleVariant 而无需复制内存?
Delphi 的OleVariant
类型是 OLEVARIANT
记录的包装器。OLE 支持的唯一数组类型是SAFEARRAY
,并且SAFEARRAY
由 Win32SafeArrayCreate...()
函数创建的任何数组都分配并拥有它指向的数据块。您必须将源数据复制到该块中。
要绕过它,您必须跳过VarArrayCreate()
(调用SafeArrayCreate()
)并分配SAFEARRAY
自己使用SafeArrayAllocDescriptor/Ex()
,因此它不会分配数据块。然后您可以将数组的pvData
字段设置为指向您现有的内存块,并启用FADF_AUTO
其字段中的标志fFeatures
来告诉SafeArrayDestroy()
(OleVariant
当它不再需要时调用SAFEARRAY
)不要释放您的内存块。
尝试这样的事情:
uses
..., Ole2, ComObj;
// Delphi's Ole2 unit declares SafeArrayAllocDescriptor()
// but does not declare SafeArrayAllocDescriptorEx()...
function SafeArrayAllocDescriptorEx(vt: TVarType; cDims: Integer; var psaOut: PSafeArray): HResult; stdcall; external 'oleaut32.dll';
function GetVarArrayFromBuffer(ABuffer : pByte; ASizeInBytes: Cardinal) : OleVariant;
var
SA: PSafeArray;
begin
OleCheck(SafeArrayAllocDescriptorEx(VT_UI1, 1, SA));
SA.fFeatures := SA.fFeatures or FADF_AUTO or FADF_FIXEDSIZE;
SA.cbElements := SizeOf(Byte);
SA.pvData := ABuffer;
SA.rgsabound[0].lLbound := 0;
SA.rgsabound[0].cElements := ASizeInBytes;
TVarData(Result).VType := varByte or varArray;
TVarData(Result).VArray := PVarArray(SA);
end;
如果您实际上不需要使用 OLE,例如如果您没有通过 OLE 将数组传递给其他人的应用程序,那么您应该使用 Delphi 的Variant
类型。您可以编写 aCustom Variant Type
来保存您想要的任何数据,甚至是对现有内存块的引用,然后Variant
根据需要使用并让您的自定义类型实现根据需要管理数据。