1682387问题再开200分求解!! (200分)

  • 主题发起人 主题发起人 lccc
  • 开始时间 开始时间
L

lccc

Unregistered / Unconfirmed
GUEST, unregistred user!
问题请参阅:
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1682387
哪位给个满意的答复???

200分求解!!!
补充:
类似的程序,第一个客户我定义的记录类型为
TDataRecord=record
A:WideString;//只有2个字符
B:Integer;//>=0
C:WideString;//六个字符
D:Word;
end;
后来给第二个客户做时,改了一下:
TDataRecord=record
A:Byte;
B:LongWord;
C:LongWord;
D:Word;
end;
结果不行,老是在对记录变量Data赋值时在
Data.B:=123或Data.C:=321时出现如下错误:
Access Violation at address 0156132C in "ServerCOM.dll",
write of address 30303030
客户端退出出现指针访问错误代码204:
“Runtime error 204 at 00003BBD”
查了一下资料:在进程内COM中应该可以传递记录,
只有在进程外程序之间传递记录时,用VarArrayCreate、
ArrayLock、Unlock、Move等例程。
问:
1、为何修改后的不行?要原因!!!
2、进程内究竟是否可以传递记录类型?为什么?
3、为什么客户端提示指针访问错误?这个指针在客户端或服务端???
 
TDataRecord=record
A:String[2];//只有2个字符
B:Integer;//>=0
C:String[6];//六个字符
D:Word;
end;
 
string和widestring如果没有注明长度,都是自管理型的,长度是可变的。
所以你的程序中两种数据结构是不同的。
 
to zhu_jy:
出错的原因我想不是关于字符类型的问题,因为没有加上也可以。
问题在于转换成相应的整数为何却不能准确地在C/S之间传递??
说明:
记录的每个字段都是IC卡上读取出来的,都是整数,写入时将整数
转换为字符('0'..'F'组成),读出时相反。
 
我想是长度的问题吧,你的第一个参数类型widestring没有指明长度,那么服务器就不知道
第二个参数在哪个位置。比如在com里定义的记录是
t1 = record
a: widestring[2];
b: LongInt;
end;
那么访问t1.b里com就知道t1.b的正确地址是@t1+2
如果a未指定长度,com就不知道t1.b在哪开始,并且有可能写到超出t1的地址范围,
访问到@t1+Sizeof(t1)以外的地方,那么访问t1.b时就会出现内存报错了。
当然对第一个参数t1.a的访问还是正确的。
 
谢谢关注!
 
后退
顶部