Ich hab Delphi 2.0 Developer und möchte eine DLL erstellen, die einen Textwert zurückgibt.<br>Wenn ich auf "Datei/Neu/DLL" gehe, wird in die neu angelegte DLL automatisch die Bemerkung hinzugefügt, dass man string-Parameter oder string-Funktionsergebnisse nur dann bei DLLs verwenden könne, wenn man Delphimm.dll mit der DLL mitliefert. Wenn man darauf keine Lust habe, solle man nicht string-Werte, sondern PChar-Werte nehmen.<br>OK, dachte ich mir, nehm' ich halt PChar-Werte. Die DLL, die ich erstellen will, soll eine Schach-KI ersetzen. Der Rückgabewert beträgt z.B. "e7-e6".<br>Jetzt stürzt mein Programm beim Aufruf der DLL aber ab, und als ich es debugt habe, ist mir aufgefallen, dass der Rückgabewert nicht wie erwartet "e7-e6" lautet, sondern "e7-e[unbekannte Zeichenfolge]".<br>Weiß jemand, woran das liegt?<br>Ich habe schon versucht, die Funktion aus der DLL herauszunehmen, und so in mein Programm zu implementieren. Solange der Debugger in der Funktion ist, heißt der Rückgabewert (Result) "e7-e6". Sobald aber die Funktion verlassen wird, und in der nächsten Funktion als Parameter verwendet wird, heißt der Parameter wieder "e7-e...".<p>Falls jemand schon einmal dieses Problem hatte, oder vielleicht auch so weiß, woran das liegt, bitte ich Ihn, so schnell wie möglich zu antworten.<br>thx schonmal, Sebastian Meßmer
Announcement
Collapse
No announcement yet.
Delphi 2 - PChar als Parameter oder Funktionsergebnis
Collapse
X
-
Muss der Rückgabe wert denn unbedingt ein String sein? Wie wäre es denn stattdessen mit einem Record a la
<pre>
<code><font size=3 face="Courier New"><span style="background-color: #FFFFFF"><font color="#000000"><b>type
</b>TZug = <b>record
</b>VonX, VonY, NachX, NachY: Byte;
<b>end</b>;
</span></font>
</code></pre>
Das wäre schneller, einfacher (da keine Probleme mit Stringübergabe :-P), programmatisch leichter auszuwerten usw. usf.
<br>Uli
-
Danke. Damit ist mein Problem gelöst.<br>Aber mal ganz allgemein: Da muss doch irgend ein Fehler drin sein, wenn das nicht funktioniert. Und wenn ich mal eine DLL mache, bei der es wirklich ein string(bzw. PChar)-Rückgabewert sein muss, stehe ich wieder vor dem gleichen Problem.<br>
Weiß jemand, woran dieses Problem liegen könnte?<p>thx schonmal, Sebastian Meßme
Comment
-
Das ist nicht so toll. Die Verkettung "Startfeld+Zielfeld" erzeugt dir eine temporäre Stringvariable. Deren Adresse weist du auf Result zu. Nachdem die Zuweisung abgearbeitet ist, wird der temporäre String ad acta gelegt und Result zeigt auf einen ungültigen Speicherbereich. ==> Patsch.
<p>Wenn du einen PChar zurückgeben willst, solltest du ihn mit StrNew (oder ähnlichem) anlegen. Dann darf der Empfänger aber nicht vergessen, ihn wieder aufzuräumen, das aber nicht einfach direkt mit StrDispose, sondern mit einer Routine in deiner DLL, die StrDispose aufruft, weil ein StrNew in der DLL ein anderen Heap benutzt als ein StrNew in der exe. Du siehst, das mit den PChars + DLLs ist nicht wirklich einfach. :-
Comment
-
Hallo,
im Gegensatz zu StrNew (etc.) ist ein <b>array of Char</b> ungefährlicher, solange immer nur ein Thread gleichzeitig auf diese DLL zugreift. Die DLL-Funktion gibt für den PChar-Rückgabewert nur die Adresse (<b>@</b>) der Puffervariable zurück:
<pre>
<b>library</b> DelphiDLL;
<br>
<b>uses</b>
SysUtils, Classes, Windows;
<br>
<font color="#003399"><i>{$R *.res}</i></font>
<br>
<b>var</b>
szUserName : <b>array</b>[0..99] <b>of</b> Char;
<br>
<b>function</b> OSGetUserName: PChar; <b>stdcall</b>;
<b>var</b>
dwLen : DWORD;
<b>begin</b>
dwLen := SizeOf(szUserName);
FillChar(szUserName, dwLen, #0);
GetUserName(szUserName, dwLen);
Result := @szUserName;
<b>end</b>;
<br>
<b>exports</b>
OSGetUserName <b>index</b> 1;
<br>
<b>begin</b>
<b>end</b>.
</pre>
Comment
Comment