Delphi-PRAXiS
Seite 3 von 3     123   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi PChar schneidet letztes Zeichen ab (https://www.delphipraxis.net/78531-pchar-schneidet-letztes-zeichen-ab.html)

TheMiller 6. Okt 2006 16:24

Re: PChar schneidet letztes Zeichen ab
 
Ok, aber das habe ich noch nicht so recht aus deinem Beispiel verstanden...

Luckie 6. Okt 2006 16:26

Re: PChar schneidet letztes Zeichen ab
 
Ich schreibe heute Abend einen kurzen Artikel mit Demo. Würde ich jetzt nochmachen, aber ich habe Feierabend und will ins Fitnessstudio. ;)

Man, wann ist denn der Tortoise fertig mit einchecken? :wall:

TheMiller 6. Okt 2006 16:28

Re: PChar schneidet letztes Zeichen ab
 
Dankeschön! Find ich nett von Dir / Euch!

Dann warte ich mal gespannt!

Luckie 6. Okt 2006 19:07

Re: PChar schneidet letztes Zeichen ab
 
Ich setze mich jetzt mal dran. Um acht muss ich allerdings meine Freundin abholen. Spätestens um 12 sollte es online sein, wenn nichts dazwischen kommt. ;)

TheMiller 6. Okt 2006 19:10

Re: PChar schneidet letztes Zeichen ab
 
Nur kein Stress! Dank Dir!

Luckie 6. Okt 2006 20:06

Re: PChar schneidet letztes Zeichen ab
 
Hier schon mal die Demo.
DLL:
Delphi-Quellcode:
(******************************************************************************
 *                                                                            *
 *  StringDLL                                                                *
 *  DLL zum Demo-Programm DLLProg                                            *
 *                                                                            *
 *  Copyright (c) 2006 Michael Puff [url]http://www.michael-puff.de[/url]              *
 *                                                                            *
 ******************************************************************************)

library StringDLL;

uses
  SysUtils;

function func1(s: PChar; Buffer: PChar; lenBuffer: Integer): Integer; stdcall;
var
  foo: String;
begin
  // Strings aneinanderhängen
  foo := 'foo'+ s;
  // wenn Stringlänge kleiner oder gleich lang wie lenBuffer
  // String in Buffer kopieren
  if length(foo) <= lenBuffer then
  begin
    StrLCopy(Buffer, PChar(foo), length(foo)+1);
  end;
  // auf alle Fälle immer Länge des Strings zurückgeben
  result := length(foo);
end;

exports
  func1;

begin
end.
Programm:
Delphi-Quellcode:
(******************************************************************************
 *                                                                            *
 *  DLLProg                                                                  *
 *  Demo-Programm Strings und DLLs                                           *
 *                                                                            *
 *  Copyright (c) 2006 Michael Puff [url]http://www.michael-puff.de[/url]              *
 *                                                                            *
 ******************************************************************************)

program DLLProg;

{$APPTYPE CONSOLE}

uses
  windows;

type
  Tfunc1 = function(s: PChar; Buffer: PChar; lenBuffer: Integer): Integer; stdcall;

var
  hLib: THandle;
  s: String;
  func1: Tfunc1;
  len: Integer;
  Buffer: PChar;

begin
  Buffer := nil;

  // DLL laden
  hLib := LoadLibrary('StringDLL.dll');
  if hLib = 0 then
  begin
    Str(GetLastError, s);
    Writeln(s);
    readln;
    exit;
  end;
  Str(hLib, s);
  Writeln('hlib: ' + s);
  // Adresse der exportierten Funktion holen
  @func1 := GetProcAddress(hLib, 'func1');
  if (not Assigned(func1)) then
  begin
    Str(GetLastError, s);
    Writeln(s);
    readln;
    exit;
  end;
  Str(Integer(@func1), s);
  Writeln('@func1: ' + s);
  // Funktion aufrufen, um Größe des Buffers zu ermitteln
  len := func1('bar', nil, 0);
  Str(len, s);
  Writeln('len: ' + s);
  try
    // Speicher anforden
    GetMem(Buffer, len);
    // Funktion mit Buffer aufrufen
    len := func1('bar', Buffer, len);
    Str(len, s);
    // Buffer ausgeben
    writeln(String(Buffer)+ ' [' + s + ']');
  finally
    // Speicher wieder freigeben
    FreeMem(Buffer);
  end;
  readln;
end.
Kommentare sollten selbsterklärend sein.

TheMiller 6. Okt 2006 20:28

Re: PChar schneidet letztes Zeichen ab
 
Danke für Deine Bemühungen. Ich werde es gleich mal durcharbeiten! :thumb:

