Привет всем.

Есть необходимость с помощью js-ctypes скопировать кусок памяти. можно ли это как-то сделать?
в с++ это выглядит так memcpy(&rtzi, tziBuff, dwSize);
rtzi структура, tziBuff байтовый буфер.

Благодарю за помощь.

logik
1. Нужно создать тип js-ctypes, соответвтстующий вашей структуре: https://developer.mozilla.org/en/Mozill … Structures. Как передать указатель на этот тип - см. там же ниже в разделе Pointers.
2. Нужно сформировать ctypes array, соответствующий вашему буферу. Примеры - опять же выше по ссылке в соотв. разделе.
Пример из личной практики - примерно вот так обстояла работа с LPTSTR:

Выделить код

Код:

extern "C" __declspec(dllexport) int GetErrorMessage(int errcode, LPTSTR buffer)
{
  int msgRes=FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,NULL,errcode,
    MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),buffer,1025, NULL );
  return msgRes;
}

и в js:

Выделить код

Код:

GetErrorMessage: function(errcode,onlyMessage)
{
  var method=this.apilib.declare("GetErrorMessage",ctypes.winapi_abi,ctypes.int32_t,ctypes.int32_t,ctypes.jschar);
  let arrayType = ctypes.ArrayType(ctypes.jschar);
  let msg = new arrayType(1024);
  var res=method(errcode,msg);
  if (res==0) throw new Error("apilib.GetErrorMessage: FormatMessageW returns NULL.")
  return msg.readString();
}

ctypes весьма неудобны, когда нужно выполнить достаточно сложный код (который при том тривиален в C/C++) - я бы посоветовал по возможности выносить максимум кода в свою сишную библиотеку-враппер с методами с максимально простой сигнатурой. И вызывать методы из этого враппера - так намного проще.

ну мне нужно было конкретное решение именно по copymemory, я просто не знал какую функцию из dll нужно было цеплять. в целом c ctypes я знаком.
но я уже нашел решение - RtlMoveMemory