A little bit of the userdecls problem solved, but
Blitz3D Forums/Blitz3D Programming/A little bit of the userdecls problem solved, but
| ||
Ok, I've solved how to get Delphi to return strings to BB. I did that this way, by returning the pointer to the first character in the string (ergo, null terminated):
library Project1;
uses
SysUtils, Classes, Dialogs;
{$R *.res}
function Func_ShowMessage:pointer;
var
temp: string;
begin
temp := 'return string test';
Func_Showmessage := addr(temp[1]);
end;
exports
Func_ShowMessage;
begin
end.
As you now can see, returning the first char in the string works, because ordinary delphi strings are also terminated by null. The only difference is that the first byte in a string tells the length, and that's what we avoid when returning the pointer to the second. As we also know, the documentation tells us this: Strings are passed and returned in 'C' format - ie: a pointer to a null-terminated sequence of characters. This also means that the strings passed to the Delphi DLL as a parameter also is a null-terminated string (pchar). I've tried all these solutions, but no luck:
library Project1;
uses
SysUtils, Classes, Dialogs;
{$R *.res}
function Func_ShowMessage(s:pchar):pointer;
var
temp: string;
begin
showmessage(s); //showmessage is compatible with pchars
temp := 'return string test';
Func_Showmessage := addr(temp[1]);
end;
exports
Func_ShowMessage;
begin
end.
Also here I tried adding one by one char to the string, by reading the memory from the pointer BB passed:
library Project1;
uses
SysUtils, Classes, Dialogs;
{$R *.res}
function Func_ShowMessage(s:pointer):pointer;
var
temp: string;
temp2: string;
begin
temp2 := '';
while s^ <> #0 do
begin
temp2 := temp2 + s^;
inc(s);
end;
showmessage(temp2);
temp := 'return string test';
Func_Showmessage := addr(temp[1]);
end;
exports
Func_ShowMessage;
begin
end.
Didn't work. Then I tried using Delphi's own pchar, and then convert it to string using Delphi's own "pointer to string" function:
library Project1;
uses
SysUtils, Classes, Dialogs;
{$R *.res}
function Func_ShowMessage(s:pchar):pointer;
var
temp: string;
temp2: string;
begin
temp2 := pchar(s);
showmessage(temp2);
temp := 'return string test';
Func_Showmessage := addr(temp[1]);
end;
exports
Func_ShowMessage;
begin
end.
Not working. It does show the message, but it shows just weird characters as if the pointer returned by BB is wrong. In all 3 ways to do it, it shows the same weird characters. Here's my userdecls: .lib "Project1.dll" Func_ShowMessage$(caption$) Any suggestions, or experiences with this? |