转换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中日常工作,但我怀疑错误是由以下两种原因之一造成的:
\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 = ......