在COM中传递记录的问题?紧急求助!(200分)

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

lccc

Unregistered / Unconfirmed
GUEST, unregistred user!
客户端调用自动化COM组件的函数:
function TImplClass.ReadOut(out Data:TDataRecord):WordBool;
var //TImplClass=接口的实现类
AscStr:string;
begin
Result:=False;
SetLength(AscStr,22);
//以下调用动态库从端口取得数据;
try
if not GetData(AscStr) then Exit;//动态库函数GetData函数从端口取数据,失败退出。
except
Exit;
end;
try
Data.A:=StrToInt('$'+Copy(AscStr,1,2));//读取第一个数据,2个字符串 -----
//W处
Data.B:=StrToInt('$'+Copy(AscStr,3,8));//读取第二个数据项,8个字符串 -----
//X处
Data.C:=StrToInt('$'+Copy(AscStr,11,4));//读取第三个数据项,4个字符串 -----
//Y处
Data.D:=StrToInt('$'+Copy(AscStr,15,8));//读取第三个数据项,8个字符串
//Z处
except
Exit;
end;
Result:=True;
end;
其中,TDataRecord的定义如下:
TDataRecord=record
A:Byte;
B:LongWord;
C:Word;
D:LongWord;
end;

现在调用时,提示地址访问非法:
Access Violation at address 0156132C in "ServerCOM.dll",
write of address 30303030

如果再次调用则没有错误。
逐步调试,发现有时在X处出现错误,有时在Y处出现错误,
有时在Z出出现错误。
错误后(再次读取读出了数据),客户端退出,提示:
“Runtime error 204 at 00003BBD”

各种方法都尝试了,不知什么原因,请高手指教。
在线等待!!
 
type
TDataRecord = record
A: Byte;
B: LongWord;
C: Word;
D: LongWord;
end;

function ReadOut(var Data: OleVariant): WordBool; overload;
var
S: string;
P: Pointer;
D: TDataRecord;
begin
Result := False;
SetLength(S, 22);
try
if not GetData(S) then Exit;
except
Exit;
end;
try
Data := VarArrayCreate([0, SizeOf(TDataRecord) - 1], varByte);
P := VarArrayLock(Data);
try
D.A := StrToInt('$' + Copy(S, 1, 2));
D.B := StrToInt('$' + Copy(S, 3, 8));
D.C := StrToInt('$' + Copy(S, 11, 4));
D.D := StrToInt('$' + Copy(S, 15, 8));
Move(D, P^, SizeOf(D));
finally
VarArrayUnLock(Data);
end;
Result := True;
except
Exit;
end;
end;

procedure ClientProc;
var
P: Pointer;
Count: Integer;
D: TDataRecord;
Data: OleVariant;
begin
if ReadOut(Data) then
begin
Count := VarArrayHighBound(Data, 1);
P := VarArrayLock(Data);
try
FillChar(D, SizeOf(D), 0);
Move(P^, D, Count);
finally
VarArrayUnLock(Data);
end;
end;
end;
 
先试验一下,行了分全部归你!
 
很久没有使用Delphi开发程序,
copy_paste这么一提示,才记得
以前也这么用的!
谢谢copy_paste!
 
对照了一下以前的程序,发现以前也是直接使用记录类型,
客户端直接传入记录类型,服务端读取的数据也用记录变量
直接传递到客户端,程序运行良好。
为何现在不行?????

另:
1、原来的记录类型的字段为WideString和Integer,
现在的字段全部为Byte或Word或LongWord;
2、原来的记录类型大小=84个字节(SizeOf测得),
现在的记录类型大小=64个字节。

为何原来可以,现在不行???????
 
我一般都不会直接用record,都会用上面的代码来传递。我也搞不清楚。[:)]
 
把你GetData,帖出来看看
 
后退
顶部