Есть ли способ напрямую передать мой указатель и размер в varArray типа OleVariant без копирования памяти?
Делфи OleVariant
типа является оболочкой для VARIANT
записи OLE в. Единственным типом массива, который поддерживает OLE, является SAFEARRAY
, и любой SAFEARRAY
, созданный функцией Win32 SafeArrayCreate...()
, выделяет и владеет блоком данных, на который он указывает. Вы должны скопировать исходные данные в этот блок.
Чтобы обойти это, вы должны пропустить VarArrayCreate()
(который вызывает SafeArrayCreate()
) и выделить SAFEARRAY
себя с помощью SafeArrayAllocDescriptor/Ex()
поэтому не выделяет блок данных. Затем вы можете задать поле массива pvData
, чтобы указать на ваш существующий блок памяти, и включить флаг в поле fFeatures
, чтобы сообщить SafeArrayDestroy()
(который OleVariant
звонит, когда ему больше не нужен), чтобы не освобождать блок памяти.
попробовать что-то вроде этого:
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
и позволить произвольной реализации типов управлять данными по мере необходимости.
Большое спасибо. –