Создание объекта из C dll в C ++ - PullRequest
0 голосов
/ 25 января 2020

У меня есть программа на C ++, в которой я называю несколько C ++ Dll. Обычно я делаю простой класс в Dlls с конструктором и деструктором и выполняю некоторую инициализацию в конструкторах. Затем в основной программе я делаю несколько объектов из каждого класса Dlls и использую их в несколько потоков .

MyNamespcae::MyDllClass * MyObj = new MyNamespcae::MyDllClass(/*...inputs...*/);  # I make an object for each thread seperately

Теперь у меня есть C Dll что я звоню в основной программе C ++. Я экспортировал функции C с __declspec(dllexport) и использовал их напрямую в основной программе. Проблема в том, что у меня есть некоторые глобальные переменные в C Dll, поэтому я не могу использовать Dll в нескольких потоках.

Так что мой вопрос, как я могу сделать какой-то объектно-ориентированный метод ( как то, что мы делаем в C ++) в C dll, чтобы вызвать его в C ++, из нескольких потоков? ( Примечание. Мой вопрос о том, что мне нужно сделать в C, а не в C ++ )

Ответы [ 2 ]

0 голосов
/ 29 февраля 2020

Ссылка, которой поделились Lorinczy Zsigmond , которая: http://lzsiga.users.sourceforge.net/oop.html#S0004, решила мою проблему. Я повторяю это содержание здесь для большего удобства:

Заголовочный файл: / * mytype.h * /

#ifndef MYTYPE_H
#define MYTYPE_H

typedef struct MyType MyType; /* opaque */

MyType *MyType_Alloc (int par);
void    MyType_Release (MyType *mp);

int MyType_Operation1 (MyType *mp, int par1, int par2);

#endif

исходный код: / * mytype . c * /

#include <stdlib.h>
#include <string.h>

#include "mytype.h"

struct MyType {
    int somedata;
};

MyType *MyType_Alloc (int par) {
    MyType *mp= malloc (sizeof *mp);
    mp->somedata= par;
    return mp;
}

void MyType_Release (MyType *mp) {
    memset (mp, 0, sizeof *mp);
    free (mp);
}

int MyType_Operation1 (MyType *mp, int par1, int par2) {
    return mp->somedata + par1 + par2;
}

test: / * mytypetest. c * /

#include <stdio.h>

#include "mytype.h"

int main (void) {
    MyType *mp= MyType_Alloc (20200000);
    int sum= MyType_Operation1 (mp, 100, 25);
    printf ("sum=%d\n", sum);
    MyType_Release (mp);
    return 0;
}
0 голосов
/ 26 января 2020

Семантически, либо эти переменные должны быть глобальными, либо нет.

Если они есть, то вам нужно правильно синхронизировать, поэтому вам нужно экспортировать из метода C, а не переменные, а скорее функции, которые обращаются к этим переменным с надлежащей синхронизацией.

Если они не должны быть глобальными, и вы хотите выделить один (или более) на поток, то вы можете просто экспортировать 2 C функций для каждого такого типа объектов, myobj_t new_dllobj(...) и delete_dllobj(myobj_t obj), которые выделяют, конструируют, уничтожают и освобождают эти объекты.

...