Articles of stdcall

Linux中有STDCALL吗?

我试图将一个Windows应用程序移植到Linux。 这个appplication用__stdcall属性标记了一些函数。 然而,我有一个朋友告诉我,stdcall只用于windows,在linux中没有任何意义(但在Windows GCC中是否存在)。 我试图searchGoogle,并得到了一些结果表明,Linux中有stdacll。 那么……? 此外,对于GCC,我看到了2个实现: __attribute__((__stdcall__))和__attribute__((stdcall)) (没有stdcall附近的下划线)。 哪一个是首选的(如果适用于Linux)? 谢谢!

可以stdcall有一个可变的参数?

据我所知,只有调用者清理栈约定可以使用可变参数。 顺便说一下,WinApi StringCchPrintfW是这样声明的(我删除了SAL) __inline HRESULT __stdcall StringCchPrintfW( STRSAFE_LPWSTR pszDest,size_t cchDest,STRSAFE_LPCWSTR pszFormat, … ); stdcall可以有一个可变的参数吗?

为什么微软selectstdcall作为他们的API约定?

有没有很好的理由? 他们的内部函数(不导出)也是stdcall约定吗?

非常奇怪的段错误调用WinUsb_GetOverlappedResult

我有这个代码: void GetResult(WINUSB_INTERFACE_HANDLE InterfaceHandle, LPOVERLAPPED lpOverlapped) { DWORD numBytes = 0; WinUsb_GetOverlappedResult( InterfaceHandle, lpOverlapped, &numBytes, TRUE ); return; uint8_t stack[64]; } WinUsb_GetOverlappedResult是一个__stdcall函数声明如下: WINBOOL WINAPI WinUsb_GetOverlappedResult (WINUSB_INTERFACE_HANDLE InterfaceHandle, LPOVERLAPPED lpOverlapped, LPDWORD lpNumberOfBytesTransferred, WINBOOL bWait); 在debugging模式下使用GCC 5.3.0(MinGW)编译它一切正常。 (我不能用VC ++编译,因为我使用的是GCC扩展。) 但是,如果我改变它stack[80]然后它segfaults! 这里是每种情况下的反汇编。 64(不崩溃): Dump of assembler code for function GetResult(void*, _OVERLAPPED*): 88 { 0x00408523 <+0>: push %ebp 0x00408524 […]

调用可以是cdecl或stdcall的函数

我需要编写一个调用外部函数的代码,这个函数可以是32位Windows应用程序中的stdcall call或cdecl。 我的代码,来电者,不能预先知道其中的哪一个。 现在,如果我尝试从被定义为stdcall的调用站点调用一个cdecl函数,那么我会得到一个checkEspexception对话框,而且我猜测这是有原因的。 有没有办法做到这一点?

__stdcall typedef g ++问题

此代码编译(如我所料): typedef void __stdcall (*Func)(); struct A { static void __stdcall f() { } }; int main() { Func p = A::f; } 但是这个: struct A { typedef void __stdcall (*Func)(); static void __stdcall f() { } }; int main() { A::Func p = A::f; } 失败并不是非常有用的错误消息: error: invalid conversion from `void (*)()' to `void […]