S
seabelial
Unregistered / Unconfirmed
GUEST, unregistred user!
我写了个用WEB SERVICE传递数据的软件,传递的结构是从TRemortTable继承的,然后自己加了个TByteDynArray来保存要传送的数据,在向WebServerice传递的时候,DELPHI会自动将该数组的数据转换成Base64编码,很奇怪的是,如果
该数组的前4个字节为0,后面即使有数据,也在生成的XML中为空(null=true),如果将第一个字节手工修改为非0,那么就可以把该数组成功传递,是不是很奇怪?
通过跟踪源代码,发觉是DELPHI在取TByteDynArray的指针的时候没有取到(前4个字节为0时),而取指针的代码是汇编写的,看不懂,请教高人了!
开发环境:DELPHI7
以下代码为DELPHI的源码,取对象指针的。
function GetOrdPropEx(Instance: TObject; PropInfo: PPropInfo): Longint;
asm
{ -> EAX Pointer to instance }
{ EDX Pointer to property info }
{ <- EAX Longint result }
PUSH EBX
PUSH EDI
MOV EDI,[EDX].TPropInfo.PropType
MOV EDI,[EDI]
MOV BL,otSLong
CMP [EDI].TTypeInfo.Kind,tkClass
JE @@isClass
CMP [EDI].TTypeInfo.Kind,tkDynArray
JE @@isDynArray
CMP [EDI].TTypeInfo.Kind,tkInterface
JE @@isInterface
XOR ECX,ECX
MOV CL,[EDI].TTypeInfo.Name.Byte[0]
MOV BL,[EDI].TTypeInfo.Name[ECX+1].TTypeData.OrdType
@@isDynArray:
@@isInterface:
@@isClass:
MOV ECX,[EDX].TPropInfo.GetProc
CMP [EDX].TPropInfo.GetProc.Byte[3],$FE
MOV EDX,[EDX].TPropInfo.Index
JB @@isStaticMethod
JA @@isField
{ the GetProc is a virtual method }
MOVSX ECX,CX { sign extend slot offs }
ADD ECX,[EAX] { vmt + slotoffs }
CALL dword ptr [ECX] { call vmt[slot] }
JMP @@final
@@isStaticMethod:
CALL ECX
JMP @@final
@@isField:
AND ECX,$00FFFFFF
ADD ECX,EAX
MOV AL,[ECX]
CMP BL,otSWord
JB @@final
MOV AX,[ECX]
CMP BL,otSLong
JB @@final
MOV EAX,[ECX]
@@final:
CMP BL,otSLong
JAE @@exit
CMP BL,otSWord
JAE @@word
CMP BL,otSByte
MOVSX EAX,AL
JE @@exit
AND EAX,$FF
JMP @@exit
@@word:
MOVSX EAX,AX
JE @@exit
AND EAX,$FFFF
@@exit:
POP EDI
POP EBX
end;
该数组的前4个字节为0,后面即使有数据,也在生成的XML中为空(null=true),如果将第一个字节手工修改为非0,那么就可以把该数组成功传递,是不是很奇怪?
通过跟踪源代码,发觉是DELPHI在取TByteDynArray的指针的时候没有取到(前4个字节为0时),而取指针的代码是汇编写的,看不懂,请教高人了!
开发环境:DELPHI7
以下代码为DELPHI的源码,取对象指针的。
function GetOrdPropEx(Instance: TObject; PropInfo: PPropInfo): Longint;
asm
{ -> EAX Pointer to instance }
{ EDX Pointer to property info }
{ <- EAX Longint result }
PUSH EBX
PUSH EDI
MOV EDI,[EDX].TPropInfo.PropType
MOV EDI,[EDI]
MOV BL,otSLong
CMP [EDI].TTypeInfo.Kind,tkClass
JE @@isClass
CMP [EDI].TTypeInfo.Kind,tkDynArray
JE @@isDynArray
CMP [EDI].TTypeInfo.Kind,tkInterface
JE @@isInterface
XOR ECX,ECX
MOV CL,[EDI].TTypeInfo.Name.Byte[0]
MOV BL,[EDI].TTypeInfo.Name[ECX+1].TTypeData.OrdType
@@isDynArray:
@@isInterface:
@@isClass:
MOV ECX,[EDX].TPropInfo.GetProc
CMP [EDX].TPropInfo.GetProc.Byte[3],$FE
MOV EDX,[EDX].TPropInfo.Index
JB @@isStaticMethod
JA @@isField
{ the GetProc is a virtual method }
MOVSX ECX,CX { sign extend slot offs }
ADD ECX,[EAX] { vmt + slotoffs }
CALL dword ptr [ECX] { call vmt[slot] }
JMP @@final
@@isStaticMethod:
CALL ECX
JMP @@final
@@isField:
AND ECX,$00FFFFFF
ADD ECX,EAX
MOV AL,[ECX]
CMP BL,otSWord
JB @@final
MOV AX,[ECX]
CMP BL,otSLong
JB @@final
MOV EAX,[ECX]
@@final:
CMP BL,otSLong
JAE @@exit
CMP BL,otSWord
JAE @@word
CMP BL,otSByte
MOVSX EAX,AL
JE @@exit
AND EAX,$FF
JMP @@exit
@@word:
MOVSX EAX,AX
JE @@exit
AND EAX,$FFFF
@@exit:
POP EDI
POP EBX
end;