函数如下:
function p_string(var s:pchar):pchar;stdcall;
begin
s := '123';
Result := s;
end;
exports p_string;
做好dll后,在delphi中调用没有问题,返回的值也是正确的,delphi调用如下
unit csstring;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
function p_string(var s:pchar):pchar;stdcall;external 'hljms.dll';
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var a,b:pchar;
begin
b := p_string(a);
showmessage(b+','+a);//返回b='123',a='123'
end;
end.
我在pb中声明
function string p_string(ref string s) library 'hljms.dll'
调用如下
string s,ls_return
s = space(10)
ls_return = p_string(s)
messagebox('',s+','+ls_return)
返回是:ls_return = '123',s = '?? '
我该如何处理,传入的问题已经解决,由于pb中没有指针,pchar代表指针类型,传入字符串,使用指针取值即可!可传出的怎么处理?
6 个解决方案
#1
顶一下
#2
用字符数组应该可以吧
#3
这个问题实际还是 dll 中的导出函数在使用指针做参数的时候,谁来分配空间的问题。
通常的做法是,在exe中分配空间,然后将指针传递给dll导出的函数,在函数里使用空间,然后返回。
dll:
function func1(buff: PChar; var bufflen: Cardinal): Cardinal; stdcall;
begin
strncpy(buff, 'this is a test!', bufflen);
bufflen := strlen(buff);
Result := bufflen;
end;
exe:
var
pbuff : PChar;
len, ret : Cardinal;
begin
len := 1024;
pbuff := AllocMem(len);
ret := func1(pbuff, len);
ShowMessage(pubff);
FreeMem(pbuff);
end;
我不熟悉 pb,不知道 string 是怎样定义的数据类型。如果 pb 支持字符数组的话,可以用字符数组试试。
通常的做法是,在exe中分配空间,然后将指针传递给dll导出的函数,在函数里使用空间,然后返回。
dll:
function func1(buff: PChar; var bufflen: Cardinal): Cardinal; stdcall;
begin
strncpy(buff, 'this is a test!', bufflen);
bufflen := strlen(buff);
Result := bufflen;
end;
exe:
var
pbuff : PChar;
len, ret : Cardinal;
begin
len := 1024;
pbuff := AllocMem(len);
ret := func1(pbuff, len);
ShowMessage(pubff);
FreeMem(pbuff);
end;
我不熟悉 pb,不知道 string 是怎样定义的数据类型。如果 pb 支持字符数组的话,可以用字符数组试试。
#4
谢谢楼上!不是很明白,能不能说的详细一些!
#5
哪不明白?
#6
已经搞定了,谢谢
#1
顶一下
#2
用字符数组应该可以吧
#3
这个问题实际还是 dll 中的导出函数在使用指针做参数的时候,谁来分配空间的问题。
通常的做法是,在exe中分配空间,然后将指针传递给dll导出的函数,在函数里使用空间,然后返回。
dll:
function func1(buff: PChar; var bufflen: Cardinal): Cardinal; stdcall;
begin
strncpy(buff, 'this is a test!', bufflen);
bufflen := strlen(buff);
Result := bufflen;
end;
exe:
var
pbuff : PChar;
len, ret : Cardinal;
begin
len := 1024;
pbuff := AllocMem(len);
ret := func1(pbuff, len);
ShowMessage(pubff);
FreeMem(pbuff);
end;
我不熟悉 pb,不知道 string 是怎样定义的数据类型。如果 pb 支持字符数组的话,可以用字符数组试试。
通常的做法是,在exe中分配空间,然后将指针传递给dll导出的函数,在函数里使用空间,然后返回。
dll:
function func1(buff: PChar; var bufflen: Cardinal): Cardinal; stdcall;
begin
strncpy(buff, 'this is a test!', bufflen);
bufflen := strlen(buff);
Result := bufflen;
end;
exe:
var
pbuff : PChar;
len, ret : Cardinal;
begin
len := 1024;
pbuff := AllocMem(len);
ret := func1(pbuff, len);
ShowMessage(pubff);
FreeMem(pbuff);
end;
我不熟悉 pb,不知道 string 是怎样定义的数据类型。如果 pb 支持字符数组的话,可以用字符数组试试。
#4
谢谢楼上!不是很明白,能不能说的详细一些!
#5
哪不明白?
#6
已经搞定了,谢谢