Доступ к элементам структуры из библиотеки DLL, загруженной во время выполнения на C

#c #matlab #dll #simulink #getprocaddress

#c #matlab #dll #simulink #getprocaddress

Вопрос:

У меня следующая проблема: во время выполнения я загружаю сгенерированную Matlab DLL-библиотеку модели Simulink, которая содержит структуры для выходных и входных данных модели и некоторые методы.

Пример сгенерированных структур и методов (имя модели — «Test_Scalar»):

 typedef struct {
  real_T Input_1;                    /* '<Root>/Input_1' */
  real_T Input_2;                    /* '<Root>/Input_2' */
} ExtU_Test_Scalar_T;

/* External outputs (root outports fed by signals with default storage) */
typedef struct {
  real_T Output;                      /* '<Root>/Output' */
} ExtY_Test_Scalar_T;

/* Real-time Model Data Structure */
struct tag_RTM_Test_Scalar_T {
  const char_T * volatile errorStatus;
};

/* External inputs (root inport signals with default storage) */
extern ExtU_Test_Scalar_T Test_Scalar_*;

/* External outputs (root outports fed by signals with default storage) */
extern ExtY_Test_Scalar_T Test_Scalar_Y;

/* Model entry point functions */
extern void Test_Scalar_initialize(void);
extern void Test_Scalar_step(void);
extern void Test_Scalar_terminate(void);
  

В моей программе на C я могу загружать и выполнять функцию инициализации, а также получать указатель на структуру.
Однако я не знаю, как можно получить доступ к элементам структур. У кого-нибудь здесь есть идея?

 int main() {
    HMODULE hModule = LoadLibraryA("C:\....\Test_Scalar_win64.dll");
    assert(hModule);

    FARPROC initialize = GetProcAddress(hModule, "Test_Scalar_initialize");
    assert(initialize);
    initialize();

    FARPROC inputs= GetProcAddress(hModule, "Test_Scalar_U");
    assert(inputs);

    //accessing members of input struct here
}
  

С наилучшими пожеланиями
Крис

Комментарии:

1. просто приведите его к ExtU_Test_Scalar_T* ?

2. Я думаю, что тип «ExtU_Test_Scalar_T» неизвестен, потому что я не включаю заголовок. Доступ должен быть как можно более общим, поэтому я знаю только, сколько членов имеет структура и какой у них тип.

3. Почему вы не включаете заголовок?

4. Мы хотим реализовать общий файл C , который служит точкой доступа JNI из Java для любой модели Simulink. Этому классу мы хотим передать только количество и типы входных и выходных данных (и, конечно, путь к динамически загружаемому DLL-файлу и имя модели, на которой основано именование сгенерированных методов и структур). Этот файл C также должен быть преобразован в DLL один раз. Эта библиотека DLL будет вызываться из Java через JNI. Поэтому доступ к структурам должен выполняться во время выполнения, без включения заголовка во время компиляции.

5. затем вам нужно будет написать код для вычисления смещений структуры и запоминания отдельных элементов, если вы хотите сделать это более надежно, было бы лучше экспортировать методы доступа