2010-06-19 4 views
3

나는 응용 프로그램은 here함수에 대한 포인터와 WINAPI 함수에 대한 포인터의 차이점은 무엇입니까?

은 일반적으로 내가 그 코드를 이해의 x64 PC에 X32 에뮬레이션 환경에서 실행되고 있는지 여부를 감지하는 코드를 건너 왔지만 내가하지 않는 한 가지가있다 :

1) BOOL typedef에 (WINAPI * LPFN_ISWOW64PROCESS) (핸들, PBOOL);

왜 WINAPI가 있어야합니까? 포인터가 내 정의 된 함수를 가리 키지 않고 WINAPI 함수를 가리키는 것이 중요하다는 것은 왜 중요한가요? 이 2 개의 포인터가 다를까요?

감사합니다,

크라

답변

4

WINAPI는 __stdcall로 확장됩니다. 대부분의 경우 __cdecl과 다른 호출 규칙 인이 호출 규칙을 사용하면 안됩니다. 차이점은 __stdcall에서 호출되는 함수는 스택을 지우는 반면 __cdecl에서는 호출자가 스택을 지우는 것입니다. __stdcall은 __cdecl과 같은 varadic (가변 인수 길이) 함수를 지원하지 않지만 __stdcall은 더 빨라지고 경우에 따라 코드 크기를 줄일 수 있습니다.

+0

요약하면, WINAPI는 컴파일러가 함수가 완료된 후 스택의 엉망을 정리하는 코드를 생성하지 않는다고 말합니다. – Kra

+0

@Kra : 대부분 그렇습니다. x86_64로 변환하는 방법을 모르겠지만 x86에서 확실히 그렇습니다. –

+0

멋지다, 그것은 컴파일러가 WINAPI가 제거되고 그 앱이 ESP 값이 함수 호출을 적절히 저장하지 못했다는 정보와 충돌 할 때 신음하지 않는다. 지식을 공유해 주셔서 감사합니다 :) – Kra

1

WINAPI 일반적으로 WinAPI를 기능에 관련된 구현 고유 선언의 세부 사항을 포함하는 매크로입니다 (크기의 방법으로, 그들은 등을 만들어 배치). 호출 규칙처럼. 위의 포인터 을 가리킬 수 있습니다. 을 가리키면 WinAPI 함수와 동일한 호출 규칙을 따르는 한 함수는입니다.

이 매크로의 철자가 WINAPI 인 것은 아무런 의미가 없습니다. A, HELLO_WORLD 또는 그 밖의 것이 철자 일 수 있습니다. 그 WINAPI 매크로의 전체와 유일한 포인트는 이러한 모든 WinAPI 관련 규칙이 설명 된 단일 장소를 제공하는 것이므로 변경 사항이있을 경우 한 곳에서 수정하면됩니다.

쉽게 해결할 수있는 매크로가 될 수 있습니다.

0

이전 게시물에 동의하십시오. BTW 나는 왜 __cdecl이 여전히 C/C++의 "기본"호출 규칙으로 간주되는지 이해하지 못합니다.

분명히 을 사용하면 __stdcall보다 약간 큰 코드가됩니다.이 함수는 한 번 작성되고 보통 여러 코드 조각 내에서 호출되기 때문에 분명합니다. 예, __cdecl은 가변 인수 길이를 허용하므로 더 유연합니다. 그러나이 셔츠는 ...으로 표시된 해당 기능에 대해서만 IMHO로 사용됩니다.

예를 들어 멤버 함수의 경우 (예 : thiscall) Msvc는 정확히 다음을 수행합니다. 함수가 가변 인수를 허용하지 않는 한 __stdcall과 같은 호출 규칙을 사용합니다. (ECX 등록을 통해 이 전달됩니다).

+0

@valdo : 컴파일러 공급 업체에 맡겨야합니다. C++은'extern "C"'이외의 호출 규칙에 대한 잭이 호출 ​​규칙을 변경할 수 있다고 말하지 않습니다. –

관련 문제