问题标签 [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.

0 投票
8 回答
122045 浏览

c - 什么是__stdcall?

我正在学习 Win32 编程,WinMain原型如下:

我对这个WINAPI标识符的用途感到困惑并发现:

这是做什么的?我对在返回类型之后有什么东西感到困惑。是__stdcall为了什么?当返回类型和函数名之间存在某些东西时,这意味着什么?

0 投票
3 回答
929 浏览

c++ - 使用 __stdcall 和损坏的堆栈 (C++) 进行思想实验

今天脑子里一直在想函数指针这个话题,脑子里想到了以下场景:

AFAIK 这段代码会破坏堆栈,那么如果我运行这段代码,我会看到哪些类型的问题?

我会做这个调查自己,但是我已经离开我的开发机器一周了。

编辑:等一下,我想多了。正如评论中所观察到的那样,这段代码的目的是在所有事情都说完后在堆栈上留下一个参数(调用者将两个参数放在堆栈上,被调用者 - 只需要一个参数 - 只弹出一个)。然而,由于我的演员没有提到调用约定,我是否抛弃了 stdcall,至少从调用者的角度来看?int function(int)仍然会从堆栈中弹出一个参数,但是调用者是否会因为转换而恢复认为该函数是 __cdecl (默认值)?(即弹出三个参数?)

EDIT2:正如 Rob 所证实的,第二个问题的答案是肯定的。如果我想在堆栈上留下一个参数,我将不得不重述 __stdcall:

0 投票
1 回答
3261 浏览

visual-studio-2008 - 在 Visual Studio 中使用自定义 prolog 和 epilog 代码编写裸函数

我正在一个 dll 中编写一些插件代码,该代码由我无法控制的主机调用。

主机假定插件被导出为 __stdcall 函数。主机被告知函数的名称和它期望的参数的详细信息,并通过 LoadLibrary、GetProcAddress 和手动将参数推送到堆栈上动态地整理对它的调用。

通常插件 dll 会暴露一个常量接口。我的插件公开了一个在 dll 加载时配置的接口。为了实现这一点,我的插件公开了一组在编译 dll 时定义的标准入口点,并根据需要将它们分配给正在公开的内部功能。

每个内部函数都可以采用不同的参数,但是这会与物理入口点名称一起传递给主机。我的所有物理 dll 入口点都被定义为采用单个 void * 指针,我自己通过从第一个参数的偏移量和已传达给主机的已知参数列表中处理来自堆栈的后续参数。

主机可以使用正确的参数成功调用我的插件中的函数并且一切正常......但是,我知道a)我的函数没有像定义的那样清理堆栈作为 __stdcall 函数,它采用 4 字节指针,因此即使调用者将更多参数压入堆栈,它们也总是在末尾执行“ret 4”。b) 我无法处理不带参数的函数,因为 ret 4 会在我返回时从堆栈中弹出太多 4 个字节。

从我的插件中追踪到主机的调用代码后,我可以看到实际上 a) 没什么大不了的;主机丢失了一些堆栈空间,直到它从调度调用返回,此时它清理了清理我的垃圾的堆栈帧;然而...

我可以通过切换到 __cdecl 而根本不清理来解决 b)。我假设我可以通过切换到裸函数并编写我自己的通用参数清理代码来解决 a)。

因为我知道刚刚调用的函数使用的参数空间量,所以我希望它会像这样简单:

但这不起作用,因为 ret 需要一个编译时间常数......有什么建议吗?

更新:

感谢罗布肯尼迪的建议,我得到了这个,这似乎工作......

这看起来对吗?

0 投票
9 回答
12013 浏览

c# - 创建一个可以使用 stdcall 在 Delphi 应用程序中导入的 C# DLL - 可能吗?

我有一个需要为其创建 DLL 的程序,希望是在 C# 中。该程序是用 Delphi 编写的,我有一个要编码的接口文件。该接口使用 stdcall 调用约定。

是否可以创建一个符合接口并且可以在Delphi应用程序中使用的C# DLL?

是否有一些示例代码演示了如何将 C# DLL 编码为 stdcall 接口方法?

0 投票
1 回答
6215 浏览

c++ - 如何调试“语法错误:_stdcall”?

我正在尝试使用此代码来定义与读卡器通信所需的 API。下面是头文件(完整)。[AtUsbHid.h]

它抛出了几个错误,但我认为如果语法问题得到解决,其余的就会到位。

