转换c++;指向delphi的指针 实际上,我把C++代码转换成Delphi,但是我有问题要翻译这个行< /P> PIMAGE_NT_HEADERS header = (BYTE *)lib + ((PIMAGE_DOS_HEADER)lib)->e_lfanew;

转换c++;指向delphi的指针 实际上,我把C++代码转换成Delphi,但是我有问题要翻译这个行< /P> PIMAGE_NT_HEADERS header = (BYTE *)lib + ((PIMAGE_DOS_HEADER)lib)->e_lfanew;,delphi,Delphi,致德尔福(这是我目前的结果) 但是编译器给我的消息是运算符不适用于此操作数类型 你能帮我翻译一下这句话吗。你也许可以避开很多。如果要查找PE映像头例程,请从RTL中查找ImageHlp单元,从JCL中查找JclPeImage单元。他们有很多预构建的代码,使图像和图像标题更容易工作。新成员很可能是偏移量,因此它需要是整数或DWORD,而不是指针。只是猜测,因为我不使用Delhpi,但您是否尝试过:- header:=指针(PByte(lib)+(DWORD)(PImageDosHeader(lib

致德尔福(这是我目前的结果)

但是编译器给我的消息是
运算符不适用于此操作数类型


你能帮我翻译一下这句话吗。

你也许可以避开很多。如果要查找PE映像头例程,请从RTL中查找ImageHlp单元,从JCL中查找JclPeImage单元。他们有很多预构建的代码,使图像和图像标题更容易工作。

新成员很可能是偏移量,因此它需要是整数或DWORD,而不是指针。只是猜测,因为我不使用Delhpi,但您是否尝试过:-

header:=指针(PByte(lib)+(DWORD)(PImageDosHeader(lib))

网络搜索结果如下:


这段代码是基于Delphi的,使用的是与您相同的库。您很可能会在CheesyDoodle上的这个代码列表中找到一个隐藏的解决方案。

指针算法在delphi中受到更大的限制,不允许直接添加。您必须在指针上使用Inc函数

示例():


我不在Delphi中日常工作,但我怀疑错误是由以下两种原因之一造成的:

  • 未启用指针数学。默认情况下,Delphi不允许您进行C风格的指针操作,例如向指针添加一个数字以获得另一个指针—请记住,Delphi是一种“安全”的语言。要启用此功能,请执行以下操作。这也有一些更多的信息

  • 这是我不记得的一点,因为已经有一段时间了:您可能无法添加不同类型的指针-记住指针指向的对象的大小是不同的。如果不知道
    \u lfanew
    是什么,我就不能给你更多的信息。如果是这种情况,则以字节为单位获取所有内容并添加这些内容

  • 您可能还想使用
    Inc
    函数,将代码转换为更像Delphi的代码
    Inc
    将按指针指向的结构的大小,而不是一个字节,递增键入的指针。指针数学通常不是C风格的:)不过我认为它更好,因为它具有类型意识


    编辑:我注意到有人对你的问题发表评论,指出这可能是在解析PE图像。如果是,请查找的PE图像单元。我从未使用过它,但我知道它存在,它是C头的翻译。它也可能包含辅助函数。使用它可能意味着重写代码而不是转换代码,但最终可能会得到更干净、更德尔福风格的代码。

    您正在处理的称为RVA(相对虚拟地址)。基本公式是
    header := Pointer(Integer(PByte(lib)) + PImageDosHeader(lib)._lfanew);
    
    地址=基+位移。当然,地址和基是非类型指针,而位移是有符号整数。对象Pascal不允许指针算术,因此需要类型转换。 因此:


    这看起来很像C,而不是C++。你不能逐行转换C++到Delphi,因为C++中的操作没有在Delphi中。因此,在不知道数据定义、上下文和代码试图执行的操作的情况下,不可能帮助您翻译一行代码?解析PE文件?将它保留为C并从Delphi链接到它会容易得多。为什么要投-1票?对我来说,这似乎是一个有效的问题,在语言之间转换代码时遇到困难…@David Thornley,拜托,如果我有可能,这是一个非常小的问题,请看我下面的文本这是不正确的-您可以使用
    {$POINTERMATH on}
    指令。我发布了一个答案,提供了更多信息。POINTERMATH指令是在D2009中添加的,因此早期版本中不提供指针算术。因为您必须强制转换为整数,所以PByte强制转换是多余的。此外,更明智的做法是强制转换为基数而不是整数,以免意外溢出。您不需要强制转换,因为
    lib
    是一个
    THandle
    ,它被声明为
    Cardinal
    ,所以您可以使用这个
    头:=指针(lib+PImageDosHeader(lib))在使用大地址感知PE标志或即将推出的Delphi 64位编译器时,将指针强制转换为整数可能会出错。@Remko:确实如此。或者更确切地说,这几乎保证不会像在WIN64上那样工作。我认为现在最好使用像DWORD_PTR或ULONG_PTR这样的类型(类型DWORD_PTR=DWORD)。稍后,当x64编译器出现时,您只需更改此类型。
    
        program PointerArithmetic;
    
    {$APPTYPE CONSOLE}
    
    uses
      SysUtils;
    
    procedureWritePointer(P: PDouble);
    begin
      Writeln(Format('%8p', [P]));
    end;
    
    var
      P: PDouble;
    
    begin
      P := Pointer($50000);
      WritePointer(P);
      Inc(P);    // 00050008 = 00050000 + 1*SizeOf(Double)
      WritePointer(P);
      Inc(P, 6); // 00050038 = 00050000 + 7*Sizeof(Double)
      WritePointer(P);
      Dec(P, 4); // 00050018 = 00050000 + 3*Sizeof(Double)
      WritePointer(P);
      Readln;
    end.
    
    header := Pointer(Integer(PByte(lib)) + PImageDosHeader(lib)._lfanew);
    
    var 
      Address, Base: Pointer; 
      Displacement: Integer;
    { ... }
    Address := Pointer(Cardinal(Base) + Displacement);
    { or, in your case }
    var
      Module: HMODULE; { opaque type designates module handle and equals to load address }
      NTHeaders: PImageNtHeaders;
    begin
      NTHeaders := Pointer(Cardinal(Module) + PImageDosHeader(Module)^._lfanew);
      if NTHeaders^.Signature = ......