Einzelnen Beitrag anzeigen

Aviator

Registriert seit: 3. Jun 2010
1.611 Beiträge
 
Delphi 10.3 Rio
 
#37

AW: DLL Programmierung - Wie übergebe ich am sinnvollsten meine Daten?

  Alt 11. Okt 2016, 19:01
Hallo Blup (und alle anderen Helfer),

da bin ich schon wieder. Funktioniert doch nicht so ganz wie ich das will.

Ich habe beim Erstellen des Interfaces Probleme mit den Datentypen. Ich wollte jetzt bei PWideChar bleiben und nicht wieder alles auf WideString o.ä. umstellen. Ich habe mir jetzt ein Interface erstellt, das wie folgt aussieht:

Delphi-Quellcode:
  IDMSUserExchange = interface(IInterface)
  [GUID]
    procedure SetChangePassAtNextLogon(const Value: Boolean);
    procedure SetDeactivated(const Value: Boolean);
    procedure SetEMail(const Value: PWideChar);
    procedure SetFirstName(const Value: PWideChar);
    procedure SetID(const Value: Int64);
    procedure SetLastName(const Value: PWideChar);
    procedure SetPassword(const Value: PWideChar);
    procedure SetPermissions(const Value: Int64);
    procedure SetUserName(const Value: PWideChar);

    function GetChangePassAtNextLogon: Boolean;
    function GetDeactivated: Boolean;
    function GetEMail: PWideChar;
    function GetFirstName: PWideChar;
    function GetID: Int64;
    function GetLastName: PWideChar;
    function GetPassword: PWideChar;
    function GetPermissions: Int64;
    function GetUserName: PWideChar;

    property ID: Int64 read GetID write SetID;
    property UserName: PWideChar read GetUserName write SetUserName;
    property FirstName: PWideChar read GetFirstName write SetFirstName;
    property LastName: PWideChar read GetLastName write SetLastName;
    property EMail: PWideChar read GetEMail write SetEMail;
    property Password: PWideChar read GetPassword write SetPassword;
    property Permissions: Int64 read GetPermissions write SetPermissions;
    property Deactivated: Boolean read GetDeactivated write SetDeactivated;
    property ChangePassAtNextLogon: Boolean read GetChangePassAtNextLogon write SetChangePassAtNextLogon;
  end;
Sobald ich jetzt aber eine Klasse erstelle welches das Interface implementiert, muss ich ja auch entsprechend mit PWideChar arbeiten. Innerhalb meines Programmes, also wenn die Daten von der DLL zurückgegeben wurden, würde ich aber ganz gerne mit string weiterarbeiten. Jetzt müsste ich mir ja theoretisch 2 Klassen erzeugen die das gleiche Interface implementieren und sich nur durch die internen Datentypen der privaten Felder unterscheiden würden.

Klasse, welche zum Austausch der Daten mit der DLL benutzt wird (da kein string nutzbar).
Delphi-Quellcode:
TDMSUserExchange = class(TInterfacedObject, IDMSUserExchange)
private
  FUserName: PWideChar;
  FEMail: PWideChar;
  [...]
  FDeactivated: Boolean;
public
  [Alle Interface Proceduren]
end;
Interne Klasse die zur Weiterverarbeitung benutzt werden soll:
Delphi-Quellcode:
TDMSInternalUserData = class(TInterfacedObject, IDMSUserExchange)
private
  FUserName: string; // <-- Hier string
  FEMail: string; // <-- Hier string
  [...]
  FDeactivated: Boolean;
public
  [Alle Interface Proceduren]
end;
Ist das jetzt übers Ziel hinaus geschossen oder muss das genau so gemacht werden? Wenn nicht, wie macht man das richtig? Dann müsste ja theoretisch wie es aktuell mit den Records auch der Fall ist die Objekte von TDMSUserExchange nach TDMSInternalUserData übertragen werden.

Wenn ich Speicher mit StrNew() anfordern muss, dann kann ich den ja nicht einfach wieder freigeben wenn ich intern Strings verwende. Oder verstehe ich das falsch?
Oder brauche ich gar keinen Speicher mehr anzufordern, weil mein Interface zwar PWideChar erwartet, aber in der instanziierten Klasse ein string verwendet wird und somit schon wieder alles in einen eigenen Speicherbereich "kopiert" wird? (Das wäre mir persönlich am allerliebsten)

Ich hoffe ihr habt meine Frage(n) verstanden und könnt mir nochmal weiterhelfen.
  Mit Zitat antworten Zitat