关于动态库多参数传递,各位帮忙 ( 积分: 100 )

  • 主题发起人 主题发起人 qianxianen
  • 开始时间 开始时间
Q

qianxianen

Unregistered / Unconfirmed
GUEST, unregistred user!
我自己编写的一个动态库(Delphi7.0),当传递一个字符型时正确,但是第二个参数未传递过去。返回的值也是为空。如下例
Function SelectCardType(slot:string;cardkind:string;var recedata:array of byte):integer;
begin
try
if (slot= '2')and(cardkind= '148') then
begin
recedata[0]:=$90
recedata[1]:=$00

end;
Result:=0;
except
Result:=1;
end;
end;
其中我用消息框显示发现cardkind值与实际传的不正确,还有recedata返回值也不正确。
 
我自己编写的一个动态库(Delphi7.0),当传递一个字符型时正确,但是第二个参数未传递过去。返回的值也是为空。如下例
Function SelectCardType(slot:string;cardkind:string;var recedata:array of byte):integer;
begin
try
if (slot= '2')and(cardkind= '148') then
begin
recedata[0]:=$90
recedata[1]:=$00

end;
Result:=0;
except
Result:=1;
end;
end;
其中我用消息框显示发现cardkind值与实际传的不正确,还有recedata返回值也不正确。
 
dll和exe都要uses sharemem啊
 
你没分配长度怎么就返回了?
Function SelectCardType(slot:string;cardkind:string;var recedata:array of byte):integer;
begin
try
if (slot= '2')and(cardkind= '148') then
begin
SetLength(Recedata, 2);
recedata[0]:=$90
recedata[1]:=$00

end;
Result:=0;
except
Result:=1;
end;
end;
 
恩,对,你用了string类型做参数或返回值,就一定要用sharemem,否则改参数为ShortString或PChar吧
 
以上的单元我都加了,否则无法生成dll啊。
 
大家说话呀,以上我分别作的,先用消息框分别显示slot和cardkind值,然后不加判断直接给recedata付值,在动态库里检查recedata已经有值,但在调用是却未传过去。
 
你把调用函数写出来一下,写法没错,应该是调研函数的问题
 
//调用单元全文如下:
unit Unit1;

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 SelectCardType(slot:string;cardkind:string;var recedata:array of byte):integer;far;stdcall;external 'TEST.dll'
//
implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
RE_v:integer;
port,kind:string;
begin
port:='参数1';kind:=参数2''

RE_v:=SetCardTypeDevice(port,kind,data);
end;

end.
 
另外,以上函数我单独作一个单元让它调用跟踪都正确,只是生成动态库后就不对了。
 
Function SelectCardType(slot:string;cardkind:string;var recedata:array of byte):integer;
在这个加上一个stdcall;
 
关于动态库多参数传递如果是string型,最好改用PChar


不然会有很多问题的。用指针一切OK
 
谢谢clchen,你的做法是正确的。接分。
 
接受答案了.
 

Similar threads

S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
900
SUNSTONE的Delphi笔记
S
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部