我正在学习Win32编程,WinMain原型如下:
int WINAPI WinMain ( HINSTANCE instance, HINSTANCE prev_instance, PSTR cmd_line, int cmd_show )
Run Code Online (Sandbox Code Playgroud)
我很困惑这个WINAPI标识符的用途和发现:
#define WINAPI __stdcall
Run Code Online (Sandbox Code Playgroud)
这是做什么的?在返回类型之后,我对此感到困惑.什么是__stdcall?当返回类型和函数名称之间有什么东西时,它是什么意思?
我有一个需要在WinXP和Vista64上运行的应用程序.我的程序需要QueryFullProcessImageName()才能在Vista上运行,但不能在XP上运行.
我尝试通过kernel32.dll加载QueryFullProcessImageName()(而不是静态链接),以便在WinXP和Vista上运行相同的可执行文件.加载它的代码是:
//only gets called on vista
bool LoadQueryFullProcessImageName()
{
HMODULE hDLL = LoadLibrary("kernel32.dll");
if (!hDLL) return(0);
//Now use pointer to get access to functions defined in DLL
fpQueryFullProcessImageName = (LPQueryFullProcessImageName)GetProcAddress(hDLL, "QueryFullProcessImageNameA"); //ANSI version
if (!fpQueryFullProcessImageName)
return false;
return true;
}
Run Code Online (Sandbox Code Playgroud)
typedef是
typedef WINBASEAPI
BOOL (*LPQueryFullProcessImageName)(
__in HANDLE hProcess,
__in DWORD dwFlags,
__out_ecount_part(*lpdwSize, *lpdwSize) LPSTR lpExeName,
__inout PDWORD lpdwSize
);
Run Code Online (Sandbox Code Playgroud)
不幸的是,当取消引用函数指针时,我在Vista上遇到运行时错误:
运行时检查失败#0 - ESP的值未在函数调用中正确保存.这通常是调用使用一个调用约定声明的函数和使用不同调用约定声明的函数指针的结果.
typedef直接来自.h文件,所以我无法理解为什么它会搞乱.有帮助吗?我尝试了很多变种,但没有运气.
我在学习使用C++进行游戏制作的状态时遇到了调用约定.
在前一个问题中有人说MSDN没有很好地解释_stdcall - 我同意.
调用_stdcall等约定的主要目的是什么?参数放在堆栈上的顺序是否重要?它如何减少X86中的代码大小(正如其他人所说)?
我是 C++ 新手,试图了解这两个宏在此 FileMaker 插件示例中的作用。
#define FMX_PROC(retType) retType __stdcall
#define FMX_PROCPTR(retType, name) typedef retType (__stdcall *name)
Run Code Online (Sandbox Code Playgroud)
到目前为止,我知道它们都是宏,并且是FMX_PROCPTR一个指向接受这两个参数的函数的指针,并且 __stdcall 是某种调用约定(决定不深入研究这意味着什么)。
FMX_PROC(retType)我不明白的是每行的结尾,以及后面的部分FMX_PROCPT(retType, name)。
可能是间距让我感到困惑,但是retType __stdcall返回类型是FMX_PROC(retType)? 或者它给参数一个类型?
代码中的其他地方FMX_PROC(retType)是这样使用的
static FMX_PROC(fmx::errcode) Do_FMmp_ConvertToBase( short /* funcId */, const fmx::ExprEnv& /* environment */, const fmx::DataVect& dataVect, fmx::Data& results )
Run Code Online (Sandbox Code Playgroud)