- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我一直在尝试从 Pony Language 的 FFI 调用 Window 的 CreateProcessA
。
我创建了一个 C 和一个 PonyLang 示例。 C 示例非常有效:
#include <windows.h>
#include <stdio.h>
#include <tchar.h>
void wmain(void) {
STARTUPINFO info={0};
PROCESS_INFORMATION processInfo={0};
CreateProcessA("calc.exe", 0, 0, 0, 0, 0, 0, 0, &info, &processInfo);
if (status == 0)
printf("%d",GetLastError()); // never hits
}
我把 calc.exe
放在当前目录下。这在 Windows 上完美运行。但是,我的 PonyLang 实现一直返回非零 GetLastError
:
use "lib:kernel32"
primitive _ProcessAttributes
primitive _ThreadAttributes
primitive _Inherit
primitive _Creation
primitive _Environment
primitive _CurrentDir
primitive _StartupInfo
primitive _ProcessInfo
primitive _HandleIn
primitive _HandleOut
primitive _HandleErr
primitive _Thread
primitive _Process
struct StartupInfo
var cb:I32 = 0
var lpReserved:Pointer[U8] tag= "".cstring()
var lpDesktop:Pointer[U8] tag= "".cstring()
var lpTitle:Pointer[U8] tag= "".cstring()
var dwX:I32 = 0
var dwY:I32 = 0
var dwXSize:I32=0
var dwYSize:I32=0
var dwXCountChars:I32=0
var dwYCountChars:I32=0
var dwFillAttribute:I32=0
var dwFlags:I32=0
var wShowWindow:I16=0
var cbReserved2:I16=0
var lpReserved2:Pointer[U8] tag="".cstring()
var hStdInput:Pointer[_HandleIn] = Pointer[_HandleIn]
var hStdOutput:Pointer[_HandleOut]= Pointer[_HandleOut]
var hStdError:Pointer[_HandleErr]= Pointer[_HandleErr]
struct ProcessInfo
var hProcess:Pointer[_Process] = Pointer[_Process]
var hThread:Pointer[_Thread] = Pointer[_Thread]
var dwProcessId:I32 = 0
var dwThreadId:I32 = 0
//var si:StartupInfo = StartupInfo
actor Main
new create(env: Env) =>
var si: StartupInfo = StartupInfo
var pi: ProcessInfo = ProcessInfo
var inherit:I8 = 0
var creation:I32 = 0
var one:I32 = 0
var two:I32 = 0
var three:I32 = 0
var four:I32 = 0
var z:I32 = 0
var p = @CreateProcessA[I8]("calc.exe",
z,
one,
two,
inherit,
creation,
three,
four,
addressof si,
addressof pi)
if p == 0 then
var err = @GetLastError[I32]() // hits this every time.
env.out.print("Last Error: " + err.string())
end
所以上面的代码为 PonyLang 编译,但是 GetLastError
大多数时候返回 2。有时 GetLastError
返回 123。其他时候它返回 998?错误代码有时不同似乎很奇怪。这些代码都意味着文件访问存在问题?
Calc.exe
位于当前目录(与 c 示例相同的目录)。
此外,不仅错误代码不同,而且 calc.exe 在 C 版本中执行(运行良好),但在 PonyLang 版本中却没有。这让我相信我的 PonyLang ffi 设置出了问题。
有谁知道哪里出了问题?
最佳答案
问题出在您对 addressof
的使用上。当您创建一个 struct
对象时,例如对于 var si = StartupInfo
,底层类型是指向结构的指针(即 Pony 中的 struct
没有值语义)。然后,当您使用 addressof
调用 CreateProcessA
时,您实际上传递了一个指向该函数的指针。
如果您的 C 函数需要一个指向结构的指针,您可以在执行 FFI 调用时简单地传递没有 addressof
的 Pony 对象。
关于windows - PonyLang Windows CreateProcess FFI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42238248/
为什么赋值返回以前的值而不是新值,例如:将 0 赋值给 y 而不是 2?这是非常危险的,因为它违反了最小意外原则。 var x: I32 = 0 let y = (x = 2) 最佳答案 我很确定这样
从 helloworld 开始,我试图通过制作一个应用程序来学习一些小马,该应用程序会向用户回显他们输入的内容。这是有效的,除了我 _env.out.print(_buffer) 的一行。 class
今天刚找到编程语言“小马”……并开始玩它。 我的代码应该做一些简单的生产者消费者的事情。 正如语言文档所声称的那样,该语言确保没有数据竞争。 这里,main 向生产者发送 10 条消息,生产者又向消费
我正在尝试学习 Pony,出于显而易见的原因,我想做的第一件事就是打印值。 但是,它似乎不适用于大多数事情,例如: env.out.print(2 + 2) 给出错误: Could not infer
Pony 有一个未参数化的异常值。 不幸的是,我经常有一些代码想要抛出不同类型的异常,并且我需要知道它们是什么,以便正确处理它们——例如,简单地说,当停止程序时,向用户提供以下信息很重要正确的错误消息
actor Test fun foo(a: U32) => a = a + 1 我想要test.foo(a)修改a。这可能吗?谢谢 最佳答案 您只能在类级别修改var。这是故
我一直在尝试从 Pony Language 的 FFI 调用 Window 的 CreateProcessA。 我创建了一个 C 和一个 PonyLang 示例。 C 示例非常有效: #include
我一直在研究 Pony 数组,以便更好地理解 Pony,并且想为任何数组编写映射函数。 我说的是现在大多数语言都具有的用于转换集合元素的标准映射函数,如 Clojure 中所示: (map #(+ 1
我是一名优秀的程序员,十分优秀!