我能够连接到管道(我可以看到连接),但WriteFile总是产生0的结果,bytesWritten是0.发生什么事了?
let pipeName = "\\\\.\\pipe\\xxx.pipe";
let hFile = createFile(pipeName, pipeMode, 0, null, OPEN_EXISTING, 0, null);
let hFileInt = ctypes.cast(hFile, ctypes.intptr_t);
if (ctypes.Int64.compare(hFileInt.value, INVALID_HANDLE_VALUE) == 0) {
throw new Error("CreateFile failed for " + pipeName + ", error " +
ctypes.winLastError);
}
let bytesWritten = ctypes.uint32_t(88);
let msg = "hello world\n";
let result = writeFile(hFile, msg, 12, bytesWritten.address(), null);
result = flushFileBuffer(hFile);
writeFile的结果是0,因为flushFileBuffer,bytesWritten从88变为0. :(这是声明:
let writeFile = kernel32.declare(
"WriteFile",
ctypes.winapi_abi,
ctypes.int32_t, //bool // return type: 1 indicates success, 0 failure
ctypes.voidptr_t, // in: hObject
ctypes.jschar.ptr, // in: lpBuffer
ctypes.uint32_t, // in: nNumberOfBytesToWrite
ctypes.uint32_t.ptr, // out: lpNumberOfBytesWritten
ctypes.voidptr_t.ptr // inout: lpOverlapped
);
let flushFileBuffer = kernel32.declare(
"FlushFileBuffers",
ctypes.winapi_abi,
ctypes.int32_t, //bool // return type: 1 indicates success, 0 failure
ctypes.voidptr_t // in: hObject
);
更新。我将pipeMode更改为GENERIC_WRITE并成功写入。但这令人困惑。我有
var GENERIC_READ = ctypes.uint32_t(0x80000000);
var GENERIC_WRITE = ctypes.uint32_t(0x40000000);
和
let pipeMode = GENERIC_WRITE;
但是
let pipeMode = GENERIC_READ | GENERIC_WRITE;
没有。为什么不起作用?我做的比较错误吗?
更新2。使用>>>修复pipeMode 0
var GENERIC_READ = 0x80000000;
var GENERIC_WRITE = 0x40000000;
let pipeMode = ctypes.uint32_t((GENERIC_READ | GENERIC_WRITE) >>> 0);
然而,在我使用
关闭之前,它看起来并不像管道(即使是齐平) closeHandle(hFile);
当句柄关闭时,我的接收应用程序收到消息,但很奇怪。从我的C#应用程序,我看到
h\0e\0l\0l\0l\0o \0
更新3。从C#行,我正在等待整行,所以等待\ n。我将缓冲区长度增加到24,现在它会在正确的时间触发。唯一剩下的问题(对于这个问题)是为什么我在每个字母后得到\ 0。
更新4。这可能是问题
jschar一个16位无符号字符。这与uint16_t的不同之处在于,C jschar值会自动转换为1个字符的JavaScript字符串。这些是Unicode字符。
我只想要一个普通人物。
更新5。是的,就是这样。改为
ctypes.char.ptr, // in: lpBuffer
让它发挥作用。或者我们应该考虑另一方的16字节字符。