![]() |
Re: PChar schneidet letztes Zeichen ab
Ok, aber das habe ich noch nicht so recht aus deinem Beispiel verstanden...
|
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: |
Re: PChar schneidet letztes Zeichen ab
Dankeschön! Find ich nett von Dir / Euch!
Dann warte ich mal gespannt! |
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. ;)
|
Re: PChar schneidet letztes Zeichen ab
Nur kein Stress! Dank Dir!
|
Re: PChar schneidet letztes Zeichen ab
Hier schon mal die Demo.
DLL:
Delphi-Quellcode:
Programm:
(******************************************************************************
* * * 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.
Delphi-Quellcode:
Kommentare sollten selbsterklärend sein.
(******************************************************************************
* * * 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. |
Re: PChar schneidet letztes Zeichen ab
Danke für Deine Bemühungen. Ich werde es gleich mal durcharbeiten! :thumb:
|
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:
Programm:
(******************************************************************************
* * * 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.
Delphi-Quellcode:
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. :?
(******************************************************************************
* * * 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. |
Re: PChar schneidet letztes Zeichen ab
Fertig. :P
Den Artikel gibt es hier: ![]() Ich habe die Funktion in der DLL noch etwas vereinfacht. Die komische if-Abfrage ist natürlich überflüssig:
Delphi-Quellcode:
:roll:
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; So, ich hoffe, damit kommst du nun klar. ;) |
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. |
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