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.dll' name '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.