2010-11-29 4 views
4

코드 줄은 내가델파이 포인터 연산

(oleDataPointer + SizeOf(oleFileDescriptorW)*Index + 4)^

그냥 SizeOf(oleFileDescriptorW)*Index + 4로 포인터를 이동하려면 특히이 부분을이

MoveMemory(poleFileDescriptorW 
     , (oleDataPointer + SizeOf(oleFileDescriptorW) *Index + 4)^ 
     , SizeOf(oleFileDescriptorW)); 

를 컴파일 할 수 있도록 writed해야하는 방법 바이트

변수는 다음과 같이 정의됩니다.

pOLEFileDescriptorW : ^FILEDESCRIPTORW; 
oleDataPointer : Pointer; 
+0

사용하는 변수의 유형은 무엇입니까 포인터 연산을 사용할 수 있습니까? –

답변

8

정수 유형으로 변환하려면 수학을 수행하고 다시 캐스팅하십시오.

나는 보통 Cardinal을 사용하지만 64 비트 컴파일러에서는 작동하지 않는다고 생각합니다. 델파이 RTL 함수 Move 필요한 (이것은 MoveMemoryMove 유일한 차이점이다)로

Pointer(NativeInt(oleDataPointer) + SizeOf(oleFileDescriptorW)*Index + 4)

+0

델파이는 여전히 32 비트입니다. 당신이 가진 OS의 종류는 중요하지 않습니다. 64 비트 OS에서 프로그램은 WOW에서 에뮬레이트됩니다. –

+2

Delphi의 * 여전히 * 64 비트 버전이 있습니까? 아직도 내 코드가 미래의 64 비트 델파이 컴파일러 (또는 64 비트 freepascal)와 작동하도록하고 싶습니다. – CodesInChaos

+2

@CodeInChaos :'NativeUInt' 타입을 사용할 수 있습니다. –

2

MoveMemory와 동일한 기능 CopyMemory,하지 포인터 변수를 받아 들인다.

포인터를 역 참조하면 안됩니다. 그냥 할

MoveMemory(poleFileDescriptorW, 
      (oleDataPointer + SizeOf(oleFileDescriptorW)*Index + 4), 
      SizeOf(oleFileDescriptorW)); 

여기서 각 인수는 포인터/추기경입니다. 실제 데이터 유형에 따라 약간의 캐스팅이 필요할 수 있습니다. 예를 들어, PSomeType(cardinal(myPointer) + cardinal(myPointer2))을해야 할 수도 있습니다.

어쨌든 포인터를 역 참조 할 필요가 있다면 그 유형을 지정해야합니다.

(oleDataPointer + SizeOf(oleFileDescriptorW)*Index + 4)^ 

(이유는 무엇입니까?) Do

PMyType(cardinal(oleDataPointer) + SizeOf(oleFileDescriptorW)*Index + 4)^ 
1

Typecast to Integer.

Pointer(Integer(oleDataPointer) + SizeOf(oleFileDescriptionW) * Index + 4) 

그리고 Andreas는 직접 포인터를 사용해야 옳았다. 작동하는지 확인하십시오. 당신이> = 2009 델파이를 사용하는 경우 하나님이

+0

'integer'가 아닌'cardinal'으로 캐스팅해야합니다 (왜?)! 또한,'MoveMemory' /'CopyMemory'는 변수가 아닌 포인터를 필요로하기 때문에 ('Move'의 경우처럼) 역 참조하면 안됩니다. –

+1

부호없는 정수 유형을 선호하지만 대부분 문체 문제입니다. 그러나 정수 오버 플로우 검사가 켜져 있으면 코드가 실패 할 수 있습니다 (기본값은 꺼져 있습니다). – CodesInChaos

+0

@andreas Integer가 아닌 이유는 무엇입니까? 델파이는 변환을 수행하고 오버플로에 대한 데이터를 잃어 버립니까? – Trinidad

6

을 축복

는 ON으로 $의 POINTERMATH를 설정하고 직접