![]() |
Delphi-Version: 2010
How to - string in DLL
This is the bigest problem I currently have: how to use strings in DLL.
I know have to use PChar in exports. How about internal code that operates on Delphi's strings? I want to share this DLL with any language, so I can't use external memory manager (as I did with DLLs that can be used by my software only). For example function returns string or parameter is string or variable or constant is string - what to do whit this? With numbers there is no problem. Please help me with strings :cry: |
AW: How to - string in DLL
|
AW: How to - string in DLL
i always use the WideString type, it is fully COM compatible and i don't have to cast. for me the most easiest way!
|
AW: How to - string in DLL
You can use PWideChar or PAnsiChar just as the Windows API internally uses too.
If you want to return such a value: Just give a PWideChar and its size as variable parameter. If the size is not sufficient, you return the size you need. If the size is sufficient you copy the data into the buffer. This is the way the API manages it. And it works well. |
AW: How to - string in DLL
WideString =
![]() ![]() ![]() ![]() - no delphi type > OLE-String - no delphi memory manager - no RTTI required - no problems - without reference counting |
Re: How to - string in DLL
Thanks @Luckie!
Can I ask for example how to use functions @himitsu listed? Or just use WideString as Delphi's string? |
Re: How to - string in DLL
I tested @Luckies code and it working in example, but don't work in this case:
Delphi-Quellcode:
Raises AV. Windows functions working, this one not. Why?
function func1(s: PChar; Buffer: PChar; lenBuffer: Integer): Integer; external 'StringDLL.dll';
var Buffer: array [0..MAX_PATH] of Char; BufferSize: DWORD; begin BufferSize := High(Buffer); func1('bar', Buffer, BufferSize); ShowMessage(Buffer); end; |
AW: How to - string in DLL
One inportant issue first:
Always use PWideChar or PAnsiChar in DLL interfaces. Otherwise it depends on the Delphi version and what PChar means in it whether your program works or not... Regarding your problem: I don't see an error handling (you ignore the return value). And where does the exception occur? Inside the DLL function? And could you please post the source of the function inside the DLL too? |
Re: How to - string in DLL
Code (function from @Luckie article).
Delphi-Quellcode:
Windows functions I'm using in the sam way, exception in DLL.
library StringDLL;
uses SysUtils; function func1(s: PWideChar; Buffer: PWideChar; lenBuffer: Integer): Integer; stdcall; var foo: String; begin foo := 'foo'+ s; if Assigned(Buffer) then StrLCopy(Buffer, PWideChar(foo), lenBuffer); Result := Length(foo); end; exports func1; begin end. function func1(s: PWideChar; Buffer: PWideChar; lenBuffer: Integer): Integer; external 'StringDLL.dll'; procedure TForm1.Button1Click(Sender: TObject); var Buffer: array [0..MAX_PATH] of Char; BufferSize: DWORD; begin BufferSize := High(Buffer); func1('bar', Buffer, BufferSize); ShowMessage(Buffer); end; Original example is working:
Delphi-Quellcode:
I prefer 1st method (as in WinAPI). Why it don't working? :(
procedure TForm1.FormCreate(Sender: TObject);
var hLib: THandle; s: String; foo1: function(s: PChar; Buffer: PChar; lenBuffer: Integer): Integer; stdcall; len: Integer; Buffer: PChar; begin Buffer := nil; hLib := LoadLibrary('StringDLL.dll'); if hLib = 0 then begin Str(GetLastError, s); ListBox1.Items.Add('LE: ' + s); exit; end; Str(hLib, s); ListBox1.Items.Add('hlib: ' + s); @foo1 := GetProcAddress(hLib, 'func1'); if (not Assigned(foo1)) then begin Str(GetLastError, s); ListBox1.Items.Add('AE: ' + s); exit; end; Str(Integer(@foo1), s); ListBox1.Items.Add('@func1: ' + s); len := foo1('', nil, 0); Str(len, s); ListBox1.Items.Add('len: ' + s); try GetMem(Buffer, len + 1); len := foo1('', Buffer, len + 1); Str(len, s); ListBox1.Items.Add(String(Buffer)+ ' [' + s + ']'); finally FreeMem(Buffer); end; end; |
AW: Re: How to - string in DLL
Zitat:
By the way: I prefer the way most of the API functions work: First I ask for the buffer size needed, then I reserve enough memory and ask for the data itself. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:01 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-2025 by Thomas Breitkreuz