现有一动态库abc.dll
VC++中的使用方法是
typedef struct {
char CS[16];
char index;
} SM_PARAM;
//声明
int RA_Message(SM_PARAM *sm_temp)//如此使用,没有任何问题
SM_PARAM *sm_temp=new SM_PARAM[30];
int temp=RA_Message(sm_temp);在Delphi中我如此使用
SMS=^SM_PARAM;
SM_PARAM=record
CS :Array[0..15] of char;
index:Array[0..2] of char;
end;
//声明
function RA_Message(sm_temp:SMS):Integer;stdcall;external 'abc.dll' name 'RA_Message';//使用
procedure TForm1.Button1Click(Sender: TObject);
var sms1:array[0..10] of SMS;
i,num:integer;
s:String;
begin
for i:=0 to 10 do
new(sms1[i]); num:=RA_Message(@sms1);//跟踪时,此处已经通过,并且有正确的返回值。
for k:=1 to num do
begin
s:=string(sms1[k].CS);//此处出错,地址无效,出现CPU调试窗口。
Memo1.Lines.Add('内容:'+s);
end; for i:=0 to 10 do
dispose(sms1[i]);
end;请问Delphi中该如何使用?
请赐教!
VC++中的使用方法是
typedef struct {
char CS[16];
char index;
} SM_PARAM;
//声明
int RA_Message(SM_PARAM *sm_temp)//如此使用,没有任何问题
SM_PARAM *sm_temp=new SM_PARAM[30];
int temp=RA_Message(sm_temp);在Delphi中我如此使用
SMS=^SM_PARAM;
SM_PARAM=record
CS :Array[0..15] of char;
index:Array[0..2] of char;
end;
//声明
function RA_Message(sm_temp:SMS):Integer;stdcall;external 'abc.dll' name 'RA_Message';//使用
procedure TForm1.Button1Click(Sender: TObject);
var sms1:array[0..10] of SMS;
i,num:integer;
s:String;
begin
for i:=0 to 10 do
new(sms1[i]); num:=RA_Message(@sms1);//跟踪时,此处已经通过,并且有正确的返回值。
for k:=1 to num do
begin
s:=string(sms1[k].CS);//此处出错,地址无效,出现CPU调试窗口。
Memo1.Lines.Add('内容:'+s);
end; for i:=0 to 10 do
dispose(sms1[i]);
end;请问Delphi中该如何使用?
请赐教!
SMS = ^SM_PARAM;
SM_PARAM = record
CS: String[16];
index: String[3];
end;
我改了,一样出错。
是下面的写法不对吗?
num:=RA_Message(@sms1);//跟踪时,此处已经通过,并且有正确的返回值。
for k:=1 to num do
begin
s:=string(sms1[k].CS);//此处出错,地址无效,出现CPU调试窗口。
Memo1.Lines.Add('内容:'+s);
end;
var myList: TList;
sms1: SMS;
i: integer;
begin
myList := TList.Create;
try
for i:=0 to 10 do begin
new(sms1);
sms1.CS := 'Name' + IntToStr(i);
sms1.index := IntToStr(i);
myList.Add(sms1);
end; i := 0;
while i < myList.Count do begin
sms1 := myList.Items[i];
Memo1.Lines.Add('内容:'+ sms1.CS + '/' + sms1.index);
inc(i);
end;
finally
myList.Free;
end;
end;
(注:存指针用TList比較好)
//sms1要是个数组。
怎么把你说的应用到我的问题上呢?
不明白!
↑此処定義的参数形式是指针呀、不是指针数组!難到君要的是指针数组?function RA_Message(sm_temp:TList):Integer;
num:=RA_Message(myList);
↑試試吧。
begin
s:=string(sms1[k].CS);//此处出错,地址无效,出现CPU调试窗口。
Memo1.Lines.Add('内容:'+s);
end;
(還有:君的Source中、対"k"没做定義)
VC++中的使用方法是
typedef struct {
char CS[16];
char index;
} SM_PARAM;
//声明
int RA_Message(SM_PARAM *sm_temp)//使用,在VC中是正确的。
SM_PARAM *sm_temp=new SM_PARAM[30];
int temp=RA_Message(sm_temp);请把它该写成Delphi程序。对不起!我太弱。
var sms1:array[0..10] of SMS;
p: SMS;
i,num:integer;
s:String;
begin
for i:=0 to 10 do begin
new(p); //先New
sms1[i] := p; //後把Point放入数組
end;
num:=RA_Message(@sms1);
{...}
end;
(其他同上,不知行不行? 算是帮UP吧...)
CS :Array[0..15] of char;
index:Array[0..2] of char;
end;
改为
SM_PARAM= packed record
CS :Array[0..15] of char;
index:Array[0..2] of char; //char为什么改为char[3]
end;
不行的话再
var sms1:array[0..10] of SMS;
改为
var sms1:packed array[0..10] of SMS;试试看吧,呵呵
CS :Array[0..15] of char;
index:Array[0..2] of char;
end;改成
SM_PARAM=packed record
CS :Array[0..15] of char;
index:Array[0..2] of char;
end;
CS :Array[0..15] of char;
index:Array[0..2] of char;
end;
//声明
function RA_Message(sm_temp:array of SM_PARAM):Integer;stdcall;external 'abc.dll' name 'RA_Message';//使用
procedure TForm1.Button1Click(Sender: TObject);
var sms1:array[0..10] of SM_PARAM;
i,num:integer;
s:String;
begin
num:=RA_Message(sms1);
for k:=1 to num do
begin
Memo1.Lines.Add('编号:'+string(sms1[k].index));
Memo1.Lines.Add('内容:'+string(sms1[k].CS));
end;
end;可以通过,只是sms1[k].CS的值有些不对.//编号错误,内容正确
编号:888
内容:13888016901,您申请的密码:150174//编号错误,内容错误
编号:珱
内容:站??????????闻????闲????????愸?蔀?蜑蛙???偑?胉????鉻?蛶?????????駾飓//编号错误,内容错误
编号:?
内容:P挀能正确运行,但返回值不正确.请各位继续帮忙.谢谢!
我试了packed,效果一样。