将ISO C ++类公开给VB6应用程序

时间:2011-04-07 13:34:46

标签: c++ class com vb6

我开发了一个C ++类来访问USB上的软件保护加密狗。 C ++类是用Linux下的g ++开发的,但我可以在Windows下使用MinGW成功编译它。我有一个用VB6(Visual Basic 6)构建的科学应用程序。

问题是如何将我的C ++类暴露给VB6应用程序?有什么可能的方法呢?我需要使用COM吗? (好吧,“微软少”的解决方案更可取:)

非常感谢您的帮助!

更新1。阅读您的评论我意识到我需要为C ++类实现一个COM包装器。周围有什么好的和最近的例子吗?我可以使用MinGW实现COM包装器(并避免使用MSVC)吗?

更新2。最后,我决定为这个问题提供赏金。以下是我想要更好理解的内容:

1。我意识到我需要为我的C ++类实现一个COM包装器。有人可以提供一些工作示例,说明如何为这样的课程制作这个:

class ValueMapper
{
public:
    ValueMapper( ) { }

    ValueMapper( double fmin, double fmax, int ilength ) {
        SetMapping( fmin, fmax, ilength );
    }

    inline double GetMin() { return min; }
    inline double GetMax() { return max; }
    inline int GetLength() { return length; }

    virtual inline void SetMapping( double fmin, double fmax, int ilength )
    {
        min = fmin;
        max = fmax;
        length = ilength;
    }

    virtual inline int MapValue( double value ) {
        double factor = length / (max - min);
        return (int)RoundTo( (value-min) * factor );
    }

    static double RoundTo( double value, double eps = 1 ) {
        return floor(value/eps + 0.5) * eps;
    }

protected:
    double  min;
    double  max;
    int     length;
};

2. 如何使用VB6生成的COM包装器?我是否需要注册COM服务器?我可以在没有注册的情况下使用吗?

3。可选。是否可以使用MinGW实现COM包装?

2 个答案:

答案 0 :(得分:8)

要从Visual Basic访问COM C ++类,您需要使用称为IDL的元语言指定其接口。它将用于生成将由Visual Basic读取的类型库和C ++中的类骨架,以实现,例如将调用委托给ValueMapper对象。它由名为midl.exe的工具完成。它随Windows Platform SDK或任何VC ++环境一起提供。如果您没有自己的,可以免费下载VC ++ 10 Express Edition。

您对象的IDL文件可能如下所示:

import "oaidl.idl"; 
[
 uuid(C6907FD4-9F56-499A-A784-6168AB3352D6),
 version(1.0),
 local,
 oleautomation
]
interface IValueMapper : IDispatch
{
  [id(1), propget] double Min();
  [id(2),propget] double Max();
  [id(3),propget] int Length();
  [id(4)] void SetMapping( [in] double fmin, [in] double fmax, [in] int ilength );
  [id(5)] int MapValue([in] double value);
  [id(6)] double RoundTo( [in] double value,[in,defaultvalue(1)] double eps );
};

[
  uuid(1C110E43-A56F-41A2-8052-EF85FF96082F),
  version(1.0),
  helpstring("Value Mapper Library"),
] library ValueMapperLib
{
  importlib("stdole32.tlb");
  interface IValueMapper;
  [
  uuid(D1A2F830-994E-4495-A9C3-1440155578A9),
  helpstring("Value Mapper Component Class")
  ] 
  coclass ValueMapperClassObject
  {
    [default] interface IValueMapper;
  }; //end coclass def
};

现在,您可以通过从IValueMapper派生类并使用ValueMapper成员实现其功能来提供所需的功能。不幸的是,您还需要提供一些样板代码来实现类对象,IUnknown和IDispatch接口以及DLL注册代码。您可以在互联网上找到相关的代码片段,例如:

http://www.dcl.hpi.uni-potsdam.de/LV/Components04/VL5/MSDN/DrGUI-on-COM.html http://www.codeproject.com/KB/COM/simplecomserver.aspx

此外,我已经组装了一个实现此接口的VC ++ 10完整项目,请告诉我您是否想要查看它。

答案 1 :(得分:5)

我知道有两种可能的方式:

1)在你的类周围编写一个COM包装器,直接从VB6访问它。

2)创建一个类的C接口(通过“展平它”)并在一个普通的DLL中公开它。

前一种方法比较常见,但听起来你可能更喜欢后者。