2009-08-18 7 views
8

C++ : MSVC에서 __stdcall을 사용하는 콜백 typedef

이 typedef :

typedef DWORD WINAPI 
(* CM_Open_DevNode_Key)(DWORD, DWORD, DWORD, DWORD, PHKEY, DWORD); 
은 BorlandCpp에서 잘 컴파일되지만 msvc에서 컴파일하면 __stdcall (별칭은 __stdcall 임)을 제거해야합니다.

typedef DWORD 
(* CM_Open_DevNode_Key)(DWORD, DWORD, DWORD, DWORD, PHKEY, DWORD); 

왜 이런 일이 발생합니까? ? WINAPI 부분을 안전하게 제거 할 수 있습니까?

업데이트 : "WINAPI"형식의 typedef를 제거해야했습니다. 그렇지 않으면

 error C2059: syntax error : '(' 

줄이 있습니다.

Msvc가 할 수없는 동안 왜 볼랜드가 "WINAPI"로 컴파일 할 수 있는지 말해 줄 수 있습니까?

+0

죄송합니다. 포함되어 있습니다. – George

답변

13

나는 VC++을 (를) 호출 규칙을 넣어야한다고 믿는다. 여기에 example은 MSDN에서 함수 포인터 typedef 내에서 호출 규칙을 사용하고있다.

typedef DWORD (WINAPI * CM_Open_DevNode_Key)(DWORD, DWORD, DWORD, DWORD, PHKEY, DWORD); 

이것은 문제없이 컴파일해야합니다.

+0

고마워,이 하나의 작품 :) – George

0

함수 포인터는 함수가 사용하는 호출 규칙에 대한 정보가 있어야합니다. __cdecl 호출 규칙을 사용하는 함수를 가리키는 경우 __cdecl 함수 포인터를 사용해야합니다. __stdcall 호출 규칙을 사용하는 함수를 가리키는 경우 __stdcall 함수 포인터를 사용해야합니다.

희망이 도움이됩니다.

0

사이드 노트 : 나는 기능 서명 형식 정의가 포인터 형식 정의로 표현되지 안 믿습니다.

이 아닌 포인터, 단순히

CM_Open_DevNode_Key MYFUNC로 작성되었을 수 있습니다이 콜백 서명을 수행하는 함수의 헤더 선언 할 CM_Open_DevNode_Key를 정의했다면

;

보다는 장황/오류가 발생하기 쉬운

DWORD WINAPI MYFUNC (DWORD, DWORD, DWORD, DWORD, PHKEY, DWORD);

이 훨씬 간단 코드를 허용하고 필요한 경우 기능 서명 훨씬 더 구체적인 일치 업 것이다.

은 (: 적절하게 평가 "CONST CHAR의 *"대 "const를 PChar는"악명 높은 예) 지적되는 내용의 const와 지정-수 DIS 때문에 그 포인터 형식 정의는 일반적으로 악 언급 할 필요가 없을 것입니다.