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

c++ - 不适用于 Windows 7,但它适用于 Windows 8 dll

我有两个DLL文件,A和B。

A 需要 B 用于 setWindowsHookEx()。

我用:

当我尝试在 Windows 7 上运行我的程序时,GetProcAddress(hDll, "GetMsgProc")返回错误。

GetLastError()返回 122,但我认为这不是一个好的错误代码。

当我在 Windows 8 上运行我的程序时,一切正常。

当我更改函数调用时GetProcAddress(hDll, "foo")

typedef void(*foo)();只是创建消息框

一切都适用于 Windows 7 和 Windows 8。

我认为我的问题是__stdcall,但我没有找到解决方案。

DLL 文件 A

DLL 文件 B

我在 Windows 8 64 位和 Windows 7 32 位上运行我的程序。

我运行Dependency Walker并找到了 name GetProcAddress(hDll, "_GetMsgProc@12");,但我的程序无法运行。

0 投票
0 回答
162 浏览

c++ - cdecl 和 std 调用 - 如何使我的代码常规化

我有在此代码中实现标准调用的任务 - 是 cdecl 或 std 调用

'mov eax, [ebp+8] // 获取第一个被推送的参数'

我理解推动指针位置的想法,但我不确定我会告诉指针在哪里看。

是那个 mov eax, [ebp+4/8/12] 或者你有什么

任何帮助告诉我我将如何做到这一点将不胜感激,同样,如果你们中的一个人确实解决了这个问题,可以添加解释

谢谢

0 投票
0 回答
229 浏览

java - 从 JNA/C 与 Pascal 调用 DLL 的结果不一致

我有一个提供头文件的 c++ dll 库,但没有实现。我为这个库函数实现了 JNA 调用。而且我只有一个功能(其他,甚至类似的工作正常)的问题。这是来自 .h 文件的声明:

Java代码:

该函数应返回不同的 int 错误代码,但它始终返回代码 0xFFFF。

我可以用 Pascal 中的相同代码检查它:

Pascal 代码返回 2,Java 代码返回 65535。此外,Pascal std 调用工作正常,更改参数我们得到不同的错误代码(0=OK 和其他),但具有相同参数的 Java 不起作用,它总是返回 0xFFFF。如何调试它以了解问题?

PS 此外,在同一个库中,我有这个功能,它可以在 JNA 上正常工作,没有任何问题:

操作系统是 Win8 x64,JavaOracle7x86,库是 x32。“无符号长”不应该是问题,因为它在 Windows 上应该是 4 个字节。

如果在这两个示例中相同的 STD 调用返回不同的结果,我做错了什么?我该如何调试它?

0 投票
0 回答
330 浏览

c++ - 在 Pascal 和 c++ 中 win32 dll 函数的 std 调用不同

我有这个函数的 C dll:

CALLINGCONV 是 _stdcall。我用 C++ 调用它:

返回值(代码)是错误代码,带这个参数应该是2,这里返回65535——未知错误。

当我在 Pascal 中运行相同的代码时:

正如预期的那样,它返回 2。为什么相同的调用表现不同?有什么区别?

操作系统是 Win8x64,编译 c++ 代码我使用 VS2013,lib.dll 是 32 位的。

与此相关的问题: 从 JNA/C 与 Pascal 调用 DLL 的结果不一致, 但该问题不包括 JNA 和 JAVA。

不幸的是,我没有 dll 库的来源,只有一些头文件。

0 投票
0 回答
231 浏览

json - TJSONObject ToString 方法访问冲突

我调用了一个返回 TJSONObject 的 dll 函数。问题是当我尝试将此值添加到TStringList引发访问冲突异常时。这是我的代码:

这是显示的错误:Exception class $C0000005 with message 'c0000005 ACCESS_VIOLATION'

0 投票
2 回答
1240 浏览

winapi - 当名称可能被修饰时使用 GetProcAddress

GetProcAddress()在 32 位 DLL 上使用的正确方法是什么?在win32上,共有三种调用约定,cdecl、stdcall和fastcall。如果 DLL 中的函数是foo他们将通过以下方式装饰名称_foo_foo@N并且@foo@N.

但是如果 dll 的作者使用了 .def 文件,那么导出的名称将被更改为只是“foo”而没有任何修饰。

这给我带来了麻烦,因为如果我想foo从使用 stdcall 的 dll 加载,我应该使用修饰名称:

或未装饰的:

? 我应该猜吗?我查看了许多 32 位 DLL 文件(stdcall 和 cdecl),它们似乎都导出了未修饰的名称。但是你能假设情况总是如此吗?

0 投票
1 回答
2628 浏览

assembly - ASM 函数调用和 Ret - ret 0xC 有什么作用?

ret 是做什么的?为什么这里需要 ret 0xC?如果它只是 ret 而不是 ret 0xC 或者 0x4 怎么样?

0 投票
1 回答
5716 浏览

c# - stdcall 调用约定和在 C# 中使用 pinvoke

我创建了一个 DLL 文件,其中包含以下两个空函数。

在 C# 中,我可以使用DLLImport如下属性调用函数。

所以我再次尝试直接使用LoadLibrary()kernel32.dll 而不是DllImport属性。

但是,当我调用 MyFunc1() where MyFunc2() works时会发生运行时错误。

所以我__stdcall__cdeclC++ 替换,重新编译 DLL,然后在 C# 中再次调用 MyFunc1()。

而且..它奏效了。

为什么 __stdcall 调用约定不能与 C# 中的 pinvoke 一起使用?

0 投票
0 回答
47 浏览

c - 与 __STDCALL 混淆

我正在尝试与来自 exe 的 dll 进行通信,当我在 dll 中添加 WINAPI 时,我在调用 GetProcAddress() 期间得到一个 NULL 值。

示例代码是:

EXE文件:

动态链接库:

头文件:

源文件:

当相同的代码在没有 WINAPI 调用的情况下运行时,我在 GetProcAddress() 中得到一个非 NULL 值。

谁能帮我这个。

谢谢。

0 投票
0 回答
264 浏览

c++ - 动态调用 kernel32、user32 等中的任意函数

IDE:Code::Blocks 编译器:g++ 4.5.4(来自 Mingw32_i686) 类型应用程序:控制台类型

好的

我会给出代码,它没有按预期工作。这段代码应该表明我的愿望。

我想使用四个包装函数来引发任何 winapi 函数。

F- 函数不返回任何内容并且没有输入参数

F_- 函数不返回任何内容,但它具有输入参数

_F- 函数返回一个值,但没有输入参数

_F_- 函数返回一个值,并有输入参数

我想定义函数返回值的类型和要传递给运行时函数的参数类型,而不是在编译时。

当然,我也不想在编译时确定要传递给函数的参数数量。

有任何想法吗?这甚至可能吗?

升级版:

谢谢罗德里戈_

我下载了 libffi 3.0.6 win32(在我的测试控制台应用程序中使用了 libffi.dll.a 和头文件),但给出了警告:“找不到 libffi-5.dll”。

我下载了http://rpm.pbone.net/index.php3/stat/4/idpl/24142309/dir/fedora_16/com/mingw32-libffi-3.0.9-2.fc15.noarch.rpm.html,解压,在 C:\Mingw32\bin 中找到了 libffi-5.dll 并复制了这个 .dll。

测试代码:

是的!我有一个工作代码!

我会继续研究这个问题。