Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - string in der dll addieren


ConnyCarl - Mo 04.08.03 22:02
Titel: string in der dll addieren
hallo leute,

ich möchte eine einfache function ausführen die zwei stings in einer dll zusammen setzen soll.

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
uses Sharemem, SysUtils;

function erg: string;
begin
  result := str1 + str2;
end;

nach dem starten kommt die meldung
Zitat:
Ungültige Zeigeroperation

wenn ich die meldung mit ok beende kommt jedoch das richtige ergebnis raus. was mache ich falsch ???

danke conny

Moderiert von user profile iconTino: Quote- & Delphi-Tags hinzugefügt.
Moderiert von user profile icontommie-lie: Und die Tags auch aktiviert :mrgreen:


AndyB - Mo 04.08.03 23:21

Hast du im Hauptprogramm auch als aller erste unit in der .dpr Datei ShareMem hinzugefügt?


ConnyCarl - Di 05.08.03 07:33
Titel: hallo,
danke für deine hilfe, ich habe die 'ShareMem' jetzt auch in der unit eingefügt, lustig ist jetzt das die meldung nach dem programm schliessen kommt. was mache ich noch falsch ???

gruss conny


ConnyCarl - Di 05.08.03 08:12

hallo, ich konnte nicht lesen. ich hatte auch vergessen sharemem in das project einzubinden, jetzt läuft mein programm erst einmal so wie ich es möchte.

danke und gruss conny


tommie-lie - Di 05.08.03 14:12

Die Sharemem braucht aber eine DLL, die von Version zu Version unterschiedlich ist. Wenn du das Programm an andere weitergeben willst, musst du diese zusätzliche DLL also auch mitliefern.
Besser wäre es hier, du würdest PChars verwenden, die verursachen nämlich keine Fehlermeldungen, auch ohne Sharemem nicht.
Die Funktion würde dann so aussehen:

Delphi-Quelltext
1:
2:
3:
4:
function erg: PChar;
begin
  result := PChar(String(str1) + String(str2));
end;


Vorsicht: Da ich im Moment mein System neu instlaliere und kein Delphi habe, ist das nur aus dem Kopf getippt und könnte auch syntaktisch falsch sein. Evtl also in anderen Variationen ausprobieren.


AndyB - Di 05.08.03 14:47

tommie-lie hat folgendes geschrieben:
könnte auch syntaktisch falsch sein.

Syntaktisch lässt sich das schon kompilieren, nur "logisch" ist es Unsinn, denn damit reservierst du wiederum Speicher für den String, der beim Funktionsende freigegeben wird.

Der Code müsste wennschon so aussehen:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
function erg(Buffer: PChar; MaxLen: Integer): Integer;
var S: string;
begin
 // die Funktion liefert immer die benötigte Länge zurück
  Result := Length(str1) + Length(str2);
  if Buffer <> nil then
  begin
    // String zusammensetzen
    S := str1 + str2;
    // den String so weit es möglich ist in den Buffer schreiben
    StrLCopy(Buffer, PChar(S), MaxLen);
  end;
end;

// Aufruf:
var
  Buffer: PChar;
  Len: Integer;
  S: string;
begin
  Len := erg(nil0);
  if Len > 0 then
  begin
    Buffer := StrAlloc(Len + 1); // #0 Zeichen nicht vergessen
    try
      erg(Buffer, Len);
      SetString(S, Buffer, Len);
    finally
      StrDispose(Buffer);
    end;
  end;
end;