Предоставление класса ISO C ++ для приложения VB6 - PullRequest
9 голосов
/ 07 апреля 2011

Я разработал класс C ++ для доступа к защитному ключу программного обеспечения по USB.Класс C ++ был разработан с g ++ под Linux, но я могу успешно скомпилировать его, используя MinGW под Windows.У меня есть научное приложение, созданное с использованием VB6 (Visual Basic 6).

Вопрос в том, как я могу представить свой класс C ++ приложению VB6?Каковы возможные способы сделать это?Нужно ли использовать COM?(Что ж, решение «без Microsoft» более предпочтительно:)

Ваша помощь очень ценится!

Обновление 1. Читая ваши комментарии, я понял, что мне нужнореализовать оболочку COM для класса C ++.Есть ли хорошие и свежие примеры вокруг?Могу ли я реализовать оболочку COM, используя MinGW (и избегая MSVC)?

Обновление 2. Наконец, я решил предложить вознаграждение за этот вопрос.Ниже приведены вещи, которые я хотел бы понять лучше:

1. Я понял, что мне нужно реализовать оболочку 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. Как использовать получившуюся оболочку COM из VB6?Нужно ли регистрировать COM-сервер или около того?Могу ли я использовать его без регистрации?

3. Дополнительно.Можно ли реализовать оболочку COM с помощью MinGW?

Ответы [ 2 ]

8 голосов
/ 30 мая 2011

Чтобы получить доступ к классу COM C ++ из Visual Basic, вам необходимо указать его интерфейс на метаязыке, известном как 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-на-COM.html http://www.codeproject.com/KB/COM/simplecomserver.aspx

Также я собрал полный проект VC ++ 10, который реализует этот интерфейс, поэтому дайте мне знать, если вы хотите взглянуть на него.

5 голосов
/ 07 апреля 2011

Мне известно о двух возможных путях:

1) Напишите COM-оболочку для вашего класса и получите к ней доступ непосредственно из VB6.

2) Создайте интерфейс C вашего класса («сплющив его») и представьте его в простой DLL.

Первый подход более распространен, но, похоже, вы предпочитаете второй.

...