Шаблоны Delphi, такие как C ++? - PullRequest
       31

Шаблоны Delphi, такие как C ++?

2 голосов
/ 28 февраля 2012

Пожалуйста, кто-нибудь может конвертировать этот код для меня?

Я не так много знаю о C ++, поэтому мне нужно преобразовать этот код из C ++ в delphi:

template <typename DestType, typename SrcType>
DestType* ByteOffset(SrcType* ptr, ptrdiff_t offset)
{
        return reinterpret_cast<DestType*>(reinterpret_cast<unsigned char*>(ptr) + offset);
}

Спасибо ...

Ответы [ 2 ]

4 голосов
/ 28 февраля 2012

На самом деле конвертировать довольно просто, но вы не можете использовать шаблоны в Delphi.Это просто добавление смещения к указателю, но смещение указывается в байтах, а не кратно базовому типу указателя.

Так что конвертируйте

ByteOffset<IMAGE_NT_HEADERS>(DosHeader, DosHeader->e_lfanew)

в

PIMAGE_NT_HEADERS(PAnsiChar(DosHeader)+DosHeader.e_lfanew)

Еще несколько примеров:

ExportDirectory := PIMAGE_EXPORT_DIRECTORY(PAnsiChar(DosHeader)+
    NtHeader.OptionalHeader.
    DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress);

functions := PDWORD(PAnsiChar(DosHeader)+ExportDirectory->AddressOfFunctions);

и т. Д.

3 голосов
/ 29 февраля 2012

Delphi Generics является наиболее близким к шаблонам C ++, например:

type
  ByteOffset<DestType, SrcType> = class
  public
    type
      PSrcType = ^SrcType;
      PDestType = ^DestType;

    class function At(ptr: PSrcType; offset: NativeInt): PDestType;
  end;

class function ByteOffset<DestType, SrcType>.At(ptr: PSrcType; offset: NativeInt): PDestType;
begin
  Result := PDestType(PByte(ptr) + offset);
end;

.

var
  I: Integer;
  W: PWord;
begin
  I := $11223344;
  W := ByteOffset<Word, Integer>.At(@I, 2);
end;
...