Thema: Delphi BPL Zugriffsverletzung

Einzelnen Beitrag anzeigen

Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.300 Beiträge
 
Delphi 12 Athens
 
#1

BPL Zugriffsverletzung

  Alt 20. Jul 2014, 11:09
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

Geändert von haentschman (20. Jul 2014 um 21:01 Uhr)
  Mit Zitat antworten Zitat