Поэтому на работе я несколько месяцев работал над драйвером OPOS для нескольких разных вещей. Я не создавал проект, но я взял его на себя и единственный, кто его разрабатывает. Поэтому сегодня мне стало интересно, как это было сделано, и я думаю, что это могло начаться не с той ноги. Мне пришлось немного покопаться, чтобы выяснить, что он использует драйверы OPOS от компании MCS (Monroe Consulting Services). Я скачал 1.13 и установил версию MSI. Я загорелся VS создал новую MFC DLL. Затем я пошел, чтобы добавить класс. Это где я запутался.
Неважно, если я выберу Typelib или ActiveX, он обычно дает мне тот же список интерфейсов, из которого я могу добавлять / расширять (с одним исключением, которое приходит на ум с MSR, у него есть интерфейс событий, который я могу расширять) И они оба создайте тот же заголовочный файл (в случае с msr это COPOSMSR.h), но один расширяет CCmdTarget, а другой расширяет CWnd. Это мой первый вопрос. какой я должен выбрать? что такое typelib / что такое компонент ActiveX и как они отличаются друг от друга.
Тот, над которым я работал, расширяет CCmdTarget. Из жизни я не могу понять, как драйвер знает, как использовать один из файлов (USNMSRRFID), но именно здесь и началась вся разработка. (Я немного разбил его, чтобы он был не просто одним огромным файлом) Но этот файл не расширяет COPOSMSR … он также расширяет CCmdTarget. Единственный раз, когда я вижу что-то, упоминающее файл USN, находится в MSRRFID.idl (что еще больше смущает меня). У кого-нибудь есть ясность для этого?
Часть меня думает, что это может оказать очень большое влияние, когда придет время для развертывания. Несколько написанных тестовых приложений, использующих этот драйвер, требуют несколько запутанного процесса установки, который включает в себя регистрацию различных драйверов, копирование файлов в определенную папку, настройку реестра и так далее. Я думаю, что если я смогу понять, что все это значит, и как сделать хорошее приложение, которое должным образом расширяет одно из этих устройств OPOS, то я смогу спасти себя от дальнейшего горя в будущем.
Любые советы или указатели ??? Извините, если это новый вопрос … но я новичок в C ++. Я начал с Java, а затем перешел на C #, поэтому некоторые из этих вещей ПУТИ над моей головой ….
Ну, так что я сделал тонны копать, и это похоже на поиск динозавров. Не легко и трудно найти. Я напишу немного об этом, но сейчас я приведу свои выводы. Хотя у меня все еще нет этих 100%, я знаю, что я близко.
Оказывается, вещи typelib и activeX не представляют большой проблемы, но вступают в игру после того, как вы начали. ActiveX для объектов управления, а Typelib для объекта службы. Самое главное, чтобы начать правильно. На каком-то китайском веб-сайте я обнаружил статью, в которой есть несколько полезных советов после выяснения ошибок перевода. Для начала вам захочется сделать проект C ++ с Automation. Это может быть ATL или MFC. Я предпочитаю MFC. В pdf-версии UPOS 1.13 (или новее) в разделе 8 Приложения A описываются обязанности объекта службы. У него есть основные методы, которые вам нужно реализовать. Есть 16 методов, которые вы должны добавить, и как минимум 4 метода, которые получают / устанавливают свойства для вашего устройства OPOS.
Таким образом, для начала вам нужно открыть мастер добавления классов (для классов MFC) и нажать кнопку Добавить класс MFC. Вы хотите, чтобы ваш базовый класс был CCmdTarget. Придумайте классное имя класса (я выбрал PinpadSOCPP). Затем в переключателях автоматизации выберите Creatable по идентификатору типа. Он должен заполнить ваш идентификатор типа как [Имя проекта]. [Имя класса], так что мой был PinpadSO.PinpadSOCPP. хит финиш. Это создает хороший интерфейсный файл, который вы можете использовать для представления классов и т. Д.
Что касается добавления методов, есть две вещи, которые нужно отметить по этому поводу, и одна из них я еще не разобрался на 100%. Во-первых, вы должны реализовать все методы в этом разделе с правильными параметрами и возвращаемыми значениями. Большинство из них возвращают LONG (32-битное число со знаком). и 2 наиболее распространенных параметра — LONG и BSTR. (есть случайные указатели на то, когда у вас есть «out» параметры). Я думаю, что в данный момент у меня происходит сбой, потому что я не знаю, правильно ли все они реализованы, и именно поэтому я получаю ошибку 104 / 305 (который из китайской статьи говорит, что я что-то упускаю в моих методах) Я не уверен, чувствителен ли он к регистру, и я не уверен в 7 свойствах, для которых нужно получить / установить, какие из них нужны быть реализованным, потому что MSR SO, над которым я работаю с работы, не использует их все, и что SO работает. Другое заключается в том, что после того, как вы реализуете базовые методы OPOS, вы также должны реализовать дополнительные методы с вашего конкретного устройства OPOS. Так как я делаю PINPad, я должен реализовать 6 дополнительных методов.
Теперь это очень трудоемкая работа, потому что вам нужно открыть представление класса, перейти к названию класса вашего проекта. Разверните его и перейдите к разделу Интерфейс. Мой проект называется PinpadSO, а файл, в котором я его реализую, — PinpadSOCPP (что означает имя интерфейса IPinpadSOCPP), щелкните правой кнопкой мыши IPinpadSOCPP и выберите «Добавить»> «Добавить метод». Это приводит вас к двухэтапному процессу. Вы вводите возвращаемое значение, название вашей функции, добавляете все свои параметры. Нажмите «Далее» и заполните некоторую информацию о строке справки (если хотите) и нажмите «Готово». Теперь, после того, как вы сделаете это более 20 раз, оно станет старым и медленным … и, если вы похожи на меня, вы наберете Computer вместо Compute и триггерные буквы или забудете нажать add на все ваши параметры. Человек может создать симпатичную небольшую программу для редактирования 3 файлов, которые меняются каждый раз, когда вы добавляете метод, и это значительно ускоряет его. Если вы допустили ошибку, вам нужно будет открыть [project name].idl
, [class name].h
, а также [class name].cpp
это те 3 файла, которые напрямую добавляют к нему методы. Я рекомендую не ошибиться.
так что теперь, когда вся эта тяжелая работа ушла с пути. Скомпилируйте вашу программу. Если вы хотите сохранить себя как дополнительный шаг, вы можете включить авторегистрацию в настройках проекта компоновщика (ПРИМЕЧАНИЕ: если вы сделаете это, вам нужно будет запустить Visual Studio от имени администратора, если вы программируете в Vista или выше), это спасет вас. необходимости открыть окно командной строки (admin) перейдите к вашей DLL и используйте команду regsvr32 в этой DLL. Приятно то, что вам не нужно делать это снова и снова, только один раз. У меня нет веских фактов, что он работает так каждый раз, но MSR SO, над которым я работаю, внесу в него изменения, скомпилирую его, затем открою программу тестирования OPOS, и изменения вступят в силу.
После этого вам необходимо внести в реестр дополнения. перейдите к HKLM \ software \ OLEforRetail \ ServiceOPOS
(ПРИМЕЧАНИЕ, если у вас есть машина x64, вы сделаете это дважды. Один там, и снова в HKLM \ software \ Wow6432Node \ OLEforRetail \ ServiceOPOS )
Вам нужно будет добавить ключ для любого устройства OPOS, с которым вы работаете. Я делаю пин-ап ТАК, поэтому я сделал ключ с именем PINPad (проверьте документ UPOS, чтобы узнать, какое имя вы должны ему дать) Наконец, выберите имя для своего устройства. Я выбрал тип модели устройства от поставщика в качестве имени моего устройства (C100) и создал дополнительный ключ в PINPad. Значение REG_SZ по умолчанию должно быть вашим зарегистрированным идентификатором типа устройства SO. в моем случае это PinpadSO.PinpadSOCPP
если у вас нет тестовой программы OPOS (которую я только что создал как консольную), то вы можете использовать тестовое приложение Microsoft OPOS (я не смог заставить его работать на моей машине x64 … но, возможно, вы мне повезет больше) Если вы решите создать собственное тестовое приложение OPOS, убедитесь, что вы скомпилировали его для компьютеров с архитектурой x86 (даже если у вас есть x64). OPOS по каким-то причинам не нравится x64 (возможно, длина указателей предположим) .. во всяком случае. После того, как вы все настроите, запустите тестовое приложение (для моего случая я просто запускаю OPOSPinpadClass pin = new OPOSPinpadClass(); Console.WriteLine(pin.Open("C100"));
и надеюсь на 0 🙂
В настоящее время я получаю 104 (E_NOSERVICE) .. и, как я уже говорил ранее, я думаю, что это потому, что у меня не все мои методы правильно. Если это так, я отредактирую этот ответ или сообщу и скажу, что это было на самом деле.
В любом случае, я надеюсь, что это поможет кому-то еще, кто решит, что он хочет сделать свое собственное ПО. Удачи
ОБНОВИТЬ
OPOS проверяет несколько свойств при вызове команды Open. Одним из свойств, которое необходимо реализовать, является в GetPropertyNumber, и это PIDX_ServiceObjectVersion
, Вам нужно будет установить этот номер, чтобы вернуться (1000000 * majorVersion) + (1000 * minorVersion) + revision
так как я делаю SO, совместимый с OPOS 1.13, мой возвращенный ServiceObjectVersion равен 1013000. Вы также захотите реализовать 3 свойства в GetPropertyString:
PIDX_DeviceDescription
PIDX_DeviceName
PIDX_ServiceObjectDescription
Для всех других значений вы можете возвращать пустую строку или 0, пока не начнете подключать все эти вещи.
Как примечание, если вы не хотите делать это в C ++, вам не нужно. Вы можете сделать это на любом языке, на котором вы можете написать объект ActiveX (например, видимая COM библиотека классов .NET)
Других решений пока нет …