在我所有StackOverFlow兄弟的帮助下,我设法创建了一个C ++ DLL,它通过COM调用我的C#类,并将数据来回传递给外部应用程序。在代码开始工作之后,王国里有很多庆祝活动。
现在我遇到了一个新问题。我正在扩展DLL,以便它可以调用不同的类(都实现相同的接口)。我需要决定调用哪个类,具体取决于加载时传递给DLL的char数组。无论我使用哪个类,我调用的方法都完全相同。调用DLL时在类之间切换的最佳方法是什么?
// Initialize COM.
HRESULT hr = CoInitialize(NULL);
// I want to do something like this....but how?
if (strcmp(modelType, "Model1") == 0) {
IUnitModelPtr pIUnit(__uuidof(ClassOne));
}
if (strcmp(modelType, "Model2") == 0) {
IUnitModelPtr pIUnit(__uuidof(ClassTwo));
}
//call method 1
//call method 2
CoUninitialize();
//exit
这可能是一个相当简单的问题,但我真的不知道任何C ++。只是让COM继续进行对我来说是一个重大挑战。
编辑:我确定有一些超级优雅的方法来实现这一点(反思?)但是请将你的建议限制在可以轻松实现的东西上......效率在这里并不重要,可维护性并不是真正的问题。
答案 0 :(得分:2)
像这样做:
GUID classId = GUID_NULL;
if( strcmp( modelType, "Model1" ) == 0 ) {
classId = __uuidof( class1 );
} else if( strcmp( modelType, "Model2" ) == 0 ) {
classId = __uuidof( class2 );
} else if(... etc, continue for all possible model types
}
IUnitModelPtr unit;
unit.CreateInstance( classId );
// interface methods can be called here
答案 1 :(得分:1)
两个选项。
由于每个不同的接口实现都是一个coclass,并且您的C ++代码使用正确的prog-id / classid来执行创建。
或者,公开的coclass是一个带有返回实际实现类的方法的工厂。
两者都需要逻辑来将modelType
映射到实现类。您可以在C ++代码或.NET代码中执行此操作。没有关于整体上下文的更多信息(字符串 - > coclass映射逻辑上是COM组件或调用者的一部分)。
(在纯C ++ COM实现中,您可以创建自己的自定义COM实例工厂,但这是更高级的COM,不适用于.NET COM互操作。)