Конференция "Corba" » CoTaskMemAlloc или AllocMem [Delphi, Windows]
 
  • AbrosimovA © (20.11.06 09:24) [0]
    При использовании CoTaskMemAlloc возникает исключение EVariantBadVarTypeError ('Invalid variant type').


    procedure TOPCItemAttEnumerator.PopulateRecord(var theRec: OPCITEMATTRIBUTES; i: integer);
    begin
    with TOPCItemAttributes(iaList[i]) do
     begin
      ...
      theRec.dwEUType:=dwEUType; // dwEUType = 0
    theRec.vEUInfo:=vEUInfo; // Здесь проблема: слева - Variant array of
    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 *
  • dem (16.06.08 18:19) [1]
    После использования CoTaskMemAlloc надо заполнить всю выделенную память нулями (функцией FillChar, например).
 
Конференция "Corba" » CoTaskMemAlloc или AllocMem [Delphi, Windows]
Есть новые Нет новых   [120357   +35][b:0][p:0.001]