Thema: Delphi [COM] out PSafeArray

Einzelnen Beitrag anzeigen

Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: [COM] out PSafeArray

  Alt 20. Okt 2009, 09:11
Wie meinst du Accessviolation? Wenn in der Methode ein Fehler auftritt müsste es doch nur einen FehlerWert in HResult geben aber keine AV.

Edit: Hier mal meine Methoden:
Delphi-Quellcode:
procedure TRun.ReadValues;
var j,i:Integer;
    AnalogPSA,digitalPSA:PSafeArray;
    timestamp:TDateTime;
    varvalues:Variant;
begin
  FInputfile.GetOriginValues(i,timestamp,AnalogPSA,DigitalPSA); //SafeArrays ohne Initialisierung
  varValues:=SafeArraytoVariant(DigitalPSA);
  //...
  x:=varValues[2]; //als Beispiel
end;

//........................................................
//dazu das
function SafeArrayGetVartype(psa: PSafeArray; out varType:Word):HResult; stdcall;
  external 'oleaut32.dllname 'SafeArrayGetVartype';

function SafeArraytoVariant(const psa:PSafeArray):Variant;
var vtype:word;
begin
  SafeArrayGetVartype(psa,vtype);
  Result:=null;
  TVarData(Result).VType := vtype or varArray;
  TVarData(Result).VArray := pointer(psa);
end;


//............................................................
//und die Deklaration:
procedure GetOriginValues(aIndex: Integer; out aTimestamp: TDateTime;
                              out aAnalogValues: PSafeArray; out aDigitalValues: PSafeArray); safecall;
//was ja dasselbe ist wie:
function GetOriginValues(aIndex: Integer; out aTimestamp: TDateTime;
                              out aAnalogValues: PSafeArray; out aDigitalValues: PSafeArray):HResult; stdcall;
Allerdings ist die COM-Klasse auch von mir und das Befüllen der Werte sieht letztendlich so aus:
Delphi-Quellcode:
//aDigitalValues entspricht DigitalPSA
  aDigitalValues:=SafeArrayCreate(st_Integer,1,bound);
  try
    SafeArrayAccessData(aDigitalValues,pData);
    try
      piData:=pData;
      for i:=0 to FDigitalCount-1 do begin
        ix:=1 shl i;
        if (digital[i div 16] and ix)=ix then value:=1
                                         else value:=0;
        piData^:=value;
        inc(piData);
      end;
    finally
      SafeArrayUnAccessData(aDigitalValues);
    end;
  except
    on e:Exception do
    begin
      SafeArrayDestroy(aDigitalValues);
      raiseError(LoadStr(eValues)+linefeed+e.Message);
    end;
  end;
Vielleicht hilft dir diese Auskunft.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat