一个可能与线程相关的古怪问题。各位大侠请帮忙(200分)

  • 主题发起人 主题发起人 toxing
  • 开始时间 开始时间
T

toxing

Unregistered / Unconfirmed
GUEST, unregistred user!
我在程序中用FOR i:=0 to 2语句循环调用了一个别人写的API函数(如下的sends,原来是
for C的DLL,我改成用DELPHI调用)。
for i:=0 to 2do
begin
memo1.lines.add('i='+inttostr(i));
sends;
end;
结果在调用后就发现i在每次调用后的值都改变了,即使是调用了for语句,i 的值依然不变
都变成一个固定值?!也就是说memo1里会一直写同样的i值。如“
i=0
i=12847
i=12847
i=12847
i=12847
...
这可能是怎么回事?难道是dll里把程序命令都改了?Delphi里无法看到实际号码,真是糟啊。
请各位大侠多多帮忙啊
 
你的问题呢??????[:)]
 
要给出原来的代码,讲的太简单了,没法判断什么问题。
 
别人写的api?好厉害!这样写[:D]
for i:=0 to 2do
begin
memo1.lines.add('i='+inttostr(i));
//sends;
end;
 
我主要想问问大家有没有碰到过这种情况,程序太长了,还有个DLL。我把出错的部分列在下面,大家看看吧。

procedure Tmainapi.BtnSendClick(Sender: TObject);
var stat:asp_status_t;
sendstr:string;
i:byte;
j:integer;
sendmsg:newRecmsg;
label relogin;
begin
// 登录
CMPP121n.connect_login(host1,port1,@f_skt_ISMG);
//生成发送内容
sendstr:=mainapi.memo1.Lines.Text;
sendcount:=0;
for j:=0 to 3do
begin
richedit1.Lines.Add('j='+inttostr(j));
if j>=1 then
//按理本行是不需要的,但若不加,因为J的值将会是一个固定的奇怪的值,可能会死循环:(
break;
sendmsg.ID:='123';
sendmsg.MsgCont:=sendstr+' j='+inttostr(j);
sendmsg.ServiceId:='821';
//发送
stat:=SendMsgapi(@f_skt_ISMG,sendmsg);
//检查连接是否正常,否则重连三次。本段更古怪,若将以下IF的部分注释,运行时就会发现前面
//richedit1.Lines.Add('j='+inttostr(j));
这行出存取冲突的错,查看CPU窗口,发现存取的寄存器
//由eax(不注释时看到的)变成了esi。难道编译程序和下面的内容有关?
if (stat<>ASP_SUCCESS) and (sendcount<3) then
begin
inc(sendcount);
if (link_status=IDLE) then
CMPP121n.connect_login(host1,port1,@f_skt_ISMG);
end;

end;
//断开
logout_disconnect(@f_skt_ISMG);
application.ProcessMessages;
end;

