Как с помощью js-ctypes получить вывод из Windows ReadFile?

Я использую (хотя и не совсем уверен в lpBuffer -> char.ptr)

  let readFile = kernel32.declare(
    "ReadFile",
    ctypes.winapi_abi,
    ctypes.int32_t,     //bool  // return type: 1 indicates success, 0 failure
    ctypes.voidptr_t,   // in: hObject
    ctypes.char.ptr,  // out: lpBuffer
    ctypes.uint32_t,    // in: lpNumberOfBytesRead
    ctypes.uint32_t.ptr,    // out: lpNumberOfBytesWritten
    ctypes.voidptr_t.ptr    // inout: lpOverlapped
  );

за

BOOL WINAPI ReadFile(
  _In_        HANDLE       hFile,
  _Out_       LPVOID       lpBuffer,
  _In_        DWORD        nNumberOfBytesToRead,
  _Out_opt_   LPDWORD      lpNumberOfBytesRead,
  _Inout_opt_ LPOVERLAPPED lpOverlapped
);

Однако, когда я пытаюсь

  let output = ctypes.char.array(1024);
  let isRead = readFile(hFile, output, 1024, bytesWritten.address())

я получил

JPM [ошибка] Сообщение: TypeError: не удается передать ctypes.char.array(1024) в аргумент 2 int32_t ReadFile(void*, char*, uint32_t, void**)

Ещё попытки.

  let output = ctypes.char.array(1024);
  let isRead = readFile(hFile, output.ptr, 1024, bytesWritten.address())

JPM [ошибка] Сообщение: TypeError: не удается передать ctypes.char.array(1024).ptr в аргумент 2 int32_t ReadFile(void*, char*, uint32_t, void**

  let output = ctypes.char.array(1024);
  let isRead = readFile(hFile, output.address(), 1024, bytesWritten.address())

JPM [ошибка] Сообщение: TypeError: output.address не является функцией

  let output = ctypes.char.ptr;
  let isRead = readFile(hFile, output, 1024, bytesWritten.address())

JPM [ошибка] Сообщение: TypeError: не удается передать ctypes.char.ptr в аргумент 2 int32_t ReadFile (void*, char*, uint32_t, v oid**)


person tofutim    schedule 16.03.2016    source источник


Ответы (1)


Это заставило его работать

  let outputType = ctypes.char.array(1024);
  let output = outputType();
  let isRead = readFile(hFile, output, 1024, bytesWritten.address(), null);
person tofutim    schedule 16.03.2016