delphi封装dll传进传出字符串

时间:2022-11-01 22:06:49
需要别人的封装的dll,我想把封装的函数做一个dll在pb中调用,写的dll函数中需要传入传出字符串,我是用的pchar
函数如下:

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 支持字符数组的话,可以用字符数组试试。

#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 支持字符数组的话,可以用字符数组试试。

#4


谢谢楼上!不是很明白,能不能说的详细一些!

#5


哪不明白?

#6


已经搞定了,谢谢