我确保将 __export 替换为 __declspec 并且由于它最初是用 VC++6 编译的,并且我使用的是 VS2005,因此可能缺少一些东西。

错误 C2059:语法错误:'__stdcall'

0 投票
1 回答
4014 浏览

dll - 从使用 stdcall 的 DLL 创建 MSVC 导入库

我有一个导出的 dll

dll转储显示

我从以下 def 文件开始:

这创建了一个包含以下导出的 lib 文件:

当我与这个库链接时,msvc 链接器抱怨它找不到 _Foo@0。为了纠正这个问题,我在 def 文件中添加了一个别名。

这会产生一个带有导出的 lib 文件

现在项目链接没有任何问题。但是,当我尝试运行它时,我收到了消息

“无法在动态链接库 simple.dll 中找到过程入口点 Foo@0”

所以看起来即使我告诉 lib.exe Foo@0 是 Foo 的别名,它仍然会创建一个尝试按名称加载“Foo@0”的导入库。

当我要求“Foo@0”时,有没有办法让导入库加载“Foo”?

谢谢,

大卫

0 投票
2 回答
2127 浏览

c++ - GCC 仅从 dll 导出修饰函数名

我有一个dll,它导出一个函数......

我用 Code::Blocks GCC 编译器 (V3.4.5) 编译它。问题:生成的 dll 导出修饰函数名...

这无法加载,应该是普通的旧......

我已经研究了大约 4 个小时。我认为 --add-stdcall-alias 是解决此问题的选项。我的 Code::Blocks 日志显示...

mingw32-g++.exe -shared -Wl,--out-implib=bin\Debug\libGainGCC.a -Wl,--dll obj\Debug\se_sdk3\mp_sdk_audio.o obj\Debug\se_sdk3\mp_sdk_common.o obj\Debug \Gain\Gain.o obj\Debug\Gain\gain.res -o bin\Debug\GainGCC.sem --add-stdcall-alias -luser32

..所以我认为这是正确的选择吗?但没有运气。Dependancy Walker 仅显示正在导出的修饰名称。我通过使用 __cdecl 而不是 __stdcall 让它有点工作,然后可以导出名称,但是该函数在调用时会破坏堆栈(因为调用者期望其他调用约定)。

0 投票
5 回答
2486 浏览

c++ - 在 C++ 中,可变参数函数(在参数列表末尾带有 ... 的函数)是否必须遵循 __cdecl 调用约定?

我知道 __stdcall 函数不能有省略号,但我想确保除了 __cdecl 或 __stdcall 之外,没有平台支持 stdarg.h 函数来调用约定。

0 投票
3 回答
2199 浏览

visual-studio-2010 - 如何使用 __cdecl 调用约定编译 boost?

我有一个使用__cdecl调用约定(msvc2010)编译的项目,我使用默认设置使用相同的编译器编译了 boost。

该项目与 boost 相关联,但我在运行时收到如下断言消息: File: ...\boost\boost\program_options\detail\parsers.hpp Line: 79

运行时检查失败 #0 - ESP 的值未在函数调用中正确保存。这通常是调用使用一种调用约定声明的函数和使用另一种调用约定声明的函数指针的结果。

有以下问题:

  • 在 Windows 上默认使用什么调用约定来提升构建(msvc2010)
  • 如何使用 __cdecl 调用约定编译 boost
  • 为什么 boost 无法阻止与具有不同调用约定的代码链接?我知道 boost 具有非常智能的库自动包含代码。

更新#1

看起来 boost 确实使用正确的调用约定进行编译和链接,但在运行时我仍然遇到上述问题。我使用相同的代码做了一个示例应用程序,它可以工作,但在我的应用程序中它失败了。唯一的区别可能来自项目配置或包含/stdafx.h

0 投票
3 回答
28551 浏览

c++ - Linux中有STDCALL吗?

我正在尝试将 Windows 应用程序移植到 Linux。__stdcall这个应用程序用属性标记了一些功能。但是,有朋友告诉我,stdcall只在 Windows 上使用,在 Linux 中没有任何意义(但在 Windows GCC 中确实存在)。

搜索 Google - 一些结果表明stdcallLinux 中存在。

stdcallLinux中有一个吗?

此外,GCC 表示: __attribute__((__stdcall__))__attribute__((stdcall))(在 stdcall 附近没有下划线)。

哪个是首选(如果适用于 Linux)?