问题标签 [cdecl]
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#/.NET 泛型和 Cdecl Varargs 错误?
为什么Foo()
成功但Bar()
抛出一个BadImageFormatException
?
c# - PInvoking C++ DLL 时出现 AccessViolationException(cdecl 调用约定问题?)
我花了一整天的时间研究这个,我一点也不聪明:
我有一个 C# DLL,它在 C++ DLL 中调用一个方法。在调试模式下编译时我没有遇到任何问题,但是在发布模式下编译时我得到了一个 AccessViolationException。谷歌搜索这个问题告诉我,这可能是不符合调用约定的问题。现在的代码在 C# 中如下所示:
在 C++ 中:
我已经将 C++ 项目设置为使用 VS2010 中的 __cdecl 调用约定进行编译,但我仍然得到 AccessViolationException 并且我不知道我还能做什么。我应该注意我的 C++ DLL 使用第三方 DLL,我不知道他们使用什么调用约定。
任何帮助,将不胜感激!
哦,我没有在我的开发机器上遇到异常,只有在我的目标系统上。
c++ - __cdecl 强制前缀带下划线
我的公司向第三方提供了一个 DLL,该 DLL 为他们提供了可用于连接到我们的应用程序的 API 函数。DLL 是用 VC9 编写的,API 函数使用 VC 的默认调用约定 (__cdecl)。第三方围绕这个接口构建了他们的应用程序。
我现在的任务是编写 DLL 的更新版本。我们希望 DLL 具有与旧接口完全相同的接口,以便它们可以互换使用。不幸的是,我们的开发环境现在是 CodeGear RAD Studio 2007,所以我必须使用它来编写 DLL。
最好的解决方案是让新旧 DLL 都将它们的函数导出为 __stdcall。然后可以重新链接第三方应用程序以期待 __stdcall 功能,每个人都会很高兴。不幸的是,由于各种原因,这不太可能发生。
或者,我可以将 DLL 中的函数声明为 __cdecl。第三方需要 __cdecl 函数,所以这似乎是一个很好的解决方案。不幸的是,CodeGear 坚持在 __cdecl 函数的名称后面加上下划线 ('_')。这意味着第三方应用程序必须有条件地调用MyApiFunction(...)
or _MyApiFunction(...)
,具体取决于他们使用的 DLL。
所以我的问题是,如何从我的新 DLL 中导出 API 函数,使其为 __cdecl 并且不带下划线 ('_') 前缀?
gcc - gcc cdecl 调用约定
测试一个 cdecl 调用约定,但对此有点困惑:原始 C 代码:
cdecl 约定不添加一些指令,例如:在调用函数之后添加 esp 8 或其他类似指令。为什么这个?谢谢你。
windows - ESP 的值未正确保存....和 C/C++ 调用约定
我正在使用 OpenCV 库、Boost 库和我从这个LINK下载的一段代码编写一个应用程序。我已经在与 Thunk32 相同的解决方案下创建了一个项目,并且我有以下文件:
主项目.cpp
窗口.h
和Window.cpp
现在,当我运行它时,如果我不在窗口内移动鼠标,没关系,回调已成功传递给 cvSetMouseCallback 函数。cvSetMouseCallback 函数有三个参数 1. 窗口名称, 2. CvMouseCallback 和 NULL 字符。CvMouseCallback 定义为
而 CV_CDECL 只是 _cdecl 调用约定的重新定义。
现在,我的 mouseHandler 函数是一个类成员函数,我假设它符合 _thiscall 调用约定。
我的问题是,当我将鼠标放在窗口上时,如果它至少成功进入该方法一次,为什么会出现以下错误?我猜我的鼠标在窗口内移动的第二个瞬间就会发生变化。任何人都可以帮助我吗?
这是我正在做的图像:
c++ - cdecl 错误:之前的预期初始化程序
我对 cdecl 调用约定有疑问:
我应该怎么做才能让编译器识别 cdecl 调用约定?
谢谢!
平台:Windows 7;明威;GCC 4.6.1
我无法修改这些函数,因为它们是文件 FRAMEWRK.H 中“Microsoft Excel 开发工具包,版本 14”的一部分:
c - 结合 C 和 x86 程序集时假设调用约定
我有一些汇编例程,它们由 C 函数调用并从 C 函数中获取参数。现在,我假设这些参数以 cdecl 顺序在堆栈上传递。这是一个公平的假设吗?
编译器 (GCC) 会检测到这一点并确保参数正确传递,还是我应该手动去声明它们 cdecl?如果是这样,如果我指定更高的优化级别,该属性是否仍然有效?
assembly - _cdecl 调用约定
在一篇关于 _cdecl 调用约定的文章中,作者提到:
释放本地存储 当函数分配本地临时空间时,它通过从堆栈点减少所需的空间量来实现,并且必须反转该过程以回收该空间。它通常是通过将之前减去的相同数量添加到堆栈指针来完成的,尽管一系列 POP 指令可以实现相同的效果。
我的问题是:我是否可以简单地将 ESP 设置为当前的 EBP 值,而不是“将减去的相同数量添加到堆栈指针”或“一系列 POP 指令”?
喜欢:
对我来说似乎是一个更好的方法,因为如果我以后更改此函数的局部变量的数量,我就不必费心事后增加值。
c - 如何在可变参数函数上强制 cdecl
我正在使用 g++ 编写一个 64 位操作系统,并且我有一个可变参数函数,例如:
它的行为与 printf 非常相似。这里的问题是 g++ 遵循 System V ABI,因此它传递 RDI、RSI、RDX、RCX、R8、R9 中的第一个参数,然后将剩余的(如果有的话)压入堆栈。
将旧的 stdarg.h 宏 va_start、va_arg 等与 cdecl 一起使用非常容易,因为 va_arg 只是获取堆栈中的下一个元素。但是现在这些宏在第 7 个参数之前根本不起作用。
唯一可能的解决方案是(恕我直言):
- 强制 g++ 创建一个 cdecl 函数。这似乎是不可能的,因为__属性__ ((cdecl)) 被故意清晰地突出显示为忽略。
- 拥有一组新的宏,可以使用新的参数传递方式。
(我实际上正在开发 Win,所以我没有 glibc 标头来检查它们的实现)。
有人有解决方案吗?提前致谢。
c++ - C++ 和全动态函数
我有绕路的问题。众所周知,Detours 只能在 5 个字节的空间中移动(即一个 'jmp' 调用和一个 4 个字节的地址)。因此,在类(方法)中不可能有“钩子”函数,您无法提供“this”指针,因为根本没有足够的空间(这里的问题更彻底地解释了)。因此,我整天都在集思广益以寻求解决方案,现在我想请您对这个主题提出想法,这样我就不会在不知道是否可行的情况下开始一个 3-5 天的项目。
我最初有 3 个目标,我希望“挂钩”函数是类方法,我希望整个方法是面向对象的(没有静态函数或全局对象),最糟糕/最难的部分是完全动态的。这是我的(理论上)解决方案;使用汇编可以在运行时修改函数(一个完美的例子是任何绕行方法)。所以既然我可以动态修改函数,我不应该也可以动态创建它们吗?例如; 我分配内存,比如说~30字节(通过malloc/new)。难道不能只用对应于不同汇编运算符的二进制数替换所有字节(如 0xE9 是'jmp'),然后直接调用地址(因为它会包含一个函数)?
注意:我事先知道返回值,以及我想要绕行的所有函数的所有参数,并且由于我使用的是 GCC,thiscall 约定实际上与 _cdecl 相同。
所以这是我的想法/即将实现;我创建了一个“功能”类。此构造函数采用可变数量的参数(第一个参数除外,它描述了目标函数的返回值)。
每个参数都是对钩子将接收的参数的描述(大小,以及它是否是指针)。因此,假设我想为 a 创建一个 Function 类int * RandomClass::IntCheckNum(short arg1);
。然后我只需要这样做:Function func(Type(4, true), Type(4, true), Type(2, false));
. 其中“类型”定义为Type(uint size, bool pointer)
. 然后通过汇编我可以动态地创建函数(注意:这都将使用 _cdecl 调用约定),因为我可以计算参数的数量和总大小。
编辑:在这个例子中,Type(4, true)
是返回值(int*),scondType(4, true)
是 RandomClass 'this' 指针并Type(2, false)
描述了第一个参数(短 arg1)。
通过这种实现,我可以轻松地将类方法作为回调,但它需要大量的汇编代码(我什至没有特别的经验)。最后,唯一非动态的东西是我的回调类中的方法(这也需要 pre 和 post 回调)。
所以我想知道;这可能吗?它需要做多少工作,我在这里过头了吗?
编辑:如果我把所有的东西都说得有点模糊,我很抱歉,但是如果你想更彻底地解释一些事情,请询问!
EDIT2:我也想知道,我是否可以在某处找到所有汇编运算符的十六进制值?一份清单会有很多帮助!和/或是否有可能以某种方式“保存” asm(""); 内存地址的代码(我非常怀疑)。