这是一个 DLL 的调用问题:/*********************************************定义 comm_value 结构
type
comm_value=packed record
com_port:array [0..0] of char;
dis_value:array [0..39] of char;
end;
//********************************************* 定义 comm_value 结构//*********************************************定义 keyset_value 结构
type
keyset_value=packed record
keyset:array [0..0] of char;
end;
//********************************************* 定义 keyset_value 结构
//*********************************************定义 zone_value 结构
type
zone_value=packed record
zone:array [0..1] of char;
end;
//********************************************* 定义 zone_value 结构
//*********************************************定义 key_value 结构
type
key_value=packed record
key:array [0..11] of char;
end;
//********************************************* 定义 key_value 结构
//*********************************************定义 card_value 结构
type
card_value=packed record
card_no:array [0..7] of char;
end;
//********************************************* 定义 card_value 结构function c_mread_card(var comm:comm_value;var keyset_info:keyset_value;
var zone_info:zone_value):smallint;stdcall; //读卡procedure TForm1.Button2Click(Sender: TObject);var
i:integer;
s1:string;
s2:string;
s3:string;
comm_va:comm_value;
keyset_va:keyset_value;
zone_va:zone_value;
ss:string;
begin
s1:='4';
s2:='0';
s3:='04'; move(s1[1],comm_va.com_port[0],length(s1));
move(s2[1],keyset_va.keyset[0],length(s2));
move(s3[1],zone_va.zone[0],length(s3));
i:=c_mread_card(comm_va,keyset_va,zone_va);
ss:='123';end;可是单击 Button2 有错误,错误是在 ss:='123'处,去掉 ss:='123'; 就可以,
不过我想应该是 调用 i:=c_mread_card(comm_va,keyset_va,zone_va); 时引起了
地址错误,各位大哥是 dll 不行,还是我上面的调用语句不行啊?我是非常非常急啊,恳请各位大哥帮忙!谢谢!
type
comm_value=packed record
com_port:array [0..0] of char;
dis_value:array [0..39] of char;
end;
//********************************************* 定义 comm_value 结构//*********************************************定义 keyset_value 结构
type
keyset_value=packed record
keyset:array [0..0] of char;
end;
//********************************************* 定义 keyset_value 结构
//*********************************************定义 zone_value 结构
type
zone_value=packed record
zone:array [0..1] of char;
end;
//********************************************* 定义 zone_value 结构
//*********************************************定义 key_value 结构
type
key_value=packed record
key:array [0..11] of char;
end;
//********************************************* 定义 key_value 结构
//*********************************************定义 card_value 结构
type
card_value=packed record
card_no:array [0..7] of char;
end;
//********************************************* 定义 card_value 结构function c_mread_card(var comm:comm_value;var keyset_info:keyset_value;
var zone_info:zone_value):smallint;stdcall; //读卡procedure TForm1.Button2Click(Sender: TObject);var
i:integer;
s1:string;
s2:string;
s3:string;
comm_va:comm_value;
keyset_va:keyset_value;
zone_va:zone_value;
ss:string;
begin
s1:='4';
s2:='0';
s3:='04'; move(s1[1],comm_va.com_port[0],length(s1));
move(s2[1],keyset_va.keyset[0],length(s2));
move(s3[1],zone_va.zone[0],length(s3));
i:=c_mread_card(comm_va,keyset_va,zone_va);
ss:='123';end;可是单击 Button2 有错误,错误是在 ss:='123'处,去掉 ss:='123'; 就可以,
不过我想应该是 调用 i:=c_mread_card(comm_va,keyset_va,zone_va); 时引起了
地址错误,各位大哥是 dll 不行,还是我上面的调用语句不行啊?我是非常非常急啊,恳请各位大哥帮忙!谢谢!
ADOStoredProc1.Close;
ADOStoredProc1.ProcedureName:='Pro_Cz_MemberCoin_MemberMessageTable';
ADOStoredProc1.Parameters.Clear;
try
DataModuleForm.ADOStoredProc1.ExecProc;
showmessage('ok');
except
showmessage('no');
end;
****************************
执行 上面的程序会有内存地址错误
而 如果不用 try except end //************************会员卡充值***********************************
ADOStoredProc1.Close;
ADOStoredProc1.ProcedureName:='Pro_Cz_MemberCoin_MemberMessageTable';
ADOStoredProc1.Parameters.Clear;
DataModuleForm.ADOStoredProc1.ExecProc;****************************则没有上面的错误。各大哥,我都快要疯了啊~~到底哪里的问题啊?谢谢!
你的ss 在程序中并未用到啊!
在你的工程文件中引用 ShareMem 试试哪个DLL参数太晦涩了...
造成内存中旁边的SS变量出错.
可能性二: DLL调用约定没搞对...同样是影响堆栈...
给你一个馊主意:
如果下面这样还会出那样问题,估计就是你调用约定不对....仔细检查吧.
如是不出问题,则是DLL代码里访问参数内存不对.var
//因为这块内存是连续存放,于是在内存块两端放BUF1,BUF2隔离,可以保护访问越界不至于
破坏其它部分. buf1:array[1..1024]of char;
comm_va:comm_value;
keyset_va:keyset_value;
zone_va:zone_value;
buf2:array[1..1024]of char;procedure TForm1.Button2Click(Sender: TObject);
var
i:integer;
s1:string;
s2:string;
s3:string;
ss:string;
begin
还是不行啊?
还有什么办法吗?
谢谢!