Luckie 6. Okt 2006 21:22

Re: PChar schneidet letztes Zeichen ab
 
Als ich auf dem Parkplatz auf meine Freundin gewartet habe, habe ich mir noch mal gedanken über die Längenangaben gemacht. Die haben mir keine Ruhe gelassen, was heißt, dass da irgendwas nicht ganz stimmte. Hier noch mal der überarbeitet Code.

DLL
Delphi-Quellcode:
(******************************************************************************
 *                                                                            *
 *  StringDLL                                                                *
 *  DLL zum Demo-Programm DLLProg                                            *
 *                                                                            *
 *  Copyright (c) 2006 Michael Puff [url]http://www.michael-puff.de[/url]              *
 *                                                                            *
 ******************************************************************************)

library StringDLL;

uses
  SysUtils;

function func1(s: PChar; Buffer: PChar; lenBuffer: Integer): Integer; stdcall;
var
  foo: String;
begin
  // Strings aneinanderhängen
  foo := 'foo'+ s;
  // wenn Stringlänge kleiner oder gleich lang wie lenBuffer
  // String in Buffer kopieren
  if length(foo) < lenBuffer then
  begin
    StrLCopy(Buffer, PChar(foo), lenBuffer);
  end;
  // auf alle Fälle immer Länge des Strings zurückgeben
  result := length(foo);
end;

exports
  func1;

begin
end.
Programm:
Delphi-Quellcode:
(******************************************************************************
 *                                                                            *
 *  DLLProg                                                                  *
 *  Demo-Programm Strings und DLLs                                           *
 *                                                                            *
 *  Copyright (c) 2006 Michael Puff [url]http://www.michael-puff.de[/url]              *
 *                                                                            *
 ******************************************************************************)

program DLLProg;

{$APPTYPE CONSOLE}

uses
  windows;

type
  Tfunc1 = function(s: PChar; Buffer: PChar; lenBuffer: Integer): Integer; stdcall;

var
  hLib: THandle;
  s: String;
  func1: Tfunc1;
  len: Integer;
  Buffer: PChar;

begin
  Buffer := nil;

  // DLL laden
  hLib := LoadLibrary('StringDLL.dll');
  if hLib = 0 then
  begin
    Str(GetLastError, s);
    Writeln(s);
    readln;
    exit;
  end;
  Str(hLib, s);
  Writeln('hlib: ' + s);
  // Adresse der exportierten Funktion holen
  @func1 := GetProcAddress(hLib, 'func1');
  if (not Assigned(func1)) then
  begin
    Str(GetLastError, s);
    Writeln(s);
    readln;
    exit;
  end;
  Str(Integer(@func1), s);
  Writeln('@func1: ' + s);
  // Funktion aufrufen, um Größe des Buffers zu ermitteln
  len := func1('bar', nil, 0);
  Str(len, s);
  Writeln('len: ' + s);
  try
    // Speicher anforden
    GetMem(Buffer, len + 1);
    // Funktion mit Buffer aufrufen
    len := func1('bar', Buffer, len + 1);
    Str(len, s);
    // Buffer ausgeben
    writeln(String(Buffer)+ ' [' + s + ']');
  finally
    // Speicher wieder freigeben
    FreeMem(Buffer);
  end;
  readln;
end.
Ich hoffe so stimmt das jetzt. Die Compilermagic kann manch mal ganz schön stören, wenn man nicht weiß, ob sie den String jetzt automatisch nullterminiert oder nicht und so was. :?

Luckie 7. Okt 2006 00:54

Re: PChar schneidet letztes Zeichen ab
 
Fertig. :P

Den Artikel gibt es hier: Rückgabe von Strings aus DLLs

Ich habe die Funktion in der DLL noch etwas vereinfacht. Die komische if-Abfrage ist natürlich überflüssig:
Delphi-Quellcode:
function func1(s: PChar; Buffer: PChar; lenBuffer: Integer): Integer; stdcall;
var
  foo: String;
begin
  // Strings aneinanderhängen
  foo := 'foo'+ s;
  // nur String in Buffer kopieren, wenn Buffer nicht nil ist
  if Assigned(Buffer) then
    StrLCopy(Buffer, PChar(foo), lenBuffer);
  // auf alle Fälle immer Länge des Strings zurückgeben
  result := length(foo);
end;
:roll:

So, ich hoffe, damit kommst du nun klar. ;)

TheMiller 7. Okt 2006 13:06

Re: PChar schneidet letztes Zeichen ab
 
Ok Super!

Werde mich damit befassen. Nur hat jetzt meine Freundin erstmal Geburtstag. Danke Dir.


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:00 Uhr.
Seite 3 von 3     123   

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz