小弟想请教各位一个delphi调用DLL的问题,谢谢!

fox600123 2012-04-18 07:42:56
同为一个Singer.dll中的函数在PB中引用为:
function boolean getserialno(ref string serialno,long size) library "Signer.dll" alias for "GetSerialNo"
可以正常调用

而小弟在Delphi中引用为:
function getserialno( var serialno:string ; size:longint):boolean; stdcall; external 'Signer.dll' name 'GetSerialNo';
---------
然后调用函数:

procedure TForm1.getserialnobtnClick(Sender: TObject);
var sn:string;
begin
getserialno(sn,256);
end;

编译通过,但调用总是出错,难道问题在于delphi的sting类型和pb的 ref string 的不同?我也尝试使用过pchar、pansichar代替string,也是同样的问题。但小弟调用其它没有 ref string的函数都是没问题的,请问各位高人如何解决?
小弟是新手,请各位前辈不吝指点,小弟先谢谢了~
...全文
431 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
山东蓝鸟贵薪 2012-04-19
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 的回复:]
引用 18 楼 的回复:

function getserialno( var serialno:PAnsiChar ; size:longint):boolean;stdcall; external 'Signer.dll' name 'GetSerialNo';

function GetSN: string;
var sn:PAnsiChar;
begin
sn:='';
G……
我认真试了一下,一执行,程序就关闭,真不知问题在哪里? 而PB调用则可以正确返回Sn值。
[/Quote]

这样的话,就是你在DELPHI中引用这个DLL的方式就是有问题的
fox600123 2012-04-19
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 的回复:]

引用 21 楼 的回复:

function getserialno( var serialno:PAnsiChar; size:longint):boolean; stdcall; external 'Signer.dll' name 'GetSerialNo'; function GetSN: string; var sn:array [0..256] of AnsiChar; beg……
[/Quote]

谢谢您的建议~
一剑飘雪 2012-04-19
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 的回复:]

function getserialno( var serialno:PAnsiChar; size:longint):boolean; stdcall; external 'Signer.dll' name 'GetSerialNo'; function GetSN: string; var sn:array [0..256] of AnsiChar; begin ZeroMemory……
[/Quote]

字符型在dll中传,最好使用pchar。真要用string,那么就在工程与dll中第一个位置uses ShareMem
unicodestring 2012-04-19
  • 打赏
  • 举报
回复
客气客气
fox600123 2012-04-19
  • 打赏
  • 举报
回复
function getserialno( var serialno:PAnsiChar; size:longint):boolean; stdcall; external 'Signer.dll' name 'GetSerialNo'; function GetSN: string; var sn:array [0..256] of AnsiChar; begin ZeroMemory(@sn,SizeOf(sn)); getserialno(@sn,256); result :=sn; end;


buffer是0..256,即257个字节。最后一个永远为0,就怕正好SN是256个,那么这个PChar就不是0结尾了。

----
GetSerialNo(sn,256);这样
不行就GetSerialNo(sn[0],256);
没装Delphi,没法试验。
应该没问题。

----

谢谢unicodestring大哥,综合了您的帖子,终于测试成功了,原来是这么声明和调用的

function getserialno( serialno:PAnsiChar ; size:integer):boolean; stdcall; external 'Signer.dll' name 'GetSerialNo';

function GetSN: string;
var sn:array [0..256] of AnsiChar;
begin
ZeroMemory(@sn,SizeOf(sn));
GetSerialNo(@sn[0],256);
result:=sn;
end;

同时谢谢各位热心的朋友,祝好人一生平安!谢谢!
fox600123 2012-04-19
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 的回复:]

function getserialno( var serialno:PAnsiChar ; size:longint):boolean;stdcall; external 'Signer.dll' name 'GetSerialNo';

function GetSN: string;
var sn:PAnsiChar;
begin
sn:='';
GetSerialN……
[/Quote]


谢谢,楼上两位好早啊!~
我认真试了一下,一执行,程序就关闭,真不知问题在哪里? 而PB调用则可以正确返回Sn值。
山东蓝鸟贵薪 2012-04-19
  • 打赏
  • 举报
回复
getserialno(sn,256);

修改成
getserialno(pchar(sn),256);
manjel 2012-04-19
  • 打赏
  • 举报
回复
function getserialno( var serialno:PAnsiChar ; size:longint):boolean;stdcall; external 'Signer.dll' name 'GetSerialNo';

