我使用Delphi 7并从WDL文件导入以创建SOAP客户端。 Delphi使用WSDL中发布的函数以及这些函数的参数类型(类)生成接口代码。
Delphi已经确定了这样的事情
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;
应作为TByteDynArray发送......
function sendMessage(const theMessage: TByteDynArray;
const data: DataPart): WideString; stdcall;
这需要我将一个对象转换为一个TByteDnyArray,其中包括Delphi n00b - 我这样做是
theMessageArray := TByteDynArray(theMessage);
当我在调试器中查看对象时,它包含指针(到Ftimestamp
和Ftimestamp
),当我查看TByteDynArray时,我看到自相同的指针值。所以,似乎“演员”不是我想要的。如何将我的对象转换为所需的TByteDynArray? (并且,可能是“内联”指针所指向的对象)
我认为这有一个标准方法......
答案 0 :(得分:2)
在父类中查找流式传输数据的方法。 objectinstance.savetostream左右。它可能会迭代已发布的元素并将它们写入流中。
使用它将它写入内存流,它大致是一个围绕内存块的类(如tdynbytearray)。然后使用memorystream.size和setlength将tbytedynarray分配给适当的大小,并将字节从memorystream复制到新创建的数组中:
// (Untested)
memstream:=TMemoryStream.Create;
objectinstance.SaveToStream(memstream);
setlength(mybytearray,memstream.size);
if memstream.size>0 then
move (pansichar(memstream.memory)^,mybytearray[0],memstream.size);