我开始做一些directX编程。我正在使用我从互联网上找到的这个教程。
我只是想知道为什么CALLBACK被定义为_stdcall以及为什么WINAPI也是如此。
我认为在导出将被编译为dll的函数时会使用__stdcall。
但是,由于WindowProc和WINAPI永远不会被导出,为什么这些函数被声明为__stdcall?
非常感谢任何建议,
// WindowProc function prototype
LRESULT CALLBACK WindowProc(HWND hWnd,
UINT message,
WPARAM wParam,
LPARAM lParam);
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
}
答案 0 :(得分:8)
__ stdcall是指调用约定,并不一定与导出函数有关。如果您想了解更多信息,请查看维基百科关于calling conventions的文章。简而言之,编译器需要知道将参数传递到函数,堆栈或寄存器等的位置。
答案 1 :(得分:6)
__stdcall
也有助于减少X86架构上的代码大小。而不是每个调用实例恢复堆栈,堆栈在返回之前仅在函数结束时恢复一次。
从DLL导出也可以是__cdecl
,只要它以这种方式声明即可。例如:wsprintf()
未导出为WINAPI
。
答案 2 :(得分:4)
想一想。从DLL导出的函数必须具有固定的已知调用约定,以便dll的用户可以调用它们。同样,使用WindowProc,它必须具有已知的调用约定,以便Windows可以调用它。 WinMain也一样。它在启动程序时必须可由OS调用。 :)