代码之家  ›  专栏  ›  技术社区  ›  Alex

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

  •  1
  • Alex  · 技术社区  · 16 年前

    在我的所有StAccExpRead兄弟的帮助下,我成功地创建了一个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++。刚开始通信对我来说是一个很大的挑战。

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

    2 回复  |  直到 16 年前
        1
  •  2
  •   sharptooth    16 年前

    请这样做:

    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
    
        2
  •  1
  •   Richard    16 年前

    两种选择。

    因为每个不同的接口实现都是一个类,并且C++代码使用正确的PROG ID/CPLD来执行创建。

    另外,公开的组件类是一个工厂,它具有返回实际实现类的方法。

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

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