如何有条件地选择我在C ++ DLL中通过COM调用的C#类?

时间:2009-03-09 14:08:33

标签: c++ com interface createinstance

在我所有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继续进行对我来说是一个重大挑战。

编辑:我确定有一些超级优雅的方法来实现这一点(反思?)但是请将你的建议限制在可以轻松实现的东西上......效率在这里并不重要,可维护性并不是真正的问题。

2 个答案:

答案 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互操作。)