这些问题太古怪了,我开始怀疑是否DELPHI中毒了,但给我的几个朋友编译后的结果也是这样!:(
要说是DLL的问题吧,但该DLL用VC调用都很正常。难道是Delphi的兼容性问题?
 
最有可能的是你的Dll宣告有錯誤, 如果可以的話, 再將Delphi的Dll宣告及原VC中的宣告貼出來
 
程序实在太长了,先把函数声明写出来,若还需要细节请告诉我MAIL,谢谢。
Delphi的声明
function Sock_Recv(skt : asp_socket_t;
cp : PSock_Packet) : asp_status_t;
stdcall;
function Sock_Bind_to_ISMG(host : Pchar;
port : asp_port_t;
skt : Pasp_socket_t) : asp_status_t;
stdcall;
function Sock_Connect_Set_Value(cc : PSock_Connect;
user_name : PChar;
pass : PChar;
ver : asp_uint8_t;
timestamp : asp_uint32_t) : asp_status_t;
stdcall;
function Sock_Connect_to_ISMG(skt : asp_socket_t;
cc : PSock_Connect) : asp_status_t;
stdcall;
function Sock_Submit_Set_Value(cs : PSock_Submit;
Registered_Delivery : asp_uint8_t;
msg_level : asp_uint8_t;
service_id : PChar;
fee_usertype : asp_uint8_t;
fee_terminate_id : PChar;
tp_pid : asp_uint8_t;
tp_udhi : asp_uint8_t;
msg_fmt : asp_uint8_t;
msg_src : PChar;
feetype : PChar;
feecode : Pchar;
valid_time : PChar;
at_time : PChar;
src_id : PChar;
dest_id : PChar;
msg_content : PChar) : asp_status_t;
stdcall;
function Sock_Submit_to_ISMG(skt : asp_socket_t;
cs : PSock_Submit) : asp_status_t;
stdcall;
function Sock_Deliver_REP_Set_Value(cdr : PSock_Deliver_REP;
cp : PSock_Packet) : asp_status_t;
stdcall;
function Sock_Deliver_REP_to_ISMG(skt : asp_socket_t;
cdr : PSock_Deliver_REP) : asp_status_t;
stdcall;
function Sock_Active_REP_Set_Value(catr : PSock_Active_Test_REP;
cp : PSock_Packet) : asp_status_t;
stdcall;
function Sock_Active_REP_to_ISMG(skt : asp_socket_t;
catr : PSock_Active_Test_REP) : asp_status_t;
stdcall;
function Sock_Terminate_Set_Value(ct: PSock_Terminate) : asp_status_t;
stdcall;
function Sock_Terminate_to_ISMG(skt : asp_socket_t;
ct : PSock_Terminate) : asp_status_t;
stdcall;
原来用C写的声明
Sock_API asp_status_t Sock_Recv(asp_socket_t skt,Sock_Packet *cp);
Sock_API asp_status_t Sock_Bind_to_ISMG(char *host,asp_port_t port,asp_socket_t *skt);
Sock_API asp_status_t Sock_Connect_Set_Value(Sock_Connect *cc,char *user_name,char *pass,char ver,unsigned int timestamp);
Sock_API asp_status_t Sock_Connect_to_ISMG(asp_socket_t skt, Sock_Connect *cc);
Sock_API asp_status_t Sock_Submit_Set_Value(Sock_Submit *cs,char Registered_Delivery,char msg_levlel,
char *service_id,char fee_usertype,char *fee_terminate_id,char tp_pid,char tp_udhi,char msg_fmt,char *msg_src, char *feetype,char *feecode,char *valid_time,char *at_time,char *src_id,char *dest_id,char *msg_content);
Sock_API asp_status_t Sock_Submit_to_ISMG(asp_socket_t skt,Sock_Submit *cs);
Sock_API asp_status_t Sock_Deliver_REP_Set_Value(Sock_Deliver_REP *cdr,Sock_Packet *cp);
Sock_API asp_status_t Sock_Deliver_REP_to_ISMG(asp_socket_t skt,Sock_Deliver_REP *cdr);
Sock_API asp_status_t Sock_Active_REP_Set_Value(Sock_Active_Test_REP *catr,Sock_Packet *cp);
Sock_API asp_status_t Sock_Active_REP_to_ISMG(asp_socket_t skt,Sock_Active_Test_REP *catr);
Sock_API asp_status_t Sock_Terminate_Set_Value(Sock_Terminate *ct);
Sock_API asp_status_t Sock_Terminate_to_ISMG(asp_socket_t skt,Sock_Terminate *ct);
 
connect_login及SendMsgapi應是Delphi函數吧!
f_skt_ISMG是不是類的成員變量?
能把以上函數的宣告及前10行代碼及f_stk_ismg的宣告再貼出來嗎?
 
下面是封装了接口的Delphi函数,依次做登录、发送信息,断开操作
function connect_login(host : Pchar;
port : asp_port_t;
pskt_ISMG : Pasp_socket_t):asp_status_t;
function SendMsgapi(pskt_ISMG : Pasp_socket_t;sendmsg:newRecMsg):asp_status_t;
function logout_disconnect(pskt_ISMG : Pasp_socket_t):asp_status_t;
type asp_socket_t = TSocket;
var f_skt_ISMG:asp_socket_t;
f_skt_ISMG是全局变量,每次连接时使用,里面是存有连接时的一些状态。
下面是sendmsgapi的简化版本
function SendMsgapi(pskt_ISMG : Pasp_socket_t;sendmsg:newRecMsg):asp_status_t;
begin
result:=ASP_FALSE;
stat:=CMPP_Submit_Set_Value(@s_cs,
$01, // Registered_Delivery
$01, // Msg_level
ServiceId, // Service_id
$01, // Fee_UserType
srcaddr, // Fee_terminal_id
$00, // TP_pid
$00, // TP_udhi
$0F, // Msg_Fmt
sp_name, // Msg_src
'01', // FeeType
FeeCode, // FeeCode
'', // Valid_time
'', // At_time
Src_term_id, // Src_terminate_id
dstaddr, // Dest_terminate_id
shortmsg // Msg_Content
);
if( stat= ASP_FALSE ) then
begin
result:=ASP_FALSE;
exit;
end;

stat:=CMPP_Submit_to_ISMG(pskt_ISMG^,@s_cs);
if( stat= ASP_FALSE) then
begin
msg:='Send Submit package to ISMG failed';
writelogfile(msg,0);
exit;
end;
....
end;
 
API宣告是沒有問題, 你有做過測試, 把
stat:=CMPP_Submit_Set_Value(@s_cs,
.
.
這一段Mark掉, 結果就正常嗎?
如果是, 問題就出在此處, 那另一個可能性是, 你有針對傳給此函數的參數, 每一個變量的
值都是正確的嗎?
 
我快晕了。我把delphi的代码优化取消了后,上述问题没了。但又出了个怪问题,我调用
var cmdidtype:cardinal;
cmdidtype:=ntohl(16777344);
对一个参数赋值,运行时总是报越界错误,即使我把越界检查(Range checking)取消了也不行。
而我简单地做个project运行它,都没问题啊。事实上这个值也没超过cardinal型的范围啊?
 
多人接受答案了。
 
后退
顶部