Du gibst temporäre Strings zurück. Diese sind nach verlassen der Procedure natürlich nicht mehr gültig und verlieren damit meist ihren Inhalt, da deren Speicher wieder verwendet wird.
Eine Möglichkeit: Konstanten definieren und das Plugin verweist auf diese:
Delphi-Quellcode:
// 1. Möglichkeit: const
const
coPIName = 'IO-Warrior 24';
coPIAuthor = 'dsn';
coPIVersion = '0.9.0';
procedure PluginData(var PlugData: TPlugData); stdcall;
begin
PlugData.PluginType := INIT_READ;
PlugData.PluginName := @coPIName; // das sind temporäre Variablen!
PlugData.PluginAuthor := @coPIAuthor;
PlugData.PluginVersion := @coPIVersion;
end;
Andere Möglichkeit: der Aufrufer besorgt vor dem Aufruf Speicher und übergibt diesen an die
DLL. Sprich: Der Aufrufer muss (z.B. 41 Bytes) an Speicherplatz reservieren und gibt die Zeiger auf diesen Speicherplatz an vor dem Aufruf. Die
DLL kopiert dann die Zeichenketten entsprechend in den zur Verfügung gestellten Speicher.
Delphi-Quellcode:
// 2. Möglichkeit: caller stellt Speicherplatz in den PChar's zur Verfügung
// und du füllst den entsprechend
procedure PluginData(var PlugData: TPlugData); stdcall;
begin
PlugData.PluginType := INIT_READ;
StrPLCopy(PlugData.PluginName, coPIName, 40); // 40 = bytes die der Aufrufer zur Verfügung stellt
StrPLCopy(PlugData.PluginAuthor, coPIAuthor, 40); // 40 = bytes die der Aufrufer zur Verfügung stellt
StrPLCopy(PlugData.PluginVersion, coPIVersion, 40); // 40 = bytes die der Aufrufer zur Verfügung stellt
end;
Und da die bösen Pufferüberlaufe auch in Delphi entstehen können, nutzen wir eine Funktion um dies zu verhindern.