node-ffi - Передать указатель на строку в dll

156
24 июля 2019, 11:40

В dll определена функция:

    #define _DLLMAINCPP
    #if defined(WIN32) || defined(_WIN32)
    #define EXPORT __declspec(dllexport)
    #else
    #define EXPORT
    #endif
    #ifdef __cplusplus
    extern "C" {
    #endif
        EXPORT int myfunc(char* a)
        {
            // Do something to change value of "a"
        }
    #ifdef __cplusplus
    }
    #endif

Как передать в нее указатель на строку из node-ffi, а потом продолжить работать с этой измененной строкой в nodejs?

Answer 1

Необходимо передать объект Buffer:

//use ffi and ref to interface with a c style dll
var ffi = require('ffi');
var ref = require('ref');
//load the dll. The dll is located in the current folder and named customlib.dll
var customlibProp = ffi.Library('customlib', {
    'myfunction': [ 'void', [ 'char *' ] ]
});
var maxStringLength = 200;
var theStringBuffer = new Buffer(maxStringLength);
theStringBuffer.fill(0); //if you want to initially clear the buffer
theStringBuffer.write("Intitial value", 0, "utf-8"); //if you want to give it an initial value
//call the function
customlibProp.myfunction(theStringBuffer);
//retrieve and convert the result back to a javascript string
var theString = theStringBuffer.toString('utf-8');
var terminatingNullPos = theString.indexOf('\u0000');
if (terminatingNullPos >= 0) {theString = theString.substr(0, terminatingNullPos);}
console.log("The string: ",theString);

Ссылка на решение:

https://stackoverflow.com/questions/32134106/node-ffi-passing-string-pointer-to-c-library

READ ALSO
Способы хранения данных в С++

Способы хранения данных в С++

На каникулы задали лабораторную работу (сделать программу, которая будет хранить метаданные файла, и текст содержащийся в нем, и различные...

168
Объявление двумерного вектора в шапке .h

Объявление двумерного вектора в шапке .h

когда перемещаю вh файл объявление вектора двумерного:

134