我正在尝试使用Delphi XE5在64位环境中重新编译(旧)TProfDHTMLEdit单元。该组件已经陈旧并被解雇,但我需要它,因为我找不到任何类似的东西,很容易将其替换为我的目的。
我遇到了三个直接在asm中硬编码的内部例程。我无法用纯Pascal转换它们。有人已经解决了类似的问题吗?
要转换的部分是:
procedure TProfOleControl.GetEventMethod(DispID: TDispID; var Method: TMethod);
asm
{$IFDEF WIN32}
PUSH EBX
PUSH ESI
PUSH EDI
PUSH ECX
MOV EBX,EAX
MOV ECX,[EBX].TProfOleControl.FControlData
MOV EDI,[ECX].TControlData2.EventCount
MOV ESI,[ECX].TControlData2.EventDispIDs
XOR EAX,EAX
JMP @@1
@@0: CMP EDX,[ESI].Integer[EAX*4]
JE @@2
INC EAX
@@1: CMP EAX,EDI
JNE @@0
XOR EAX,EAX
XOR EDX,EDX
JMP @@3
@@2: PUSH EAX
CMP [ECX].TControlData2.Version, 401
JB @@2a
MOV EAX, [ECX].TControlData2.FirstEventOfs
TEST EAX, EAX
JNE @@2b
@@2a: MOV EAX, [EBX]
CALL TObject.ClassParent
CALL TObject.InstanceSize
ADD EAX, 7
AND EAX, not 7
@@2b: ADD EBX, EAX
POP EAX
MOV EDX,[EBX][EAX*8].TMethod.Data
MOV EAX,[EBX][EAX*8].TMethod.Code
@@3: POP ECX
MOV [ECX].TMethod.Code,EAX
MOV [ECX].TMethod.Data,EDX
POP EDI
POP ESI
POP EBX
{$ENDIF}
end;
或
procedure TProfOleControl.InvokeEvent(DispID: TDispID; var Params: TDispParams);
var
EventMethod: TMethod;
begin
GetEventMethod(DispID, EventMethod);
if Integer(EventMethod.Code) < $10000 then Exit;
try
{$IFDEF WIN32}
asm
PUSH EBX
PUSH ESI
MOV ESI, Params
MOV EBX, [ESI].TDispParams.cArgs
TEST EBX, EBX
JZ @@7
MOV ESI, [ESI].TDispParams.rgvarg
MOV EAX, EBX
SHL EAX, 4
XOR EDX, EDX
ADD ESI, EAX
@@1: SUB ESI, 16
MOV EAX, dword ptr [ESI]
CMP AX, varSingle
JA @@3
JE @@5
@@2: TEST DL,DL
JNE @@2a
MOV ECX, ESI
INC DL
TEST EAX, varArray
JNZ @@6
MOV ECX, dword ptr [ESI+8]
JMP @@6
@@2a: TEST EAX, varArray
JZ @@5
PUSH ESI
JMP @@6
@@3: CMP AX, varDate
JA @@2
@@4: PUSH dword ptr [ESI+12]
@@5: PUSH dword ptr [ESI+8]
@@6: DEC EBX
JNE @@1
@@7: MOV EDX, Self
MOV EAX, EventMethod.Data
CALL EventMethod.Code
POP ESI
POP EBX
end
{$ENDIF}
except
Application.HandleException(Self)
end
end;
答案 0 :(得分:0)
似乎有一些具有相同名称的TOleControl方法的略微调整版本。 TOleControl是VCL自己的类型之一,你可以检查XE5实现(很可能使用纯粹的Pascal)来获得已经大部分工作的东西。