Registriert seit: 29. Mai 2002
37.621 Beiträge
Delphi 2006 Professional
|
Re: PChar schneidet letztes Zeichen ab
6. Okt 2006, 20:06
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.
Michael Ein Teil meines Codes würde euch verunsichern.
|
|
Zitat
|