将ISO C类暴露给VB6应用程序

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

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

您的帮助非常感谢!

更新1.阅读您的意见我意识到我需要实现一个COM包装到C类.有没有好的和最近的例子?可以使用MinGW实现COM包装(并避免使用MSVC)吗?

最后,我决定为这个问题提供一个赏金.以下是我想要更好地理解的事情:

我意识到我需要实现一个COM包装到我的C类.有人可以请我提供一个如何为这样一个类做这个工作的例子:

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包装?

要从Visual Basic访问COM C类,您需要以被称为IDL的元语言来指定它的接口.它将被用于生成将由Visual Basic读取的类型库和C中的类框架以实现,例如将调用委托给ValueMapper对象.它是由称为midl.exe的工具完成的.它附带Windows平台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完整的项目,让我知道如果你想看看它.

相关文章
相关标签/搜索