如何在64位中重新编译包含asm的Delphi组件?

时间:2014-02-13 08:52:39

标签: delphi

我正在尝试使用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;

1 个答案:

答案 0 :(得分:0)

似乎有一些具有相同名称的TOleControl方法的略微调整版本。 TOleControl是VCL自己的类型之一,你可以检查XE5实现(很可能使用纯粹的Pascal)来获得已经大部分工作的东西。