我目前有一个dll可以帮助我进行一些操作,我希望我的dll可以修改主线程的变量。我是否以某种方式将类(变量具有类的类型名称)发送到dll,如果我还使dll包含定义类的文件(.h文件)。
所以基本上,我如何让dll修改另一个线程的变量(在这种情况下,主线程)?
编辑:
我想要改变的变量是这样的:
组< UMesh> InstancedMesh
Group是一个模板类,UMesh是另一个类。
答案 0 :(得分:1)
我是否以某种方式将类(变量具有类的类型名称)发送到 dll,我是否也应该让dll包含类所在的文件 已定义(.h文件)。
不,你不应该让你的库取决于某些应用程序类型。那么这个库如何用于其他应用程序?
您的图书馆只接受此图书馆已知类型的对象。
因此,您的应用程序中有类型:
template <class T>
class Group;
你想要一些库函数接受这种类型的对象。
有两种典型的解决方案:
第一个解决方案,让它命名为ObjectOriented解决方案,在库中创建一个接口,并接受实现此接口的对象:
class SomInterface {
public:
virtual void foo1() = 0;
virtual void foo2() = 0;
};
void doSomething(SomeInterface& object);
然后在您的应用程序中使用doSomething
,您的类应来自此接口:
template <class T>
class Group : public SomeInteface {
public:
virtual void foo1() {...}
virtual void foo2() {...}
};
Group<UMesh> object;
doSomething(object);
或者(我更喜欢这个)从你的类到这个接口创建一个适配器:
template <class T>
class GroupSomeInterface : public SomeInteface {
public:
GroupSomeInterface(Group<UMesh& object) : object(object) {}
virtual void foo1() {...}
virtual void foo2() {...}
private:
Group<UMesh& object;
};
Group<UMesh> object;
GroupSomeInterface<UMesh> adapter(object);
doSomething(adapter);
第二个解决方案,让它命名为通用解决方案,因为你有模板类,对于这个特殊情况应该更好。在库中创建一个函数模板,接受任何类型的某个接口:
template <class T>
void doSomething(T& object);
Group<UMesh> object;
doSomething(object);
如果你的Group<T>
没有这个方法所需的接口,那么就像第一个解决方案那样制作一个适配器 - 但这次没有明确的接口类,没有虚拟现实:
template <class T>
class GroupSomeInterface {
public:
GroupSomeInterface(Group<UMesh& object) : object(object) {}
void foo1() {...}
void foo2() {...}
private:
Group<UMesh& object;
};
Group<UMesh> object;
GroupSomeInterface<UMesh> adapter(object);
doSomething(adapter);
BTW,通过对象接口我的意思是它的所有公共函数和在这个对象上运行的所有全局函数(例如operator << (ostream,Object)
)