При использовании CoTaskMemAlloc возникает исключение EVariantBadVarTypeError ('Invalid variant type').
procedure TOPCItemAttEnumerator.PopulateRecord(var theRec: OPCITEMATTRIBUTES; i: integer);
begin
with TOPCItemAttributes(iaList[i]) do
begin
...
theRec.dwEUType:=dwEUType;
theRec.vEUInfo:=vEUInfo;
Unknown, а справа - 0
end;
end;
function TOPCItemAttEnumerator.Next(celt: Cardinal; out ppItemArray:POPCITEMATTRIBUTESARRAY;
out pceltFetched:Cardinal):HResult;
begin
...
ppItemArray:=POPCITEMATTRIBUTESARRAY(CoTaskMemAlloc(celt*sizeof(OPCITEMATTRIBUTE S)));
...
...
PopulateRecord(ppItemArray[i],nextIndex);
...
end;
Заменил CoTaskMemAlloc на AllocMem ошибка исчезла. Стал разбираться и получил следующую картину:
AllocMem:
((nil, nil, False, 0, 0, 0, 0, nil, 0, 0, 0,
Unassigned),...,(...))
Здесь последний параметр Variant.
CoTaskMemAlloc:
((, , True, 3131961357, 3131961357, 3131961357, 3131961357, $BAADF00D, 61453, 47789, -1163005939,
Variant array of Unknown),...,(...))
Здесь последний параметр Variant array of *.
Как сделать, чтобы, если dwEUType = 0, то vEUInfo был типа Variant, а иначе Variant array of *