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

c# - C#字符串指向非托管类库中的指针

现有应用程序将导入我的类库。我正在尝试在 C# 中执行此操作,因为我在 C# 方面的经验比 C++ 多得多。现有的应用程序使用 __stdcall,这在 C# 中是不可能的,因为代码是托管的。我使用一个名为 RGiesecke.DllExport 的库来执行非托管导出。

我有一个 C/C++ 中函数的示例头

这个函数的目的是,我用我的库的简短描述填充描述指针。

问题是我不确定 char* 在这里是否很好用,而且我不知道如何用字符串填充这个指针。

我希望有人可以帮助我,在此先感谢您。

0 投票
1 回答
2679 浏览

c++ - 说白了,我们为什么要使用_stdcall?

在研究使用 C++ 制作游戏的状态时,我遇到了调用约定。

在上一个问题中,有人说 MSDN 没有很好地解释 _stdcall - 我同意。

调用像 _stdcall 这样的约定的主要目的是什么?参数放在堆栈上的顺序是否重要?它如何减少 X86 中的代码大小(正如其他人所说)?

0 投票
1 回答
1164 浏览

c++ - 将函数分配给具有相同签名但不同调用约定的 std::function 失败

以下使用 mingw 4.7.2 和 -m64 标志编译并运行得很好。

但使用 -m32 或任何 mingw 32 位版本无法编译。是错误还是我缺少编译器标志?

错误信息:

在将调用“隐藏”在 lambda 函数中之后,我最终这样做了,它工作得很好:

0 投票
3 回答
1388 浏览

assembly - 汇编语言 - 调用约定

有人可以给我一些真实的例子来帮助我理解汇编语言中的被调用者和调用者是什么?我已经通过了大多数来源,但我仍然无法区分被调用者和调用者。先感谢您。(我正在添加这个解释 - 再次感谢您!对不起,我是新来的代码,不知道如何插入代码以正确显示)我正在尝试理解这段代码 - 学习组装的基础知识。我正在尝试为每个命令添加注释(我相信像我这样的其他人也需要它:

我读到了,为了定义调用约定,我需要弄清楚谁是调用者,谁是被调用者:) 我花了很多时间来理解逻辑: call ds:lstrlenA 是指被调用者吗?sub_401040 是调用者吗?我们可以在一个程序中有多个调用约定吗?像 cdecl 和 stdcall 一样?我不是程序员,也不是在写代码,我只是想了解它是如何帮助分析病毒的。

0 投票
1 回答
3350 浏览

dll - 将 Embarcadero C++ Builder XE3 DLL 导入 Embarcadero C++ Builder XE3

我尝试在 Embarcadero C++ Builder XE3 中创建一个 DLL,并在同一环境中的测试项目中使用它。

我以一个教程为例,该教程的代码对我来说效果不佳(!):http ://docwiki.embarcadero.com/RADStudio/XE3/en/Tutorial:_Using_Dynamic_Linked_Libraries_in_C%2B%2BBuilder_Applications

这是我的 DLL 的内容:

BaseAuth.h 文件:

Auth.h 文件:

Auth.cpp 文件:

和 File1.cpp :

现在在测试应用程序中我有:

  • 相同的 BaseAuth.h 文件

  • 带有 Button 的表单:

Test_DLLAuthOrga.h:

Test_DLLAuthOrga.cpp:

结果是:

指针 mpAuth 有一个地址。

但是它的方法没有地址,当我调用诸如“void TestMessage()”之类的简单方法时,它会引发访问冲突。

=> 首先似乎是字符串兼容性的问题(但在“C++ Builder XE3”和“C++ Builder XE3”之间,我希望使用相同的字符串格式?!):使用 Unicode Delphi 调用 DLL 时出错

=> 我发现了一个类似的问题,但是 C++ DLL 进入 Delphi,而不是 C++ DLL 进入 C++ ...:在 Delphi 应用程序中调用 C++ DLL

=> 我尝试使用“HMODULE”而不是“HINSTANCE load;” : 同样的结果。

=>我尝试使用没有成功

代替 :

