问题标签 [stdcall]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 混合调用约定会导致编译错误
我有一个库(C++),它有一些 API 函数。其中之一被声明为 __cdecl,但从 __stdcall 获得一个函数指针。就像是:
然后 - 我有一个使用此库的 C++ 可执行项目,但不调用上述 API 或使用该Func
类型。
Func
更改to的调用约定后__stdcall
,出现以下编译错误:
错误 C2995: 'std::pointer_to_unary_function<_Arg,_Result,_Result(__cdecl *)(_Arg)> std::ptr_fun(_Result (__cdecl *)(_Arg))' : 函数模板已定义 c:\program files\微软视觉工作室 8\vc\include\functional
知道会是什么吗?
提前致谢!!
c++ - 标准调用和 cdecl
有(除其他外)两种类型的调用约定 - stdcall和cdecl。我对他们有几个问题:
- 当调用 cdecl 函数时,调用者如何知道它是否应该释放堆栈?在调用点,调用者是否知道被调用的函数是 cdecl 还是 stdcall 函数?它是如何工作的 ?调用者如何知道它是否应该释放堆栈?还是链接者的责任?
- 如果一个声明为 stdcall 的函数调用一个函数(其调用约定为 cdecl),或者反过来,这是否不合适?
- 一般来说,我们可以说哪个调用会更快 - cdecl 或 stdcall ?
c++ - 调用通常用于线程的函数
我有原型的功能
这意味着与 CreateThread 一起用于线程应用程序。
我用 CreateThread 调用它没有问题。但是在代码的其他地方,我通常称之为blah(NULL)。当它到达这部分时,它会崩溃。这是因为 WINAPI 部分使它成为 __stdcall 并且您不能像那样调用 __stdcall 函数吗?
windows - 为什么微软选择 stdcall 作为他们的 API 约定?
有充分的理由吗?
它们的内部函数(未导出)是否也是标准调用约定?
windows - stdcall 可以有可变参数吗?
据我所知,只有 caller-clean-stack 约定可以使用可变参数。
顺便说一句,WinApi StringCchPrintfW 是这样声明的。(我删除了 SAL)
__inline HRESULT __stdcall
StringCchPrintfW (
STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPCWSTR pszFormat, ...
);
stdcall 也可以有可变参数吗?
c++ - 链接器错误 LNK2019 可追溯到 __stdcall 我认为我得到了正确的库 - 我能做些什么来解决这个问题?
我尝试将 LabCVI 项目移植到 MSVS 2010 C++ Express。有一行代码如下所示:
发生链接器错误:LNK2019 "_InitCVIRTEEx@12" - 所有相关标头都已包含 cpp 语句:
我将错误追溯到这些片段,我为您组合了这些片段:
总结一下:
此调用应在 cvirt.lib 中定义 - 添加到 Librarypaths (CVI2009\extlib\msvc) 链接器错误仍然发生,我只是不明白为什么。
应该以不同的方式添加库吗?我如何验证这确实是正确的库?错误是否意味着完全不同的东西?
winapi - 在 NASM (stdcall) 中调用 LONGLONG RtlLargeIntegerDivide(LONGLONG, LONGLONG, LONGLONG*)
我正在尝试调用以下函数:
在汇编代码(NASM)中。它使用 stdcall 调用约定,并返回商。这些是规格:
输入:[EDX,EAX](除数),[ECX,EBX](除数)
输出:[EDX,EAX](商),[ECX,EBX](余数)
我该怎么做呢?(我的主要问题是不完全理解 EBP 和 ESP,以及它们与局部变量的关系。)
(不,这不是家庭作业;我正在尝试实现一个包装 C 运行时库。)
谢谢!
c++ - __stdcall typedef g++ 问题
这段代码编译(如我所料):
但是这个:
失败并显示不是很有帮助的错误消息:
我在 Vista 下使用 g++ 3.4.2(我知道,它很古老,但我现在无法访问任何其他环境)。显然我在这里遗漏了一些东西。任何帮助,将不胜感激。
c++ - 使用 extern c 和 dllexport 与模块定义 (msvc++) 进行标准调用名称修改
我试图为 dll 导出一个简单的测试函数,以便与将调用约定指定为的应用程序(仅供参考:mIRC)一起使用:
现在,要从应用程序中调用它,我将使用test_func但我注意到由于名称修饰它并不像我想象的那么简单。
通过此处的类似主题,我了解到将extern "C"与__declspec(dllexport)结合使用是一种等效的(在某种程度上)消除对模块定义 (.def) 的修改的方法。但是,当使用 extern/dllexport 方法时,我的函数(例如)始终是_test_func@numbers而 .def 删除了所有需要与我需要导出到的应用程序一起使用的修改。
有人可以解释这是为什么吗?我只是对这两种方法感到好奇。谢谢!
.net - 如果违反调用约定(在 .NET 3.5 中),为什么 PInvoke 不会崩溃?
我的解决方案有一个非托管 C++ DLL,它导出一个函数,以及一个 PInvoke 这个函数的托管应用程序。
我刚刚将解决方案从 .NET 3.5 转换为 .NET 4.0 并得到了这个 PInvokeStackImbalance “A call to PInvoke function [...] has unbalanced the stack”异常。事实证明,我正在调用 __cdecl'ed 函数,因为它是 __stdcall:
C++ 部分(被调用者):
C#部分(调用者):
所以,我已经修复了这个错误,但现在我对它在 .NET 3.5 中是如何工作的感兴趣?为什么(多次重复)没有人(被调用者或调用者)清理堆栈,没有导致堆栈溢出或其他一些不当行为,而是正常工作的情况?PInvoke 中是否有某种检查,就像 Raymond Chen 在他的文章中提到的那样?这也很有趣,为什么相反类型的破坏约定(让 __stdcall 被调用者像 __cdecl 一样被 PInvoked)根本不起作用,只导致 EntryPointNotFoundException。