在 C++ 中从 C dll 创建对象

Making an object from a C dll in C++

我有一个 C++ 程序,我在其中调用了多个 C++ Dll。通常我在带有构造函数和析构函数的 Dll 中创建一个简单的 class,并在构造函数中进行一些初始化。然后在主程序中,我从每个 Dll 的 class 中创建多个对象,并在 多线程 .

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

现在我有一个 C Dll,我在主 c++ 程序中调用它。我用 __declspec(dllexport) 导出了 C 函数,并在主程序中 直接 使用它们。这里的问题是我在C Dll中有一些全局变量,所以我不能在多线程中使用Dll。

所以我的问题是如何在 C dll 中执行一些类似面向对象的方法(就像我们在 C++ 中所做的那样)以从多个线程在 C++ 中调用它? (注意我的问题是我需要在 C 而不是 c++ 中做什么)

从语义上讲,这些变量要么必须是全局变量,要么不需要。

如果他们这样做,那么您必须正确同步,因此您需要从 C 方法导出而不是变量,而是通过正确同步访问这些变量的函数。

如果它们不需要是全局的,并且你想为每个线程分配一个(或多个),那么你可以为每个这样的对象类型导出 2 个 C 函数,myobj_t new_dllobj(...)delete_dllobj(myobj_t obj),它分配&构造和销毁&释放这些对象。

Lorinczy Zsigmond 分享的 link http://lzsiga.users.sourceforge.net/oop.html#S0004 解决了我的问题。为了方便起见,我在这里重复它的内容:

Header-file: /* 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

source code: /* 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;
}