1

在我的 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 运行对我来说是一个重大挑战。

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

4

2 回答 2

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
于 2009-03-09T14:18:23.987 回答
1

两种选择。

由于每个不同的接口实现都是一个 coclass,并且您的 C++ 代码使用正确的 prog-id/classid 来执行创建。

或者,暴露的 coclass 是一个带有返回实际实现类的方法的工厂。

两者都需要逻辑来将您映射modelType到实现类。您可以在 C++ 代码或 .NET 代码中执行此操作。没有关于整体上下文的更多信息(在逻辑上是 COM 组件或调用者的字符串 --> coclass 映射的一部分)。

(在纯 C++ COM 实现中,您可以创建自己的自定义 COM 实例工厂,但这是更高级的 COM,不适用于 .NET COM 互操作。)

于 2009-03-09T14:19:45.107 回答