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

ezp*_*sso 9 c++ vb6 com class

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

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

非常感谢您的帮助!

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

更新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;
};
Run Code Online (Sandbox Code Playgroud)

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

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

jsz*_*ski 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
};
Run Code Online (Sandbox Code Playgroud)

现在,您可以通过从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完整项目,请告诉我您是否想要查看它.


Nem*_*vic 5

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

1)在类中编写COM包装器并直接从VB6访问它.

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

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

  • @ezpresso:这取决于你更舒服的东西.实际上,如果您使用的是MingW,那么编写COM组件可能并不简单. (4认同)