=>我还尝试用“__cdecl”或“”(删除)替换“__stdcall”:库加载但GetProcAdress返回NULL。

=> 在尝试调用 DLL 的方法“TestMessage()”时我做错了什么?

0 投票
2 回答
20822 浏览

c# - 为什么 Cdecl 调用在“标准”P/Invoke 约定中经常不匹配?

我正在开发一个相当大的代码库,其中 C++ 功能是从 C# P/Invoked。

我们的代码库中有很多调用,例如...

C++:

使用相应的 C#:

我已经搜索了网络(在我能力范围内),以了解为什么存在这种明显的不匹配。例如,为什么 C# 中有 Cdecl,而 C++ 中有 __stdcall?显然,这会导致堆栈被清除两次,但是,在这两种情况下,变量都以相同的相反顺序被推入堆栈,因此我看不到任何错误,尽管返回信息可能会在以下情况下被清除在调试期间尝试跟踪?

来自 MSDN:http: //msdn.microsoft.com/en-us/library/2x8kf7zx%28v=vs.100%29.aspx

再一次,extern "C"在 C++ 代码和CallingConvention.CdeclC# 中都有。为什么不是CallingConvention.Stdcall?或者,此外,为什么__stdcall在 C++ 中有?

提前致谢!

0 投票
1 回答
303 浏览

function - __cdecl 将 WinSock 函数包装为纯 C 中的回调并调用它

准备了这样的函数,其中一些 WSA 函数将用作回调:

但是在其他代码中,我正在尝试启动它:

我收到一个错误:

'WSClient::StartWinSock' : 无法将参数 1 从 'int (__stdcall *)(WORD,LPWSADATA)' 转换为 'int (__cdecl *)(WORD,LPWSADATA)'

另外,我不知道如何通过 WSAStartup() 之类的回调函数正确传递参数(其参数:WORD(无符号短版本号)&& LPWSADATA(对 WSAData 的引用))。

0 投票
3 回答
908 浏览

c++ - 使用 PInvoke 时,为什么要使用 __stdcall?

我一直在使用 PInvoke 让我的 C# 应用程序调用我编写的 C++ 函数。

现在,我不断听到我需要用__stdcall约定定义那些外部可访问的函数。我的问题是:为什么?

到目前为止,我不小心忽略了这个建议,一切都像一个魅力。当我添加__stdcall到我的函数中时,一切都以相同的方式工作(或者至少看起来如此)。

本文说它__stdcall用于 Win32 位功能,但我正在针对 x64 平台进行编译。这是否意味着我__stdcall毕竟不应该使用,还是意味着我错过了其他东西?

请在回复时使用简单的英语。;-) 像这样的行(引用自我链接的文章):

被调用者清理堆栈,因此编译器生成可变参数函数 __cdecl。

让我的大脑感觉好像有风滚草吹过它。

0 投票
1 回答
530 浏览

c++ - c++-builder:转换成stdcall类型

我目前正在尝试移植旧的 owl-c++-builder-projekt 以使用 XE2 和 owlnext。在旧文件中,我可以简单地调用一行

虽然 LP_I2Open 定义为

这些代码块实际上来自多个文件。我认为这个顺序很直观。

现在我有一些困难来根据需要重写它。我了解,现在左侧被理解为返回值的转换方法,但不能分配给特定值,因此会引发“L-Value expected”错误。但是,我不太清楚如何将 FARPROC 转换为适合 LP_I2COpen 的东西...尝试不进行任何转换会引发此错误:

那么,有人知道我在这条线上犯了哪些错误吗?

问候,朱利安

0 投票
1 回答
1357 浏览

delphi - 如何为 DLL 过程(stdcall)创建默认参数?

我制作了一个导出多个函数的 DLL(使用 stdcall)。我想让他们中的一些人接受或不接受参数。所以一个懒惰的程序员可以不带任何参数地调用它。我在某个论坛上读到默认参数在 DLL-s 中不起作用。我唯一的选择是创建 2 个具有不同名称的函数,例如:

? 或者也许有更优雅的方式来实现这一点?