Реализовать интерфейс COM C ++ / VC ++ 6.0 / MFC - PullRequest
2 голосов
/ 06 июля 2011

Программист начального уровня пытается реализовать интерфейс COM.Я работаю над программой, которая взаимодействует с системой точек продаж Aloha.Aloha использует COM для работы с внешними программами.Я пытаюсь перехватить данные карты из устройства чтения магнитных карт, которое является считывателем OPOS, а не клавиатурным клином.Документация, которую я имею, не объясняет, как реализовать этот конкретный интерфейс, но она объясняет, как реализовать подобный интерфейс.Я пытался последовать этому примеру, но я никуда не попал.Поддержка от Aloha отсутствует, их документация плохая, устаревшая и иногда просто неправильная, хотя я заплатил за лицензию.

Я пытался создать простое приложение, чтобы протестировать эту функциональность.Вот что я сделал:

1) создайте новый проект в vc ++ 6.0 с помощью мастера приложений ATL COM 2) тип сервера dll 3) вставьте новый объект atl -> простой объект 4) щелкните правой кнопкой мыши на моем новом классе ивыберите интерфейс реализации 5) найдите библиотеку типов, выберите Iber.tlb (tlb Алохи) 6) выберите интерфейс, который я хочу реализовать

Это позволило создать файл .h, .cpp и .rgs.

.h файл имеет:

public:
// IInterceptMagcard
    STDMETHOD(InterceptMagcard)(BSTR bstrAccountNumber, BSTR bstrCustomerName, BSTR bstrExpirationDate, BSTR bstrTrack1Info, BSTR bstrTrack2Info, BSTR bstrTrack3Info, BSTR bstrRawMagcardData, LONG * bWasDataHandled)
    {
        if (bWasDataHandled == NULL)
            return E_POINTER;

        return E_NOTIMPL;
    }

Это где я реализую свой код?Я положил туда некоторый тестовый код, чтобы записать его в текстовый файл, просто чтобы проверить его.Затем я использовал:

HRESULT hr = CoCreateInstance(CLSID_AlohaMag, NULL, CLSCTX_INPROC_SERVER,
                                IID_IAlohaMag, (void **) &g_pIInterceptMagcard);

, где g_pIInterceptMagcard - указатель на мой класс интерфейса, созданный с помощью мастера выше.

Когда я пытаюсь зарегистрироваться, я получаю следующий HRESULT: 0x80040112 То есть "класс"не лицензирован для использования. "

Означает ли это, что моя программа не сделала необходимые записи в реестре?

1 Ответ

1 голос
/ 07 июля 2011

Это, вероятно, означает, что необходимо установить лицензию, прежде чем их фабрика пользовательских классов создаст экземпляр класса. Вы пытались запустить свою программу на полностью работающей системе POS с лицензией на использование магнитной карты? Может быть, есть какая-то другая лицензия, которая вам нужна для подобных вещей?

Если бы проблема была в том, что класс не был зарегистрирован, результатом было бы "класс не зарегистрирован". Похоже, что вы выполнили необходимые шаги с помощью мастера, чтобы реализовать интерфейс и сгенерировать правильные записи реестра.

...