大佬教程收集整理的这篇文章主要介绍了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,请注明来意。