Hallo Alle...
Ich glaube das ich einen kleinen Fehler übersehen habe...
Da hagelt es Zugriffsverletzungen incl. rtl150.bpl
Instanziere ich die Klasse direkt läuft die Anwendung perfekt. Also mache ich beim Verwenden der
BPL wahrscheinlich einen grundsätzlichen Fehler.
Ich habe jetzt schon so viel Zeit investiert. Darum ist eure Hilfe nun notwendig.
Ziel:
Auslagerung einer Klasse und dynamische Verwendung. Rückgabe eines Interfaces. Verwendung des Interfaces
in verschiedenen Threads unabhängig voneinander.
Klasse:
Delphi-Quellcode:
TXWebBaseParser = class(TInterfacedObject, IDVAParser)
.
TXWeb_500_V1_2Parser = class(TXWebBaseParser)
Funktionsbeispiel der Klasse (wahrscheinlich nicht relevant):
Delphi-Quellcode:
procedure TXWebBaseParser.ParseName(const aText: PChar; MasterDevice: TMasterDevice);
var
sl: TStringList;
I,J: Integer;
begin
sl:= TStringList.Create;
try
sl.Text:= aText;
for I:= 0 to sl.Count - 1 do
begin
if AnsiStartsText('var n_ins',sl[I]) then
begin
for J:= 14 to Length(sl[I]) do
begin
if sl[I][J] = '"' then
begin
MasterDevice.Caption:= Copy(sl[I],14,J - 14);
Break;
end;
end;
end;
if AnsiStartsText('var d_ins',sl[I]) then
begin
for J:= 14 to Length(sl[I]) do
begin
if sl[I][J] = '"' then
begin
MasterDevice.Name:= Copy(sl[I],14,J - 14);
Break;
end;
end;
end;
end;
finally
sl.Free;
end;
end;
Direktverwendung funktioniert:
Delphi-Quellcode:
FParser: IDVAParser;
.
.
procedure TDVAParser.LoadBpl;
begin
FParser:= TXWeb_500_V1_2Parser.Create;
// FBpl:= 'D:\tmp_1\Debug\Win32\XWEB_500_V1_2_1.bpl';
// FMasterDeviceBplHandle:= LoadPackage(PChar(FBpl));
// if FMasterDeviceBplHandle <> 0 then begin
// FCreateParser:= GetProcAddress(FMasterDeviceBplHandle, 'CreateParser');
// FParser:= FCreateParser;
// end
// else
// begin
// raise Exception.Create('BPL ' + QuotedStr(FBpl) + ' konnte nicht geladen werden.');
// end;
end;
Function für Interface in der BPL:
Delphi-Quellcode:
function CreateParser: IDVAParser;
begin
Result:= TXWeb_500_V1_2Parser.Create;
end;
exports
CreateParser;
Beispiel BPL:
Delphi-Quellcode:
FParser: IDVAParser;
.
.
procedure TDVAParser.LoadBPL;
begin
// FParser:= TXWeb_500_V1_2Parser.Create;
FBpl:= '
D:\tmp_1\Debug\Win32\XWEB_500_V1_2_1.bpl';
FMasterDeviceBplHandle:= LoadPackage(PChar(FBpl));
if FMasterDeviceBplHandle <> 0
then begin
FCreateParser:= GetProcAddress(FMasterDeviceBplHandle, '
CreateParser');
FParser:= FCreateParser;
// Interface wird zurückgegeben
end
else
begin
raise Exception.Create('
BPL ' + QuotedStr(FBpl) + '
konnte nicht geladen werden.');
end;
end;
Problem:
Bei Verwendung der
BPL bekomme ich Zugriffsverletzungen aus den verschiedensten Bereichen. Angeblich sind Listen nil usw.
Da die Listen außerhalb der
BPL erzeugt werden und nur der Klasse zum Füllen übergeben werden kann ich manches nur als Nebeneffekt bezeichnen. Bei
BPL sollte das eigentlich uneingeschränkt funktionieren.
Danke für Info´s. Bitte beschränkt euch bei der Diskussion auf die Zielaufgabe. Das Projekt ist schon komplex genug und fortgeschritten