PonylangWindows createProcessffi

问题描述 投票:0回答:1
CreateProcessA

I将当前目录放在当前目录中。这在窗户上完美无缺。
但是,我的Ponylang实施不断返回非零
#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
因此,上述代码编译了Ponylang,但是大部分时间返回2。有时返回123。其他时候它返回998?
有时错误代码不同,这似乎很奇怪。这些代码都意味着文件访问存在一些问题? 

GetLastError
在当前目录中(与C示例相同的目录)。

同样,错误代码不仅是不同的,而且在C版本中执行(运行良好),而在Ponylang版本中则执行不正确。 这使我相信我的Ponylang FFI设置有些不合适。

有人知道可能出了什么问题吗?
    

问题是您使用
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
。当您创建一个
GetLastError

对象时,例如使用

GetLastError

,基础类型是指向结构的指针(即小马没有价值语义)。然后,当您用
Calc.exe

致电

addressof

时,您实际上是将指针传递给指向函数的指针。

如果您的C函数期望指向结构的指针,则可以在执行FFI调用时简单地通过小马对象。

windows ffi ponylang
1个回答
4
投票
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.