2013-03-28 1 views
1

Delphi 2007에서 Delphi XE2와 비교하여 HDC 유형 (Device Context Handle)이 선언되는 방식에 차이가 있습니까?D2007 대 DXE2의 Delphi HDC 유형 선언

Control.Parent.Perform(WM_PAINT, Integer(DC), 0); 

D2007의 코드를 통해 DC (장치 컨텍스트)의 값을 스테핑 항상 MAXINT보다 적은 것 같다 : 다음 코드는 잘 작동하지만 DXE2의 범위 체크 오류가 발생 D2007에서

그러나 DXE2에서는 DC의 값이 대개 MaxInt보다 큽니다.

동일한 컴퓨터 (동일한 프로젝트, 동일한 코드, 동일한 OS)에서 실행될 때 D2007 및 DXE2에서 DC 값이 다른 이유는 무엇입니까?

DC를 WParam으로 캐스팅하는 것이 안전합니까? (이것은 부호없는 정수라고 생각합니다) 대신?

+0

난 강력하게 WParam''에 캐스팅 고용을 권하고 싶습니다 당신이 WPARAM 형식으로 DC 형을 변환 할 필요가있다이되지한다고 정수가 두 환경에서 컴파일하는 . – OnTheFly

답변

3

현대 델파이 버전에서는 캐스트가 올바르지 않습니다. Perform의 두 번째 매개 변수는 XE2에서 부호가없는 WPARAM으로 입력됩니다. 그러므로 캐스팅을한다면 WPARAM으로 캐스팅해야합니다.

32 비트 코드에서 캐스트는 음수 값으로 DC의 큰 값을 다시 해석합니다. 그런 다음 부호없는 매개 변수를 전달하면 범위 검사 오류가 발생합니다. 64 비트 코드에서는 캐스트가 포인터 잘림을 초래합니다.

하지만 어쨌든 캐스트 할 필요가 없습니다. HDCUINT_PTR이고 WPARAM이기 때문입니다.

Control.Parent.Perform(WM_PAINT, DC, 0); 

Windows 유형의 정의는 일반적으로 잘못 정의 된 여러 가지 키 유형이있는 Delphi에서 엉망이었습니다. 64 비트 Delphi 컴파일러가 도입되었을 때 Embarcadero는 이러한 오류를 수정하는 순간을 선택했습니다.

이전 델파이 버전에서는 WPARAM의 두 번째 매개 변수에 부호가 있지만 HDC의 부호가 없으므로 형 변환이 필요했습니다.

+0

WParam이 XE2에서 부호없는 것으로 변경되었다는 내용이이 [이전 게시물] (http://stackoverflow.com/questions/7837084/when-did-wparam-change-from-being-signed-to-unsigned)에서 발견되었습니다. 따라서 올바르게 이해한다면, 코드가 XE2 이전의 Delphi 버전에서 컴파일 될 경우 HDC를 캐스팅해야하지만,이를 Integer가 아닌 WParam으로 캐스팅해야합니다. XE2 이후에는 HDC를 전혀 캐스팅하지 않아야합니다. 그게 옳은 것 같니? – deonvn

+0

네, 맞습니다. 기본적인 문제는 이전 버전의 Delphi이 잘못한 것입니다. 그래서 당신은 그 실수를 보충하기 위해 캐스팅해야했습니다. 이전 코드와 새로운 코드를 컴파일하려면 'WPARAM'으로 변환하십시오. –

1

carfull 유형 WPARAM ..

Control.Parent.Perform(WM_PAINT, WPARAM(DC), 0); 
+0

이미'HDC'를'WPARAM'으로 형변환 할 필요가 없습니다. 둘 다'UINT_PTR'입니다. –

+0

@David, 그건 당신이 의지해서는 안되는 것입니다. 당신은 지금 그것을 할 필요는 없지만, 미래에 HDC 나 WPARAM이 다른 유형으로 정의 될지도 모른다. [+1] – TLama

+1

@TLama 볼랜드가 다시 망쳐 버렸기 때문에 바뀌 었습니다. 나머지 세계에서는 영원히 서명하지 않았습니다. 이렇게하면 모든 것을 망칠 것이기 때문에 바뀌지 않을 것입니다! 다시 돌아 가면 Borland의 매개 변수 선언은 정수입니다. 그래서 integer로 캐스팅하는 것은 당신의 분석에 의해 바로 그랬을 것입니다.하지만 그게 처음부터 오류로 이어졌습니다. 유형이 올바르게 선언되었으므로 형변환을 제거 할 수 있습니다. 캐스팅의 문제점은 유형 시스템 외부로 이동한다는 것입니다. 캐스트는 항상 코드 냄새입니다. –