如何有条件地选择我在C+中通过COM调用的C#类+;动态链接库? 在我的所有StAccOppFrimes的帮助下,我设法创建了一个C++ DLL,通过COM调用我的C类,并将数据来回传递给外部应用程序。代码开始生效后,王国里举行了很多庆祝活动

如何有条件地选择我在C+中通过COM调用的C#类+;动态链接库? 在我的所有StAccOppFrimes的帮助下,我设法创建了一个C++ DLL,通过COM调用我的C类,并将数据来回传递给外部应用程序。代码开始生效后,王国里举行了很多庆祝活动,c++,com,interface,createinstance,C++,Com,Interface,Createinstance,现在我有一个新问题。我正在扩展DLL,以便它可以调用不同的类(所有类都实现相同的接口)。我需要根据加载DLL时传递给DLL的字符数组来决定调用哪个类。无论我使用哪个类,我调用的方法都是完全相同的。调用DLL时,在类之间切换的最佳方式是什么 // Initialize COM. HRESULT hr = CoInitialize(NULL); // I want to do something like this....but how? if (strcmp(modelType, "

现在我有一个新问题。我正在扩展DLL,以便它可以调用不同的类(所有类都实现相同的接口)。我需要根据加载DLL时传递给DLL的字符数组来决定调用哪个类。无论我使用哪个类,我调用的方法都是完全相同的。调用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++。对我来说,要想继续前进是一个很大的挑战

编辑:我确信有一些非常优雅的方法可以实现这一点(反射?),但请将您的建议限制在易于实现的东西上……这里效率并不重要,可维护性也不是真正的问题

请您这样做:

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
两种选择

因为每个不同的接口实现是一个COOL类,C++代码使用正确的PROG ID/CPLD来执行CREATE.< 或者,公开的coclass是一个工厂,它有一个返回实际实现类的方法

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


(在纯C++实现中,您可以创建自己的COM实例工厂,但这是更先进的COM,而不适用于.NETCOM互操作)。谢谢,这正是我需要的。在C中创建一个工厂是最好的方法(String > CORE映射是逻辑组件的COM组件的一部分),但时间有限,所以快速解决方案获胜。谢谢你的回复,如果我必须再做一次,我会用正确的方式做!