如何使用char **指针进行FFI调用?

时间:2018-06-16 02:24:26

标签: c ffi

我尝试进行FFI调用,但是在ffi_call(在这种情况下为gtk_init)调用的函数内部出现了分段错误。我不确定我搞砸了。

/*
 * gtk_init.cc
 */

#include <ffi.h>
#include <gtk/gtk.h>

void test();

int main(int argc, char *argv[]) {
    test();
    return 0;
}


void test() {

    ffi_cif cif;
    ffi_type *arg_types[2];
    void *arg_values[2];
    ffi_status status;
    ffi_arg result;

    arg_types[0] = &ffi_type_uint;
    arg_types[1] = &ffi_type_pointer;

    status = ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &ffi_type_void, arg_types);

    if (status != FFI_OK) {
        printf("Failed to prep_ffi\n");
        return;
    }

    int argc = 4;
    char **argv = (char**)malloc(sizeof(char*) * argc);
    argv[0] = strcpy((char*)malloc(sizeof(char) * 6), "test");
    argv[1] = strcpy((char*)malloc(sizeof(char) * 13), "--gtk-debug");
    argv[2] = strcpy((char*)malloc(sizeof(char) * 6), "misc");
    argv[3] = strcpy((char*)malloc(sizeof(char) * 6), "last");

    arg_values[0] = &argc;
    arg_values[1] = &argv;

    ffi_call(&cif, FFI_FN(gtk_init), &result, arg_values);

    // gtk_init(&argc, &argv);

    for (int i = 0; i < argc; i++) {
        printf("%s\n", argv[i]);
        free(argv[i]);
    }

    free(argv);
}

完整的要点可以是found here

1 个答案:

答案 0 :(得分:2)

问题在于ffi_call()将参数的地址作为gtk_init()sendDataToExecutionAPICallback: function() { post({ 'url': 'https://script.google.com/macros/s/#####/exec', // URL of Web Apps 'callback': obj.executionAPIResponse, 'request': { 'parameters': { 'data1': 'ok1 from script', 'data2': 'ok2 from script' }, 'password': 'samplePassword', } }); }, executionAPIResponse: function(response) { var info; if (response == 'ok') { info = 'Data has been entered'; } else { info = 'Error...'; } obj.displayMessage(info); }, function post(options) { var xhr = new XMLHttpRequest(); xhr.onreadystatechange = function() { if (xhr.readyState === 4 && xhr.status === 200) { // JSON response assumed. Other APIs may have different responses. options.callback(xhr.responseText); } else if(xhr.readyState === 4 && xhr.status !== 200) { console.log('post', xhr.readyState, xhr.status, xhr.responseText); } }; xhr.open('POST', options.url, true); // Set standard Google APIs authentication header. xhr.send(JSON.stringify(options.request)); } int *,您需要获取这些地址,以便{{1}和} char ***,有趣吗?

正如评论int **中所述,也期望char ****gtk_init()终止。

最后一个问题是argv是错误的类型,在这种情况下您必须使用NULL(并且ffi_type_uint需要ffi_type_pointer)。

所以最终的固定代码是:

int

免责声明:未经测试。