问题标签 [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 投票
1 回答
3101 浏览

android - 使用 android 共享库的调用约定

我在 C++ 中为我的 Unity3d 应用程序创建了一些插件文件。到目前为止,该应用程序只是一个简单的原型,所以我只在桌面上使用编译为 Windows 的 DLL 的库进行了测试。今天,我将这些文件重新编译为 Android(arm 和 x86)的 .so(共享对象)并收到一条警告消息。

警告:此目标忽略调用约定“__stdcall”[-Wignored-attributes]

1.这意味着所有函数都编译为__cdecl?

2. .so库中不能指定调用约定吗?

我用 __cdecl 替换了 __stdcall,但它也会出现警告消息。

0 投票
1 回答
76 浏览

c++ - 如何使回调全局化,以便我可以将其用于其他功能?

我声明了一个这样的函数:

如何使 progress() 回调一个全局变量以在同一个 DLL 中的其他函数中使用它?我是 C++ 的新手。

0 投票
1 回答
148 浏览

c - 在 intel x64 程序集中执行功能的最快(CPU 方面)方法?

我一直在阅读有关汇编函数的内容,但对于是使用进入和退出还是仅使用调用/返回指令来快速执行感到困惑。一种方式快而另一种方式更小吗?例如,在不内联函数的情况下,在汇编中执行此操作的最快(stdcall)方法是什么:

0 投票
1 回答
142 浏览

c++ - 通过 C++ 学习逆向,但是这条线是做什么用的?

正如我所说,我正在尝试学习如何使用 C++/Assembly 对程序进行逆向工程,所以我正在浏览我在互联网上找到的一些开源项目。但是谁能解释这条线的作用?我在 C++ 方面并不先进,这就是为什么我要通过资源。

0 投票
1 回答
1441 浏览

c++ - 如何从未修饰的 stdcall DLL 自动生成导入库?

处理从 DLL 创建 LIB 的一般方法在How to make a .lib file when have a .dll 文件和头文件中进行了stdcall描述 - 仍然为具有未修饰函数(例如核心 WinAPI DLLkernel32.dll等)的DLL 创建导入库.),一个人必须经历一个相当漫长而复杂的过程(如这里所述)。对于具有大量功能的 DLL,此过程非常耗时且容易出错 - 当原始 DLL 更改(例如,由于供应商更新)时,它在自动构建情况下也很容易失败。

有没有一种有效的方法来自动化它?

0 投票
2 回答
1555 浏览

c++ - 使用“不同”调用约定作为参数的 64 位 C++ 传递函数会产生模棱两可的错误

__cdecl我的目标是使用 the和__stdcall调用约定轻松提取任意函数的原型。它在 32 位下运行良好。唯一改变的是我的模板函数参数中的调用约定。

根据维基百科

在 Windows 上下文中为 x64 架构编译时(无论是使用 Microsoft 还是非 Microsoft 工具),只有一种调用约定 — 此处描述的一种,因此 , stdcall, thiscall,cdeclfastcall现在都是相同的。

这会破坏我的 64 位代码。即使调用约定相同,将函数作为参数传递仍然需要您使用正确的命名法。IE 如果函数定义为__stdcall,则必须将其传递到接受 的包装器中__stdcall。即使__cdecl相同,您仍然必须将定义为__cdecl的函数传递给接受__cdecl.

适用于 32 位的示例:

我的目标是能够运行,例如:

这对于 32 位来说很好。但是,由于__stdcall__cdecl在 x64 中显然是相同的,因此它在 64 位中不起作用并引发错误,指出调用是不明确的。它还告诉我模板已经定义。直观地说,我似乎可以将函数传递__cdecl给这个__stdcall函数,因为编译器认为它们是相同的。但是,这不起作用:

错误 C2995 'WrapperFC<T,Args...> wrap(T (__cdecl *)(Args...))':已定义函数模板

如果我只保留其中一个,我不能同时包装这两个函数:

如果编译器认为它们是相同的,为什么需要我有不同的模板来接受不同的调用约定?当我这样做时,为什么它会完全崩溃并说它是模棱两可的并且已经定义了?

TL;博士:

如果 64 位架构中的调用约定是相同的,为什么我不能将一个调用约定传递给需要另一个调用约定的函数?我该如何解决?

0 投票
0 回答
38 浏览

assembly - 在@之后组装stdcall参数

对于程序集stdcall中的什么,我们需要在@之后写入参数数量(以字节为单位)?我的意思是……无论如何,我们将编写“ret numberOfParameters”来清理堆栈。那是为了什么?

0 投票
1 回答
440 浏览

visual-studio - 为什么 MSDN 或 VS2015 不使用 __stdcall 约定声明 IUnknown 方法?

抱歉,如果这个问题有点不集中。我正在使用 COM,在 Windows 10 下使用 Visual Studio 2015 Community 编写一些简单的 COM 服务器和对象。所有 COM 对象都必须实现 IUnknown 接口。VS2015 的 IDE 将提供实现超类的虚拟功能。所以,如果我用这些内容创建“Example.h”:

然后我从右键菜单中选择 Quick Actions and Refactorings.../Implement all Pure Virtuals for class 'MyClass',我在我的 .h 文件中得到了一些生成的代码:

VS2015 还为我提供了一个存根实现:

这很好,但它不编译。我收到此错误消息:

错误 C2695:“CFactory3::QueryInterface”:重写虚函数与“IUnknown::QueryInterface”的不同之处仅在于调用约定

我收到所有三种方法的错误消息。这是有道理的,因为每个方法的实际声明都指定了__stdcall调用约定。现在,我可以将它添加到 的声明中MyClass,如下所示:

这编译得很好。

我知道要使用什么调用约定,因为首先,当我使用“Peek Definition”时,我会看到:

再深入一层,我发现这STDMETHODCALLTYPE只是一个定义为__stdcall. 其次,我所拥有的大部分教程材料都建议使用STDMETHODIMP宏(扩展为HRESULT STDMETHODCALLTYPE)来实现 IUnknown 方法。

但是,当我查看有关 IUnknown 方法的MSDN 页面时,没有提到需要任何特定的调用约定。

所以我想知道为什么__stdcallMSDN 页面上没有提到 IUnknown 方法的约定,以及为什么 VS2015 IDE 没有将它包含在我的子类的 IUnknown 存根实现中。

通常,如何查找将由 COM 或 Windows 的任何其他部分调用的方法或函数的必要调用约定?

0 投票
1 回答
35 浏览

attributes - 我可以用 __attribute__ 字符串避免 g++ 环绕 _stdcall

我使用 MinGW 的 g++ 来预处理具有以下功能的文件:

预处理输出为:

是否有一个 g++ 选项可以避免更改输出中的第二行?请假设我无权访问该文件,因此我正在寻找 g++ 选项。

0 投票
4 回答
2552 浏览

c++ - 更改调用约定

我有一个需要回调函数的第 3 方 C API 。 我的代码有一个外部提供的回调函数。__stdcall
__cdecl

我无法将函数指针传递给 C-API,因为它们被认为是不同的类型。
绕过类型系统并使用reinterpret_cast<>自然会导致运行时错误。

这是这里的一个例子:

有没有一种方法可以安全地将具有一个调用约定的函数转换和/或包装到另一个?

我确实找到了一种方法,方法是传递一个调用第二个捕获 lambda 的强制转换的无捕获 lambda。第一个作为回调传递,第二个通过void* user_data. 这有效并且是类型安全的。但是对于看起来如此简单的事情来说,它是相当令人费解的。