Zitat:
Streich mal das
DLL Geraffel aus deinen Überlegungen, denn in der
DLL ist einfach nur Code ausgelagert.
... ja klar. Und dieser Code sollte, so die Idee, in mehreren Threads aufrufbar sein.
Nachtrag:
Im Prinzip funktioniert das auch. Ich bin auf die Suche gegangen weil die eine Funktion aus der
DLL exakt 13 mal den Text korrekt parst und beim 14 mal mit einer Zugriffsverletzung in der
DLL abschmiert. Deswegen dachte ich an einen Grundsatzfehler.
Diese:
Delphi-Quellcode:
procedure ParseDeviceParameters(const aText: PChar; Parameters: TDeviceParameterList); stdcall;
var
aParameter: TDeviceParameter;
I, PositionFirst, PositionCount, TempPosition: Integer;
sl: TStringList;
begin
sl:= TStringList.Create;
try
sl.Text:= aText;
for I:= 0 to sl.Count - 1 do
begin
if AnsiStartsText('dvcRec[', sl[I]) then
begin
aParameter:= TDeviceParameter.Create;
PositionFirst:= PosEx('(',sl[I],1) + 1;
PositionCount:= PosEx(',',sl[I],PositionFirst) - PositionFirst;
aParameter.ParameterID:= StrToInt(Copy(sl[I],PositionFirst,PositionCount));
PositionFirst:= PosEx('"',sl[I],1) + 1;
TempPosition:= PositionFirst;
PositionCount:= PosEx('"',sl[I],TempPosition) - PositionFirst;
aParameter.Name:= Copy(sl[I],PositionFirst,PositionCount);
TempPosition:= TempPosition + PositionCount + 1;
PositionFirst:= PosEx(',',sl[I],TempPosition) + 1;
PositionCount:= PosEx(',',sl[I],PositionFirst) - PositionFirst;
aParameter.GroupID:= StrToInt(Copy(sl[I],PositionFirst,PositionCount));
TempPosition:= TempPosition + PositionCount + 2;
PositionFirst:= PosEx('"',sl[I],TempPosition) + 1;
PositionCount:= PosEx('"',sl[I],PositionFirst) - PositionFirst;
aParameter.Measure:= Copy(sl[I],PositionFirst,PositionCount);
if aParameter.Measure = ' ' then
begin
aParameter.ParameterType:= ptDigital;
end
else
begin
aParameter.ParameterType:= ptAnalog;
end;
aParameter.State:= dsLoaded;
Parameters.Add(aParameter);
end;
end;
finally
sl.Free;
end;
end;
Aufgerufen hier: (FParser ist das Objekt welches sich um das Laden der
DLL kümmert und die exportierten Geschichten zur Verfügung stellt)
Delphi-Quellcode:
FParser.ParseDeviceParameters(PChar(FResponseText), FDeviceParameterList);
for DeviceParameter in FDeviceParameterList do
begin
DeviceParameter.DeviceID := FCurrentDevice.ID;
end;
FDatabase.SaveList(FDeviceParameterList);
FDatabase.GetList(FDeviceParameterList, FCurrentDevice);
Zitat:
Erste Gelegenheit für
Exception bei $771AC41F.
Exception-Klasse EAccessViolation mit Meldung 'Zugriffsverletzung bei Adresse 08D2328B in Modul 'BLA_500_V1_2.dll'. Schreiben von Adresse 00000001'. Prozess DVAServer.exe (3640)