Страницы: 1
Привет всем.
Есть необходимость с помощью 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
Отсутствует
Страницы: 1