Нужен рабочий пример параметра выходной строки Firefox ctypes - PullRequest
1 голос
/ 26 июня 2011

Привет, у меня есть компонент XPCOM, который я сейчас конвертирую для использования ctypes.

Мне удалось создать функции, которые принимают wchar_t *, и я определяю функции с помощью ctypes.jschar.ptr. Все это прекрасно работает, но как мне использовать выходные параметры, когда мне нужно создать указатели wchar_t и массив указателей?

Я много читал и запутался.

  1. Как мне выделить память внутри моего C dll? я должен использовать таНос? если так, как бы это получить освобожден?
  2. Как бы вы распределили и обработали выходной параметр wchar_t *? Буду ли я передать его из JavaScript как CData, который я отклоняю раньше?
  3. Как мне обработать строку wchar_t массив

Может кто-нибудь дать мне несколько примеров кода, например, как обрабатывать такую ​​функцию? (как на стороне C, используя malloc? или что мне следует использовать для полного покрытия памяти, так и на стороне javascript, как это должно быть обработано)?

int MyFunc(wchar_t** outString, wchar_t*** outStringArray)

Спасибо!

1 Ответ

0 голосов
/ 16 декабря 2011

Я думаю, что могу помочь с вашим вторым вопросом.

На стороне C ваш метод, который принимает выходной параметр, выглядит следующим образом:

const char* useAnOutputParam(const char** outParam) {
    const char* str = "You invoked useAnOutputParam\0";
    const char* outStr = "This is your outParam\0";
    *outParam = outStr;
    return str;
}

И на стороне JavaScript:

Components.utils.import("resource://gre/modules/ctypes.jsm");

/**
 * PlayingWithJsCtypes namespace.
 */
if ("undefined" == typeof(PlayingWithJsCtypes)) {
  var PlayingWithJsCtypes = {};
};


var myLib = {
    lib: null,

    init: function() {
        //Open the library you want to call
        this.lib = ctypes.open("/path/to/library/libTestLibraryC.dylib");

        //Declare the function you want to call
        this.useAnOutputParam = this.lib.declare("useAnOutputParam",
                        ctypes.default_abi,
                        ctypes.char.ptr,
                        ctypes.char.ptr.ptr);

    },

    useAnOutputParam: function(outputParam) {
        return this.useAnOutputParam(outputParam);
    },

    //need to close the library once we're finished with it
    close: function() {
        this.coreFoundationLib.close();
    }
};

PlayingWithJsCtypes.BrowserOverlay = {

    /*
     * This is called from the XUL code
     */
    doSomething : function(aEvent) {
        myLib.init();

        //Instantiate the output parameter
        let outputParam = new ctypes.char.ptr();

        //Pass through the address of the output parameter
        let retVal = myLib.useAnOutputParam(outputParam.address());
        alert ("retVal.readString() " + retVal.readString());
        alert ("outputParam.toString() " + outputParam.readString());

        myLib.close();
    }
};

Помогло это сообщение на форуме: http://old.nabble.com/-js-ctypes--How-to-handle-pointers-and-get-multiple-values-td27959903.html

...