同为一个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的函数都是没问题的,请问各位高人如何解决?
小弟是新手,请各位前辈不吝指点,小弟先谢谢了~
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的函数都是没问题的,请问各位高人如何解决?
小弟是新手,请各位前辈不吝指点,小弟先谢谢了~
只是返回SerialNo一个值,size只是指定返回值SerialNo的长度~谢谢!
var sn:array[0..256] of AnsiChar;
begin
getserialno(sn,256);
end;
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;
好像是这样吧,记不清楚了。没法试验。
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); 这句提示
[Error] Unit1.pas(48): Types of actual and formal var parameters must be identical
麻烦您再帮我看看,非常感谢!!
这里你改了吗?
Delphi调用Dll基本都是PAnsiChar;生命时候就要生命成PAnsiChar;
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;您看,这是源码
不行就GetSerialNo(sn[0],256);
没装Delphi,没法试验。
应该没问题。
再不行就把stdcall改成cdecl。
改为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;
function getserialno(serialno:PAnsiChar ; size:longint):boolean;stdcall; external 'Signer.dll' name 'GetSerialNo';
var sn:PAnsiChar;
begin
sn:='';
GetSerialNo(@sn,256);
result:=sn;
end;
getserialno(pchar(sn),256);
我认真试了一下,一执行,程序就关闭,真不知问题在哪里? 而PB调用则可以正确返回Sn值。
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;同时谢谢各位热心的朋友,祝好人一生平安!谢谢!
字符型在dll中传,最好使用pchar。真要用string,那么就在工程与dll中第一个位置uses ShareMem
这样的话,就是你在DELPHI中引用这个DLL的方式就是有问题的