질문은 "그 유형으로 변환 가능한 매개 변수가있는 함수 포인터를 안전하게 전달할 수 있습니까?"라고 실용적인 예제 없이는 매우 의심 스럽습니다.GetProcAddress에서 캐스팅 된 함수의 서명이 정확히 일치해야합니까?
DLL 이름, 함수 이름, 적절한 반환 유형, 매개 변수 유형 및 인수가 주어지면 DLL에서 항목을 호출하는 작은 유틸리티 함수를 만들었습니다. 그러나이 유틸리티를 사용할 때 필요한 것보다 과도한 팽창이있을 수 있습니다. 명시 적으로 매개 변수 유형을 지정하지 않는 것이 안전한지 궁금합니다. 예를 들어 윈도우 API MessageBoxW
촬영 :
callStdcallDllFunction<int, HWND, PCWSTR, PCWSTR, UINT>(
L"user32", "MessageBoxW", nullptr, nullptr, nullptr, 0
);
은 여기에 명시 적으로 반환 형식과 MessageBoxW
의 네 개의 매개 변수 유형을 지정합니다. 물론, 오른쪽에서부터 시작하는 인수가 함수에있는 인수와 동일한 유형을 갖는 경우, 그 인수를 지정하지 않아도됩니다. 하지만 인수가 처음에 함수에 전달하는 것이 유효한 경우 유형을 추론해도 괜찮습니까? (이 모두가 무엇입니까?) 여기
callStdcallDllFunction<int>(L"user32", "MessageBoxW", nullptr, nullptr, nullptr, 0);
, 나는 GetProcAddress
의 결과는 int(__stdcall *)(std::nullptr_t, std::nullptr_t, std::nullptr_t, int);
로 주조 할 것으로 판단된다. 그러나 전달 된 인수는 실제 함수에 여전히 적합합니다. 이것은 여전히 잘 정의 된 행동이며 항상 원하는대로 할 것인가? 테스트 할 때마다 지금까지 효과가있었습니다.
내가 사용하는 동안 반환 유형을 사용하지 않는 경우 void
으로 남겨 두어도 괜찮습니까?
//return type is void instead of the actual int
callStdcallDllFunction(L"user32", "MessageBoxW", nullptr, nullptr, nullptr, 0);
제가 알 수있는 한, 이것은 제가 시도한 때마다 효과가있었습니다. 이것들이 실제로 작동하도록 보장된다면, 나는 이것들을 사용할 수 있기를 원합니다.하지만 항상 그렇게 할지는 모르겠습니다. 그리고 정의되지 않은 행동을 쓰는 기회를 갖지 않을 것입니다. .
정확한 코드는 문제와 관련이 없지만 here을 테스트하는 데 사용할 수있는 stdcall 버전 (예 : MessageBox
)을 찾을 수 있습니다. 이러한 버전과 cdecl 버전의 유일한 차이점은 함수 시그니처에 __stdcall
이 추가 된 것입니다.
내가 제공 한 유일한 옵션은 stdcall과 cdecl뿐입니다. 이 두 가지는 스택을 정리하는 방법에 차이가 있습니다. 유형 크기를 기억해야한다면, 그 호출에 대해서는 작동하지 않을 때 유형을 생략해야하지만, 다른 유형에 대해서는 작동하지 않을 것입니다. – chris
http://stackoverflow.com/a/12465133/59019 – jmihalicza