function GetSN: string;
var sn:PAnsiChar;
begin
sn:='';
GetSerialNo(@sn,256);
result:=sn;
end;
manjel 2012-04-19
  • 打赏
  • 举报
回复
去掉 var
function getserialno(serialno:PAnsiChar ; size:longint):boolean;stdcall; external 'Signer.dll' name 'GetSerialNo';
fox600123 2012-04-18
  • 打赏
  • 举报
回复

改为cdecl也是一样的,我自己乱试了一下,目前只有这样,程序会提示“所提供序列号缓冲太小”,我是新手,实在不知道怎么处理了:(

function getserialno( var serialno:array of string ; size:longint):boolean;cdecl; external 'Signer.dll' name 'GetSerialNo';

procedure TForm1.Button1Click(Sender: TObject);
var sn:array[0..0] of string;
begin
getserialno(sn[0],256);
end;
unicodestring 2012-04-18
  • 打赏
  • 举报
回复
function getserialno( var serialno:string ; size:longint):boolean; stdcall; external 'Signer.dll' name 'GetSerialNo';
再不行就把stdcall改成cdecl。
unicodestring 2012-04-18
  • 打赏
  • 举报
回复
GetSerialNo(sn,256);这样
不行就GetSerialNo(sn[0],256);
没装Delphi,没法试验。
应该没问题。
fox600123 2012-04-18
  • 打赏
  • 举报
回复

var
Form1: TForm1;
Function initsigner(hwnd:integer):boolean; stdcall; external 'Signer.dll' name 'InitSigner';
function getserialno( var serialno:PAnsiChar ; size:longint):boolean;stdcall; external 'Signer.dll' name 'GetSerialNo';
function sign(input:string; var output:string;size:integer; option:integer):boolean ;stdcall; external 'Signer.dll' name 'Sign';

implementation
{$R *.dfm}

function GetSN: string;
var sn:array [0..256] of AnsiChar;
begin
ZeroMemory(@sn,SizeOf(sn));
GetSerialNo(@sn,256);
result:=sn;
end;

procedure TForm1.getserialnobtnClick(Sender: TObject);
begin
GetSN;
end;

您看,这是源码
fox600123 2012-04-18
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]

var serialno:PAnsiChar
这里你改了吗?
[/Quote]
已经改了:)
unicodestring 2012-04-18
  • 打赏
  • 举报
回复
function getserialno( var serialno:string ; size:longint):boolean; stdcall; external 'Signer.dll' name 'GetSerialNo';
Delphi调用Dll基本都是PAnsiChar;生命时候就要生命成PAnsiChar;
unicodestring 2012-04-18
  • 打赏
  • 举报
回复
var serialno:PAnsiChar
这里你改了吗?
fox600123 2012-04-18
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

Delphi(Pascal) code
function getserialno( var serialno:PAnsiChar; size:longint):boolean; stdcall; external 'Signer.dll' name 'GetSerialNo';

function GetSN: string;
var
sn:array [0..256] of AnsiCh……
[/Quote]

谢谢您,编译的时候
getserialno(@sn,256); 这句提示
[Error] Unit1.pas(48): Types of actual and formal var parameters must be identical
麻烦您再帮我看看,非常感谢!!
unicodestring 2012-04-18
  • 打赏
  • 举报
回复
function getserialno( var serialno:PAnsiChar; size:longint):boolean; stdcall; external 'Signer.dll' name 'GetSerialNo';

function GetSN: string;
var
sn:array [0..256] of AnsiChar;
begin
ZeroMemory(@sn,SizeOf(sn));
getserialno(@sn,256);
result :=sn;
end;

buffer是0..256,即257个字节。最后一个永远为0,就怕正好SN是256个,那么这个PChar就不是0结尾了。
unicodestring 2012-04-18
  • 打赏
  • 举报
回复

function getserialno( var serialno:PChar; size:longint):boolean; stdcall; external 'Signer.dll' name 'GetSerialNo';

procedure TForm1.getserialnobtnClick(Sender: TObject);
var sn:array[0..256] of AnsiChar;
begin
getserialno(@sn,256);
end;

好像是这样吧,记不清楚了。没法试验。
unicodestring 2012-04-18
  • 打赏
  • 举报
回复
procedure TForm1.getserialnobtnClick(Sender: TObject);
var sn:array[0..256] of AnsiChar;
begin
getserialno(sn,256);
end;
加载更多回复(4)

2,496

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