gpt4 book ai didi

delphi - 我可以从缓冲区 (pByte) 和大小创建 VarArray OleVariant 而不进行复制吗?

转载 作者:行者123 更新时间:2023-12-03 15:05:37 29 4
gpt4 key购买 nike

我可以将内存从缓冲区复制到安全数组中,如下所示

  function GetVarArrayFromBuffer(ABuffer : pByte; ASizeInBytes: Cardinal) : OleVariant;
var
LVarArrayPtr: Pointer;
begin
Result := VarArrayCreate([0, ASizeInBytes - 1], varByte);
LVarArrayPtr := VarArrayLock(Result);
try
Move(ABuffer^, LVarArrayPtr^, ASizeInBytes);
finally
VarArrayUnLock(Result);
end;
end;

但是,有没有办法直接将我的指针和大小传递到varArray类型OleVariant不复制内存?

[编辑]

我可以看到 OleVariant 内的数组是 SAFEARRAY (定义为 PVarArray = ^TVarArray ),所以似乎应该有一种方法可以通过填充 TVarArray 中的值来做到这一点并设置VTypeVArray OleVariant 中的值.

最佳答案

is there a way to directly pass my pointer and size into a varArray type OleVariant without copying memory?

德尔福的 OleVariant type 是 OLE VARIANT 的包装器记录。 OLE 支持的唯一数组类型是 SAFEARRAY ,并且由 Win32 SafeArrayCreate...() 函数创建的任何 SAFEARRAY 都会分配并拥有它指向的数据 block 。您必须将源数据复制到该 block 中。

要绕过这个问题,您必须跳过 VarArrayCreate() (它调用 SafeArrayCreate())并使用 SAFEARRAY 自己分配 SafeArrayAllocDescriptor/Ex() 因此它不分配数据 block 。然后,您可以将数组的 pvData 字段设置为指向现有内存块,并在其 fFeatures 字段中启用 FADF_AUTO 标志来告诉 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改为键入。你可以写一个Custom Variant Type保存您想要的任何数据,甚至是对现有内存块的引用,然后根据需要使用 Variant 并让您的自定义类型实现根据需要管理数据。

关于delphi - 我可以从缓冲区 (pByte) 和大小创建 VarArray OleVariant 而不进行复制吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33508827/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com