【发布时间】:2010-07-01 12:28:18
【问题描述】:
我对 Delphi 还很陌生,必须编写一个 SOAP 客户端。导入 WSDL 会生成此代码(我显然无法更改,因为我显然必须遵守服务器端)
DataPart = class;
Message = class;
eMessage = class;
eventType = ( send, delete, etc );
DataPart = class(TRemotable)
private
FhasData: Boolean;
Fdata: TByteDynArray;
published
property hasData: Boolean read FhasData write FhasData;
property data: TByteDynArray read Fdata write Fdata;
end;
Message = class(TRemotable)
private
FMessageID: Int64;
Ftimestamp: TXSDateTime;
Fevent: eventType;
FmagicNumber: WideString;
FDataPart: DataPart;
published
property MessageID: Int64 read FMessageID write FMessageID;
property timestamp: TXSDateTime read Ftimestamp write Ftimestamp;
property event: eventType read Fevent write Fevent;
property magicNumber: WideString read FmagicNumber write FmagicNumber;
property DataPart: DataPart read FDataPart write FDataPart;
end;
eMessage = class(TRemotable)
private
FencryptedMessage: TByteDynArray;
Fdata: DataPart;
published
property encryptedMessage: TByteDynArray read FencryptedMessage write FencryptedMessage;
property data: DataPart read Fdata write Fdata;
end;
MyApplicationPortType = interface(IInvokable)
['{99767D33-6B4A-7547-4DAC-0608095CAC70}']
function sendMessage(const encryptedMessage: TByteDynArray; const data: DataPart): WideString; stdcall;
end;
谁能给我编写一个带有虚拟值的示例,该示例将调用 sendMessage() 并且不会导致访问冲突?我真的不知道如何处理 TByteDynArray
[编辑] 根据要求,这是我的代码,但是 - 免责声明 - 在发布之前我不得不对其进行大量修改(减少它),因此它可能无法编译。 sendMessage() 的两个参数都是非空的
var theMessageArray: TByteDynArray;
theResult : WideString;
messageData : TByteDynArray;
i : Integer;
begin
theMessage.messageID := theMessage.messageID + 1;
theMessage.timestamp := TXSDateTime.Create();
theMessage.timestamp.AsDateTime := Now();
theMessage.event := delete;
theMessage.magicNumber := 'magic # ' + IntToStr(theMessage.messageID);
SetLength(messageData, 1);
messageData[0] := 0;
theMessage.dataPart.hasData := True;
messageData := theMessage.dataPart.messageData;
SetLength(messageData, $1000 * dataSize);
for i := 0 to $1000 * dataSize - 1 do
messageData[i] := i and $FF;
theMessage.DataPart.messageData := messageData;
theMessageArray := TByteDynArray(theMessage);
theResult := (HTTPRIO1 as MyApplicationPortType).sendMessage(theMessageArray, theMessage.dataPart);
【问题讨论】:
-
这只是一个界面。你在做什么导致访问冲突?
-
+1 提出一个好问题。有两种方法可以解决这个问题 - 向您展示我的代码并弄清楚它为什么不起作用,或者有人发布了一些有效的代码,我可以将它与我自己的进行比较。好的,我会发布我的代码,但重要的是(我认为)两个参数在调用时都是非空的
-
你真的是在从胜利的口中抢夺失败,因为你使用了 TByteDynArray 而不仅仅是 TBytes(这实际上只是一个字符串)。
-
什么版本的delphi?请更新(重新标记)。
-
AV 源很可能是这样的:
theMessageArray := TByteDynArray(theMessage);变量不是动态数组;类型转换不会使它成为一个。该分配将尝试增加假定数组的引用计数,它甚至可以运行而不会崩溃。之后,sendMessage尝试使用该内存,就好像它是一个数组一样。它读取“长度”并尝试访问那么多字节。该长度不能准确反映那里有多少字节,或者引用计数修改可能会破坏内存。经验法则:如果你对动态数组进行类型转换,就会出现问题。
标签: delphi