Autor Beitrag
ConnyCarl
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Mo 04.08.03 22:02 
hallo leute,

ich möchte eine einfache function ausführen die zwei stings in einer dll zusammen setzen soll.
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1173
Erhaltene Danke: 14


RAD Studio XE2
BeitragVerfasst: Mo 04.08.03 23:21 
Hast du im Hauptprogramm auch als aller erste unit in der .dpr Datei ShareMem hinzugefügt?

_________________
Ist Zeit wirklich Geld?
ConnyCarl Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 4373

Ubuntu 7.10 "Gutsy Gibbon"

BeitragVerfasst: 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:
ausblenden 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.

_________________
Your computer is designed to become slower and more unreliable over time, so you have to upgrade. But if you'd like some false hope, I can tell you how to defragment your disk. - Dilbert
AndyB
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1173
Erhaltene Danke: 14


RAD Studio XE2
BeitragVerfasst: 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:
ausblenden volle Höhe 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;

_________________
Ist Zeit wirklich Geld?