![]() |
Re: How to - string in DLL
Delphi-Quellcode:
Dynamic - working:
library StringDLL;
uses SysUtils; function Foonction(Data: PWideChar; Buffer: PWideChar; lenBuffer: Cardinal): Cardinal; stdcall; var S: string; begin S := 'foo' + Data; if Assigned(Buffer) then StrLCopy(Buffer, PWideChar(S), lenBuffer) ; Result := Length(S); end; exports Foonction; begin end.
Delphi-Quellcode:
Static - don't working:
var
hLib: THandle; func1: 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 ListBox1.Items.Add('hlib: ' + IntToStr(hLib)); @func1 := GetProcAddress(hLib, 'Foonction'); if Assigned(func1) then begin ListBox1.Items.Add('@func1: ' + IntToStr(Integer(@func1))); len := func1('bar', nil, 0); ListBox1.Items.Add('len: ' + IntToStr(len)); try GetMem(Buffer, len + 1); len := func1('bar', Buffer, len + 1); ListBox1.Items.Add(String(Buffer)+ ' [' + IntToStr(len) + ']'); finally FreeMem(Buffer); end; end; end; end;
Delphi-Quellcode:
Now I have identical sizes, what's wrong? :cry:
function Foonction(Data: PWideChar; Buffer: PWideChar; lenBuffer: Cardinal): Cardinal; external 'StringDLL.dll';
var Buffer: PWideChar; BufferSize: DWORD; begin BufferSize := Foonction('bar', nil, 0); ShowMessage(IntToStr(BufferSize)); GetMem(Buffer, BufferSize + 1); try Foonction('bar', Buffer, BufferSize + 1); ShowMessage(Buffer); finally FreeMem(Buffer); end; end; |
AW: How to - string in DLL
Does Length return the count of characters or the count of Bytes? If it returns the count of characters you have to multiply it by 2 if it's a WideChar.
|
AW: How to - string in DLL
What about this:
Delphi-Quellcode:
But it would be better if you made lenBuffer a variable parameter. This way you can return the buffer size and a return value.
function Foonction(Data: PWideChar; Buffer: PWideChar; lenBuffer: Cardinal): Cardinal; external 'StringDLL.dll';
var Buffer: string; BufferSize: DWORD; begin BufferSize := Foonction('bar', nil, 0); if BufferSize > 0 then begin SetLength(Buffer, BufferSize); Foonction('bar', PWideChar(Buffer), BufferSize); end else Buffer := ''; ShowMessage(Buffer); end; |
AW: How to - string in DLL
Delphi-Quellcode:
vvvvvvv
function func1(s: PWideChar; Buffer: PWideChar; lenBuffer: Integer): Integer; stdcall; begin end function func1(s: PWideChar; Buffer: PWideChar; lenBuffer: Integer): Integer; external 'StringDLL.dll'; ^^^^??? |
AW: How to - string in DLL
Oh ja, darauf hatte ich gar nicht geachtet... :oops:
|
Re: How to - string in DLL
DLL:
Delphi-Quellcode:
@Luckie, Length() is function from Delphi :)
library StringDLL;
uses SysUtils; function Foonction(Data: PWideChar; Buffer: PWideChar; lenBuffer: Cardinal): Cardinal; stdcall; var S: string; begin S := 'foo' + Data; if Assigned(Buffer) then StrLCopy(Buffer, PWideChar(S), lenBuffer) ; Result := Length(S); end; exports Foonction; begin end. Here you are complete code with variants I tried to static load and call StringDLL.dll-->Foonction():
Delphi-Quellcode:
All of them working when Foonction() is in EXE, none of them working if Foonction() is in DLL - raises AV in DLL. :cry:
function Foonction(Data: PWideChar; Buffer: PWideChar; lenBuffer: Cardinal): Cardinal; external 'StringDLL.dll';
// 1: var Buffer: string; BufferSize: DWORD; begin BufferSize := Foonction('bar', nil, 0); if BufferSize > 0 then begin SetLength(Buffer, BufferSize); Foonction('bar', PWideChar(Buffer), BufferSize); end else Buffer := ''; ShowMessage(Buffer); end; // 2: var Buffer: PWideChar; BufferSize: DWORD; begin BufferSize := Foonction('bar', nil, 0); ShowMessage(IntToStr(BufferSize)); GetMem(Buffer, BufferSize + 1); try Foonction('bar', Buffer, BufferSize + 1); ShowMessage(Buffer); finally FreeMem(Buffer); end; end; // 3: var Buffer: array [0..MAX_PATH - 1] of Char; BufferSize: DWORD; begin BufferSize := High(Buffer); ShowMessage(IntToStr(Foonction('bar', Buffer, BufferSize))); Caption := Buffer; end; |
AW: How to - string in DLL
I know that it is a Delphi function. But I don't know its result, if you use Unicode. I assume it returns the number of characters. So if you allocate the memory you have to double the result of Length.
And there is still the error with the calling convention in your code. Before you try something else correct it. The calling convention for the function in the DLL is stdcall, but in your program it is external! |
Re: How to - string in DLL
Oh gosh, I forgot add stdcall before external in app. Ah :( Now working! Thanks :D
Also a few of you told that better is using WideChar. I tried this:
Delphi-Quellcode:
and working without any problems (as normal string type in EXE, that's cool :D). But early @himitsu told:
// In DLL
function FooncUni(Data: WideString): WideString; stdcall; var S: string; begin S := 'foo' + Data; Result := S; end; // In app: function FooncUni(Data: WideString): WideString; stdcall external 'StringDLL.dll'; Caption := FooncUni('bar'); // Caption is 'foobar' Zitat:
Also another think: to use Ansii or Unicode I have to write 2 functions with PWideChar and PAnsiChar parameters? Or one lets say Unocode version and second to convert Unicode Buffer to Ansi - how? And WideString - it is always Unicode? |
AW: How to - string in DLL
Zitat:
For example the API has ShellExecuteA and ShellExecuteW. Delphi itself maps ShellExecute to ShellExecuteA (Delphi 1 - 2007) or to ShellExecuteW (Delphi 2009+). So you don't see that you call one of the other functions. ;-) Zitat:
I myself do not want to use it because it relies on OLE and the operating system. That's why it is much slower. Of course this doesn't matter unless you call such a method often. For COM WideStrings are very useful (I also used them to interact with .NET libraries with exported native functions), but for other purposes I do not use them. But it is your decision, both ways work. |
Re: How to - string in DLL
Thanks guys, you helped me so much! :D
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:14 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