Einzelnen Beitrag anzeigen

Muetze1
(Gast)

n/a Beiträge
 
#28

Re: DLL Callback Pointerübergabe erwartet Variable

  Alt 2. Nov 2007, 09:07
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.
  Mit Zitat antworten Zitat