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调用时简单地通过小马对象。