如何使用js-ctypes在Windows中写入命名管道?

时间:2016-03-15 23:38:07

标签: firefox jsctypes

我能够连接到管道(我可以看到连接),但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字节字符。

0 个答案:

没有答案