Как получить доступ к значению структуры, которая имеет указатель typedef только с SWIG / Python - PullRequest
0 голосов
/ 15 сентября 2018

Я создаю оболочку Python для существующей кодовой базы с DLL и заголовком. Я использую SWIG.

База кода имеет несколько структурных указателей, например:

typedef struct session* session_t;

В этом примере session больше нигде не определено. Все остальные функции в DLL принимают session_t в качестве входных данных. Если я пытаюсь ссылаться на session где-нибудь в сгенерированном SWIG-коде, я получаю ошибки компиляции, которые session не определены. Мне нужен способ доступа к значению session_t в коде Python.

Я пытался использовать макросы cpointer.i и pointer_functions, но это не работает, поскольку предполагается, что тип ввода не является указателем.

Я подумал, что смогу переопределить структуру:

typedef struct Session {} session, *session_t;

Это может сработать, но я не могу найти способ сделать это с SWIG.

Есть ли способ получить доступ к значению указателя структуры с помощью SWIG, если это единственное определение, являющееся указателем структуры typdef?

Редактировать: возможным исправлением является директива SWIG %ignore. Может быть в состоянии игнорировать исходную структуру def и заменить ее в файле .i.

Решено (ish): Я отметил ответ Марка Толонена как правильный, поскольку в нем много полезной информации. API, который я пытаюсь обернуть, содержит множество удаленных конструкторов и поведений, фиксирующих его использование. В итоге я написал оболочку C ++ в своем собственном пространстве имен, а затем сказал Swig игнорировать все, кроме моего пространства имен. Затем я использую только стандартные или свои собственные типы для взаимодействия с Swig / Python.

1 Ответ

0 голосов
/ 16 сентября 2018

SWIG очень хорошо работает с непрозрачными типами.Вот полный пример, где я предоставил источник для test.dll, который использует непрозрачный typedef.Структура определяется только в файле .c, и SWIG не знает об этом определении.Если у вас все еще есть проблема, обновите ваш вопрос воспроизводимым примером.Я подозреваю, что вы использовали session вместо session_t в некоторой карте типов, но без воспроизводимого примера, я могу только показать, что он работает без определения.

test.c

#define API_EXPORTS
#include <stdlib.h>
#include "test.h"

struct session {
    int a;
};

API session_t alloc(void) {
    session_t s = malloc(sizeof(session_t));
    if(s)
        s->a = 123;
    return s;
}

API int get_a(session_t s) {
    return s->a;
}

API void release(session_t s) {
    free(s);
}

test.h

#ifdef API_EXPORTS
#   define API __declspec(dllexport)
#else
#   define API __declspec(dllimport)
#endif

typedef struct session* session_t;

API session_t alloc(void);
API int get_a(session_t s);
API void release(session_t session);

test.i

%module test
%{
#include "test.h"
%}

%include <windows.i>
%include "test.h"

тестовая сессия

Python 2.7.14 (v2.7.14:84471935ed, Sep 16 2017, 20:19:30) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import test
>>> s = test.alloc()
>>> test.get_a(s)
123
>>> test.release(s)
>>>
...