问题标签 [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 回答
396 浏览

c++ - 我可以在使用 Xerces-C 3.0 时使用 __stdcall 约定吗?我收到链接器错误

在我的项目中,使用 __stdcall 至关重要。但是,我明白了:

1>ExchangeParser.obj: 错误 LNK2001: 无法解析的外部符号“public: static void __cdecl xercesc_3_0::XMLString::release(unsigned short * *,class xercesc_3_0::MemoryManager * const)” (?release@XMLString@xercesc_3_0@@SAXPEAPEAGQEAVMemoryManager @2@@Z) 1>ExchangeParser.obj : 错误 LNK2001: 无法解析的外部符号 "public: static char * __cdecl xercesc_3_0::XMLString::transcode(unsigned short const * const,class xercesc_3_0::MemoryManager * const)" (? transcode@XMLString@xercesc_3_0@@SAPEADQEBGQEAVMemoryManager@2@@Z) 1>ExchangeParser.obj : 错误 LNK2001: 无法解析的外部符号 "public: static unsigned short * __cdecl xercesc_3_0::XMLString::transcode(char const * const,class xercesc_3_0: :MemoryManager * const)" (?transcode@XMLString@xercesc_3_0@@SAPEAGQEBDQEAVMemoryManager@2@@Z) 1>ExchangeParser.obj : 错误 LNK2001: 无法解析的外部符号“public: static char const * const xercesc_3_0::XMLUni::fgXercescDefaultLocale” (?fgXercescDefaultLocale@XMLUni@xercesc_3_0@@2QBDB) 1>ExchangeParser.obj: 错误 LNK2001: 无法解析的外部符号“公共:静态类 xercesc_3_0::MemoryManager * xercesc_3_0::XMLPlatformUtils::fgMemoryManager" (?fgMemoryManager@XMLPlatformUtils@xercesc_3_0@@2PEAVMemoryManager@2@EA) 1>ExchangeParser.obj:错误 LNK2001:未解析的外部符号“公共:静态类 xercesc_3_0 ::DOMImplementation * __cdecl xercesc_3_0::DOMImplementationRegistry::getDOMImplementation(unsigned short const *)" (?getDOMImplementation@DOMImplementationRegistry@xercesc_3_0@@SPEAVDOMImplementation@2@PEBG@Z) 1>ExchangeParser.obj : 错误 LNK2001: 无法解析的外部符号“公共:静态无符号短常量 * 常量 xercesc_3_0::XMLUni::fgDOMWRTFormatPrettyPrint" (?fgDOMWRTFormatPrettyPrint@XMLUni@xercesc_3_0@@2QBGB) 1>ExchangeParser.obj:错误 LNK2001:未解析的外部符号“公共:静态无符号短常量 * 常量 xercesc_3_0: :XMLUni::fgDOMXMLDeclaration" (?fgDOMXMLDeclaration@XMLUni@xercesc_3_0@@2QBGB)

有什么帮助吗?

0 投票
2 回答
1099 浏览

windows - __stdcall 没有任何装饰

我有一个.dll我怀疑使用__stdcall函数,但完全没有修饰的名称(甚至不是下划线或@符号)。我.def用别名为它写了一个文件

但我认为lib(我用来从.def文件创建导入库)忽略了别名(链接器仍然说func1@4未定义)

如何创建将映射func1@4到的导入库func1

0 投票
2 回答
964 浏览

delphi - 具有 stdcall 调用约定的回调系统的组件模式

这个问题就是从这个问题中产生
问题是:创建可以容纳来自系统的许多回调命令的非可视组件。用户可以在 IDE 中定义无限数量的回调。回调将在 TCollection 中定义为 TCollectionItem。

这是一种效果很好的模式,但也有一些缺点。(稍后描述)因此我想知道是否可以做得更好;-)

这是一个主要组件,用户可以在IDE中通过CommandsTable集合定义无限数量的回调函数


每个集合项都是这样的,InternalCommandFunction 是回调,从系统调用。(标准调用约定)



这是一个实现。整个过程可以从“开始”程序开始

这是有问题的代码。我认为获取“InternalEventFunction”函数指针的唯一方法是使用 MethodToProcedure() 函数。



正如我之前描述的,它工作正常,但是函数 MethodToProcedure() 使用了Thunk技术。我喜欢避免这种情况,因为程序无法在启用了数据执行保护 (DEP) 的系统上以及在 64 位架构上运行,可能需要全新的 MethodToProcedure() 函数。
你知道一些更好的模式吗?


只是为了完成,这里是一个 MethodToProcedure()。(不知道原作者是谁)。

0 投票
2 回答
368 浏览

c++ - 创建 __stdcall 的映射

我正在尝试使用 __stdcall 创建函数名称和函数指针的映射。以下是我目前获取函数指针的方式:

