2012-02-28 4 views
2

제발, 누구든지 나를 위해이 코드를 변환 할 수 있습니까?C++과 같은 Delphi 템플릿?

나 C++에 대해 많이 모르는, 그래서 델파이로 C++에서이 코드를 변환해야합니다

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

감사합니다 ...

+1

델파이에는 템플릿이없고 코드를 직접 변환 할 수 없습니다. 진행하려면 코드가 어떻게 사용되고 있는지 확인해야합니다. –

+0

@DavidHeffernan이 코드는이 함수에서 사용됩니다. http://pastebin.com/7d9N1J2c "eat_hook" – paulohr

+0

이 기능은 복잡해 보일 수 있지만 pointee 형식과 관계없이 포인터에 오프셋을 추가하기 만합니다. – ereOn

답변

4

그것은, 변환 실제로 매우 간단하지만, 당신은 델파이에서 템플릿을 사용할 수 없습니다. 포인터에 오프셋을 추가하는 것 뿐이지 만 오프셋은 포인터 기본 형식의 배수가 아닌 바이트 단위로 지정됩니다.

그래서

PIMAGE_NT_HEADERS(PAnsiChar(DosHeader)+DosHeader.e_lfanew) 

좀 더 예에

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

변환 : 등등

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

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

하고 있습니다.

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; 

:

+0

David Hefferman, 감사합니다. – paulohr

+0

자,이 코드를 도와 줄 수 있습니까? PIMAGE_EXPORT_DIRECTORY ExportDirectory = ByteOffset (DosHeader, 'NtHeader-> OptionalHeader.DataDirectory [IMAGE_DIRECTORY_ENTRY_EXPORT] .VirtualAddress)' 및 'DWORD * 함수 = ByteOffset (DosHeader, ExportDirectory-> AddressOfFunctions) ; ' – paulohr

+3

정확히 같은 패턴을 사용하십시오. 첫 번째 단계는 C++ 코드의 기능과 파스칼 코드가 동일한 이유를 이해하는 것입니다. 나는 (또는 다른 누군가) 당신을 위해 모든 것을 할 수 있었지만 그때는 아무것도 배울 수 없었을 것입니다. 네가 할 수있을거야! –

3

델파이 제네릭은 C++ 템플릿에 가장 가까운 equivilent 예입니다.

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