2010-03-06 6 views
3

이것은 C4055 경고 메시지입니다.C4055 경고는 어떻게 해결합니까?

'변환': 데이터 포인터 '타입 1'포인터 'TYPE2를'기능까지
데이터 포인터가 함수 포인터 (어쩌면 잘못) 주조된다.
/Za에서 레벨 1 경고이고/Ze에서 레벨 4 경고입니다. ? 이것은 코드 경고했다됩니다

: 우리가이 경고

편집 (올바른 방법이 아닌 트릭으로)를 해결하려면 어떻게해야

.

typedef NTSTATUS (*t_ObRegisterCallbacks) 
(
    IN POB_CALLBACK_REGISTRATION CallBackRegistration, 
    OUT PVOID *RegistrationHandle 
); 

t_ObRegisterCallbacks g_ObRegisterCallbacks = NULL; 

void foo() 
{ 
    g_ObRegisterCallbacks = (t_ObRegisterCallbacks)MmGetSystemRoutineAddress(&regName); //C4055 
} 
//warning C4055: 'type cast' : from data pointer 'PVOID' to function pointer 't_ObRegisterCallbacks' 
+1

을 참고로,'MmGetSystemRoutineAddress을()'XP SP2에 문제가 있습니다 : http://www.osronline.com/article.cfm ? article = 494 – bk1e

답변

10

WDK 헤더 파일이 깨끗하지 않습니다. MmGetSystemRoutineAddress()의 반환 형식은 PVOID 대신 FARPROC를 선언해야합니다. 여전히 WDK를 사용하여 장치 드라이버를 작성할 수있는 모든 컴퓨터에서 문제가되지 않으며 void *는 문제없이 함수 주소로 변환되며 데이터 및 코드 포인터는 32 비트 및 64 비트 플랫폼에서 동일한 크기를 갖습니다 . 그것은 분열 된 기억 모델의 불행을 되 찾을 때 지옥에서 추운 날이 될 것입니다. 난 당신이 단순히 경고의 #pragma와 경고를 해제하는 것이 좋습니다

가 (해제 : 4055)

+0

명확한 답변을 보내 주셔서 감사합니다. – Benjamin

7

데이터 포인터와 함수 포인터 사이의 캐스팅은 허용되지 않습니다. 당신은 타입 변환을 위해 유니온 해킹을 사용할 수 있습니다 : 두 포인터를 모두 포함하는 공용체 타입. 그런 다음 하나의 타입으로 쓰고 다른 타입으로 읽습니다. 말할 필요도없이 이것은 표준과 관련해서는 이식 할 수 없지만 컴파일러를 행복하게 만들고 실제로 실제로 작동합니다.

함수 포인터를 데이터 포인터 (dlsym은 인기있는 함수 중 하나임)로 반환하는 함수는 설계 상 끊어졌으며 유니온 해킹과 같은 트릭을 통해서만이 문제를 해결할 수 있습니다.

관련 문제