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.