现在我的地图:

该错误正是我所期望的,但我需要在 __stdcall 前面添加一个明显的类型。如果我删除前面的“int”,那么它会抱怨:

如果我仅在前面包含“int”的地图对象创建后尝试编译它,则会引发错误:

这对我来说没有多大意义。那么使用 __stdcall 作为地图类型的正确方法是什么?在它前面添加 int 对我来说似乎很可疑,但如果我不添加它,它就会抱怨它需要指定类型。

此外,如果这令人困惑,CALLBACK 是 __stdcall 的#define。

0 投票
1 回答
2964 浏览

unix - 64位快速调用

我一直在阅读 32 位调用约定的差异。与磨难就是fastcallstdcall

根据我的阅读,这两种约定存在很大的混淆,并且 64 位被标准化以避免这种混淆。

我不得不问,为什么被fastcall选中?

另外,既然fastcallandstdcall是 win32 术语,那么 UNIX 术语中表示使用或不使用寄存器来传递参数的函数调用是什么?

0 投票
1 回答
973 浏览

com - 如何从 Go 进行 stdcall

我有一个指向 COM 接口的指针,并且想从它的虚拟表中获取函数指针并进行方法调用。为此,我需要进行 stdcall 方法调用。在 Go 中,如何使用约定 stdcall 进行调用或使用 cgo 中的约定 stdcall 进行调用?

0 投票
2 回答
631 浏览

c - C - DLL 需要是 __stdcall 并导入 __cdecl lib

我正在编译一个需要使用 portaudio 的 DLL。它也为套接字等使用各种 Windows 库,但链接器无法识别 portaudio 库。然后我记得 portaudio 使用 __cdcel 而不是 __stdcall。通常我只会使用 __cdcel 并完成它,但我正在编译的 DLL 需要使用 __stdcall,因为我将在 Visual Basic 中使用它。

如果这个项目对你来说听起来有点杂乱无章,那就是。

0 投票
1 回答
8667 浏览

gcc - GCC中的stdcall有什么等价物吗?

我正在使用 GCC 开发自己的内核,当从 asm 代码调用 C 函数时,我必须add esp,xx自己做。经过一番搜索,我发现这stdcall是微软的发明,不能在 GCC 中使用。有什么方便的方法来完成这项工作吗?

0 投票
1 回答
291 浏览

windows - COM 服务器:调用接口方法时,ESP 未跨函数调用保存

我正在在 EXE 文件中实现 COM 服务器。准确地说,我正在向现有应用程序添加一个 COM 接口。最终目标是自动化应用程序。

第一个组件和一个接口(到目前为止只有一个方法)基本就位。我可以在 DLL 中构建一个进程内服务器并成功获取接口指针并调用该方法。这是第一步,因为我只是在学习。以后我不需要 DLL;它只是作为我的组件和界面基本没问题的概念证明。

然后我在 EXE 中构建了一个进程外服务器。我已经到了可以CoCreateInstance()从客户端调用的地步,EXE 启动,注册它的工厂,工厂创建组件的实例。CoCreateInstance返回 S_OK 并且客户端接收到一个不为 NULL 的接口指针。

当我调用接口的方法时会出现问题。

  • 首先,方法中的断点没有被命中(是的,在另一个进程中,不过我也在调试服务器。服务器中的其他断点被命中ok)。
  • 第二,客户报告Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call. This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention.

我绝对知道 COM 接口中的方法必须使用__stdcall,并且我已经检查了好几次它没有丢失。此外,组件(C++)的实现源自 MIDL 生成的接口。所以接口的头文件有正确的调用约定,如果组件的头文件没有,编译器会抱怨覆盖不同。

由于断点甚至没有被命中,我的直觉是本地过程调用存在根本性错误,就像未正确设置 vtbl 一样。有没有人建议什么可能导致观察到的行为?关于如何调试代理/存根代码的任何提示?

编辑:

作为对 WhozCraig 的回应,这里是 IDL 文件:

0 投票
1 回答
2702 浏览

c++ - 将 std::bind 与 __stdcall 函数一起使用

如何在 __stdcall 函数上使用 std::bind (而不是 boost::bind),或者在当前实现中甚至可能?当我尝试编译以下示例时:

或相同但将 func 声明为:

给我奇怪的构建输出(我包括在下面)。有一种非常恶心的方法可以让它编译:

但它不会让我调用这样的函数 (*proc)(0,0,0);。这是可悲的。这一切的发生只是因为 func - myhook - 声明为 __stdcall。当然,我可以编写一个肮脏的汇编技巧,它将在 func 的末尾推送 4 个 dwords,这将“使”它成为 __stdcall,但我不太确定这一点,而且这是更病态的方式。