在 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;
}
我有一个 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;
}