Delphi   发布时间:2022-04-11  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了delphi – 我可以从缓冲区(pByte)和大小创建VarArray OleVariant而无需复制吗?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我可以将内存从缓冲区复制到安全数组中,如下所示
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而不复制内存?@H_874_5@

[编辑]@H_874_5@

我可以看到OleVariant中的数组是一个SAFEARRAY(定义为PVarArray = ^ TVarArray),所以看起来应该有一种方法可以通过填充TVarArray中的值并在OleVariant中设置VType和varray值来实现这一点. .@H_874_5@

解决方法

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

要绕过它,你必须跳过VarArrayCreate()(它调用SafeArrayCreate())并使用SafeArrayAllocDescriptor / Ex()自己分配SAFEARRAY,这样它就不会分配数据块.然后,您可以将数组的pvData字段设置为指向现有内存块,并在其fFeatures字段中启用FADF_AUTO标志,以告知SafeArrayDestroy()(当OleVariant不再需要SAFEARRAY时调用它)不释放内存块.@H_874_5@

尝试这样的事情:@H_874_5@

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,并让您的自定义类型实现根据需要管理数据.@H_874_5@

大佬总结

以上是大佬教程为你收集整理的delphi – 我可以从缓冲区(pByte)和大小创建VarArray OleVariant而无需复制吗?全部内容,希望文章能够帮你解决delphi – 我可以从缓冲区(pByte)和大小创建VarArray OleVariant而无需复制吗?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。