【发布时间】:2012-04-10 04:30:14
【问题描述】:
我正在使用 JNA 调用 user32.dll 和 kernel32.dll 的方法。到目前为止,它工作正常。我遇到了一些问题,我知道我必须调用这个方法。
void SendCommandToConsole( char* Cmd )
{
DWORD dwCall = 0x004C1030;
__asm
{
push Cmd;
push 0;
call dwCall;
}
}
SendCommandToConsole ( "rp 2000" );
但我什至不明白它是什么?这个 __asm 在做什么?
如果我使用的标签不正确,请添加适当的标签。 :)
编辑 按照建议添加了 .Net 和 C# 标签。上面的代码是 C# 或 .NET,可能有这门语言知识的人可以告诉我们它到底是什么,以及我们如何在 java 中做到这一点。
【问题讨论】:
-
_asm 是内联汇编代码。它在堆栈上推送一个指向 C 等效字符串的指针,以 0 终止它,然后在 dwCall 地址调用该过程(我认为)。
-
这看起来相当于
System.out.println。 -
@HovercraftFullOfEels 谢谢,我们能用java写类似的代码吗?
-
从技术上讲,您可以,但您可能不想这样做。 JNA 可以构造回调,这是写入分配内存的可执行文件位。您可以获取回调可执行地址并将其覆盖,以便调用 JNA 回调将导致您的代码被执行。除非您真正了解汇编代码,否则不推荐。请注意,您的程序集 sn-p 不会公开编译器在访问传入参数或从 (C) 调用返回时生成的内容。
-
@RakeshJuyal 您问题中提供的代码 sn-p 不是 C#,而是普通 C。(C# 不允许您内联汇编。)我已相应地重新标记了您的问题.
标签: java c assembly jna equivalent