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
 
#3

AW: DLL, BPL Zugriffsverletzung

  Alt 20. Jul 2014, 19:00
Danke für die Antwort...

Ich hätte noch erwähnen sollen, das es viele verschiedene Klassen sind die jeweils in eine BPL ausgelagert sind / werden sollen. Daher macht das Interface schon Sinn. Alle Klassen implementieren das gleiche. Hintergrund ist, das der Thread sich nur seine zur Konfiguration passende BPL (nämlich den Parser) lädt. Haben 2 Threads die gleiche Konfiguration (wie durch die Festverdrahtung im Beispiel) ist das Handle natürlich gleich. Unabhängig davon sollte aber das CreateParser verschiedene Referenzen (Instanzen) des Interfaces liefern.
Zitat:
Erstens dürfen in dem Interface selbst keinerlei Objektreferenzen vorkommen.
Wo steht das? Bei DLL kann ich das nachvollziehen. Bei BPL nicht.
Zitat:
Wenn das Interface von mehreren Threads verwendet wird, musst du sichergehen, dass darin nicht auf irgendwelche threadübergreifenden Felder ohne Synchronisation bzw. Locks zugegriffen wird.
Das ist ausgeschlossen. Der Thread übergibt dem Parser den Response und die im Thread erzeugte Liste. Der Parser macht die Liste dann voll. Also greift der Parser nicht threadübergreifend auf anderes zu.
Zitat:
Denn sonst mischst du verschiedene Lebenszyklen von Objekten und Interfaces, das gibt nur Probleme.
Im Falle des Füllens der Objektliste mit den im Parser erzeugten Objekten hast du Recht da die Objekte in der "Speicherverwaltung" der BPL liegen. Wenn man genau weis was man wann tut ist das eher kein Problem. Damit meine ich selbst in der korrekten Reihenfolge aufräumen.
Delphi-Quellcode:
IDVAParser = interface(IInterface)
    ['{7082CCBB-2680-4BC4-8B17-7FFE1D602A0A}']

    procedure ParseDevice(const aText: PChar; DeviceList: TDeviceList);
    procedure ParseDeviceGroup(const aText: PChar; DeviceGroupList: TDeviceGroupList);
    procedure ParseDeviceModel(const aText: PChar; ModelList: TDeviceModelList);
    procedure ParseDeviceParameterGroup(const aText: PChar; DeviceParameterGroupList: TDeviceParameterGroupList);
    procedure ParseDeviceParameters(const aText: PChar; Parameters: TDeviceParameterList);
    procedure ParseAlarmState(const aText: PChar; AlarmStateList: TAlarmStateList);
    procedure ParseAlarmType(const aText: PChar; AlarmTypeList: TAlarmTypeList);
    procedure ParseAlarm(const aText: PChar; AlarmList: TAlarmList);
    procedure ParseName(const aText: PChar; MasterDevice: TMasterDevice);
    procedure ParseRuntime(const aText: PChar; RuntimeList: TRuntimeList);
    function ParseUser(const aText: PChar): PChar;
    procedure ParseVersion(const aText: PChar; MasterVersion: TMasterDeviceVersion);
    procedure ParseSystem(const aText: PChar; MasterDevice: TMasterDevice);
    procedure ParseRunningState(const aText: PChar; MasterDevice: TMasterDevice);
    procedure ParseRecordData(const aText: PChar; RecordDataList: TRecordDataList);
    function GetParameterString(aType: TDVA_CommunicationStringType): PChar;
    function GetSourceString(aType: TDVA_CommunicationStringType): PChar;
  end;
  Mit Zitat antworten Zitat