문제

Win32 프로그래밍에 대해 배우고 있습니다 WinMain 프로토 타입은 다음과 같습니다.

int WINAPI WinMain ( HINSTANCE instance, HINSTANCE prev_instance, PSTR cmd_line, int cmd_show )

나는 이것에 대해 혼란 스러웠다 WINAPI 식별자는 다음과 같습니다.

#define WINAPI      __stdcall

이것은 무엇을합니까? 나는 이것이 반환 유형 후에 무언가를 가지고 있다는 것에 혼란스러워한다. 무엇인가요 __stdcall 을 위한? 리턴 유형과 함수 이름 사이에 무언가가있을 때란 무엇을 의미합니까?

도움이 되었습니까?

해결책

__stdcall 함수에 사용 된 호출 규칙입니다. 이것은 컴파일러에게 스택 설정에 적용하고 인수를 푸시하며 반환 값을 얻는 규칙을 알려줍니다.

기타 여러 부름 규칙이 있습니다. __cdecl, __thiscall, __fastcall 그리고 훌륭하게 지명되었습니다 __naked. __stdcall Win32 시스템 호출에 대한 표준 호출 협약입니다.

Wikipedia는 세부.

주로 코드 (예 : OS API) 외부의 함수를 호출하거나 OS가 귀하를 호출 할 때 중요합니다 (여기서 Winmain의 경우와 마찬가지로). 컴파일러가 올바른 통화 규칙을 모르는 경우 스택을 올바르게 관리하지 않으므로 매우 이상한 충돌이 발생할 수 있습니다.

다른 팁

C 또는 C ++ 자체는 해당 식별자를 정의하지 않습니다. 그것들은 컴파일러 확장이며 특정 전화 규칙을지지합니다. 이는 인수를 어디에 두어야하는지, 순서대로 호출 된 함수가 반환 주소를 찾을 위치 등을 결정합니다. 예를 들어, __fastCall은 기능의 인수가 레지스터를 통해 전달됨을 의미합니다.

그만큼 위키 백과 기사 거기에서 발견 된 다양한 전화 규칙에 대한 개요를 제공합니다.

지금까지의 답변은 세부 사항을 다루었지만, 당신이 어셈블리로 떨어지지 않으려면, 당신이 알아야 할 것은 발신자와 Callee가 동일한 통화 컨벤션을 사용해야한다는 것입니다. 그렇지 않으면 버그를 얻을 수 있습니다. 찾기가 어렵습니다.

나는 지금까지 모든 답변이 정확하다는 데 동의하지만 여기에 이유가 있습니다. Microsoft의 C 및 C ++ 컴파일러는 응용 프로그램의 C 및 C ++ 기능 내에서 (의도 된) 기능 호출 속도에 대한 다양한 통화 규칙을 제공합니다. 각각의 경우, 발신자와 칼리는 어떤 전화를 사용할 것인지에 동의해야합니다. 이제 Windows 자체는 기능 (API)을 제공하며 이미 컴파일 된 기능 (API)이므로 호출 할 때 그것들을 준수해야합니다. Windows API에 대한 호출 및 Windows API의 콜백은 __stdCall 컨벤션을 사용해야합니다.

기능을 기본적으로 스택에 넣는 순서와 정리를 담당하는 순서와 관련이 있습니다.

문서는 다음과 같습니다.하지만 첫 번째 부분을 이해하지 않는 한 많은 의미는 없습니다.
http://msdn.microsoft.com/en-us/library/zxk0tw93.aspx

__stdCall은 함수 인수를 스택에 넣는 데 사용됩니다. 함수가 완료된 후에는 자동으로 메모리를 처리합니다. 이것은 고정 인수에 사용됩니다.

void __stdcall fnname ( int, int* )
{
    ...
}

int main()
{
    CreateThread ( NULL, 0, fnname, int, int*...... )
}

여기 fnname args는 스택으로 직접 밀어 넣었습니다.

나는 오늘까지 이것을 사용할 필요가 없었습니다. 내 코드에서 나는 멀티 스레딩을 사용하고 있고 내가 사용하는 멀티 스레딩 API는 Windows One (_beginthreadex)입니다.

스레드를 시작하려면 :

_beginthreadex(NULL, 0, ExecuteCommand, currCommand, 0, 0);

ExecuteCommand 함수 해야 하다 TeatThreadex가 호출하려면 메소드 서명에서 __stdcall 키워드를 사용하십시오.

unsigned int __stdcall Scene::ExecuteCommand(void* command)
{
    return system(static_cast<char*>(command));
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top