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而不复制内存? [编辑] 我可以看到OleVariant中的数组是一个SAFEARRAY(定义为PVarArray = ^ TVarArray),所以看起来应该有一种方法可以通过填充TVarArray中的值并在OleVariant中设置VType和VArray值来实现这一点. . 解决方法
Delphi的 要绕过它,你必须跳过VarArrayCreate()(它调用SafeArrayCreate())并使用SafeArrayAllocDescriptor / Ex()自己分配SAFEARRAY,这样它就不会分配数据块.然后,您可以将数组的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的 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |