2012-12-27 2 views
0

Итак, я работаю несколько месяцев на OPOS-драйвере для нескольких разных вещей. Я не создавал проект, но я взял его и стал единственным, кто его разрабатывал. Поэтому сегодня мне стало любопытно, как это было сделано, и я думаю, что это, возможно, началось с неправильной ноги. Я должен был немного поработать, чтобы узнать, что он использует драйверы OPOS от компании MCS (Monroe Consulting Services), которую я загрузил 1.13 и установил версию MSI. Я запустил VS, создав новую dll mfc. Затем я пошел добавить класс. Здесь я смущен.MFC add Typelib или ActiveX для OPOS

Не имеет значения, если я выбираю Typelib или ActiveX, он обычно дает мне тот же список интерфейсов, который я могу добавить/продлить (с одним исключением, которое приходит в голову с MSR, у него есть интерфейс событий, который я могу расширить) И оба они делают один и тот же заголовочный файл (в случае с msr это COPOSMSR.h), но один расширяет CCmdTarget, а другой расширяет CWnd. Это мой первый вопрос. какой я должен выбрать? что такое typelib/что такое компонент ActiveX и как они отличаются друг от друга.

Тот, над которым я работал, расширяет CCmdTarget. Для жизни я не могу понять, как водитель знает, использовать один из файлов (USNMSRRFID), но именно там и началась вся разработка. (Я разбил его немного, так что это был не только один огромный файл). Но этот файл не расширяет COPOSMSR .. он также расширяет CCmdTarget. Единственный раз, когда я вижу что-либо, упоминает файл USN в MSRRFID.idl (что меня еще больше смущает). У кого-то есть ясность для этого?

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

Любые советы или указатели ??? Извините, если это вопрос newb .. но я новичок в C++. Я начал с Java, а затем перешел на C#, поэтому некоторые из этих вещей - это ПУТЬ над моей головой.

ответ

1

Хорошо, поэтому я сделал TONS копания, и это похоже на поиск динозавров. Нелегко и трудно найти. В конце концов, я напишу немного о том, как это сделать, но пока я выложу свои выводы. Хотя у меня все еще нет этого 100%, я знаю, что я близок.

Оказывается, тип typelib и activeX не вызывает большого беспокойства, но вступают в игру после того, как вы начали работу. ActiveX предназначен для объектов Control, а Typelib - для объекта службы. Самое главное - начать правильно. Я нашел статью на каком-нибудь китайском веб-сайте, который предлагает советы по ОК после выяснения ошибок перевода. Для начала вам нужно создать проект C++ с помощью Automation. Это может быть ATL или MFC. Мое предпочтение - MFC. В UPOS 1.13 pdf (или новее) в разделе 8 приложения A описываются обязанности объекта Service. В нем есть основные методы, которые необходимо реализовать. Есть 16 методов, которые вы должны добавить, и как минимум 4 метода, которые получают/устанавливают свойства вашего устройства OPOS.

Чтобы начать работу, вам нужно будет открыть мастер добавления классов (для классов MFC) и нажать Добавить класс MFC. Вы хотите, чтобы ваш базовый класс был CCmdTarget. Придумайте классное имя класса (я выбрал PinpadSOCPP). Затем в переключателях автоматизации выберите Creatable по типу ID. Он должен заполнить ваш идентификатор типа как [Название проекта]. [Имя класса], так что мой был PinpadSO.PinpadSOCPP. хит конец. Это делает приятный файл интерфейса, который вы можете использовать в представлении класса для добавления методов и т. Д.

Что касается добавления методов, здесь есть 2 вещи, и один из них я еще не понял 100%. Во-первых, вы должны реализовать все методы в этом разделе с правильными параметрами и возвращаемыми значениями.Большинство из них возвращают LONG (32-значный номер подписки). и двумя наиболее распространенными параметрами являются LONG и BSTR. (есть временные указатели на то, когда у вас есть параметры «out»). Это та часть, которая, как я думаю, в настоящее время терпит неудачу, поскольку я не знаю, правильно ли я их правильно реализовал, и поэтому я получаю ошибку 104/305 (что из китайской статьи гласит, что у меня что-то не хватает из моих методов). Я не уверен, что это чувствительно к регистру, и я не уверен в 7 свойствах, которые выглядят необходимыми, чтобы получить/установить, какие из них нужны который будет реализован, потому что MSR SO, над которым я работаю, не использует их всех и что SO работает. Другое дело, что после внедрения базовых методов OPOS вам также необходимо реализовать дополнительные методы с вашего конкретного устройства OPOS. Поскольку я делаю PINPad, есть 6 дополнительных методов, которые я должен реализовать.

Теперь это много трудоемкая работа, потому что вам нужно открыть представление класса, перейти к имени вашего класса проекта. Разверните его и перейдите в раздел Интерфейс. Мое имя проекта - PinpadSO, а файл, который я им реализую, - это PinpadSOCPP (что означает имя интерфейса IPinpadSOCPP), щелкните правой кнопкой мыши на IPinpadSOCPP и нажмите «Добавить»> «Добавить метод». Это приведет вас к двухэтапному процессу. Вы заполняете свое возвращаемое значение, имя своей функции, добавляете все ваши параметры. Нажмите «Далее» и заполните некоторую информацию справки (если хотите) и нажмите «Готово». Теперь, после того, как вы делаете это 20 раз, он становится старым и медленным ... и если вы похожи на меня, вы набираете «Компьютер» вместо «Вычислить» и «переворачивать» на флопе, или забываете нажимать на все ваши параметры. Человек мог бы сделать небольшую небольшую программу для редактирования трех файлов, которые меняются каждый раз, когда вы добавляете метод, и это значительно ускорит его. Если вы допустили ошибку, вам нужно будет открыть [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 SO, поэтому я сделал ключ под названием PINPad (проверьте свой документ UPOS, чтобы узнать, какое имя вы должны ему дать). Наконец, выберите имя для своего устройства. Я выбрал тип модели от поставщика как имя моего устройства (C100) и сделал дополнительный ключ в PINPad. Значение REG_SZ по умолчанию должно быть зарегистрированным типом SO-устройства SO. в моем случае это PinpadSO.PinpadSOCPP

, если у вас нет тестовой программы OPOS (которую я только что сделал своей консольной программой), тогда вы можете использовать тестовое приложение Microsoft OPOS (я не смог его получить работать на моей машине x64 ... но, возможно, вам повезет с ней). Если вы решите сделать свое собственное тестовое приложение OPOS, убедитесь, что вы скомпилируете его для компьютеров x86 (даже если у вас есть x64) OPOS не нравится x64 по какой-то причине (вероятно, длина указателей я бы предположила) .. во всяком случае. После того, как вы получили все настройки, запустите тестовое приложение (для моего случая я просто запускаю и надеюсь на 0 :)

Я в настоящее время получаю 104 (E_NOSERVICE) .. и, как я сказал, прежде чем я думаю, что это потому, что я не все мои методы правильные. Если это будет так, я отредактирую этот ответ, иначе я отчитаюсь и скажу, что это было на самом деле. Anywho, я надеюсь, что это поможет кому-то еще, кто решит, что они хотят сделать свой собственный SO. Успехов

UPDATE

OPOS проверяет несколько свойств при вызове команды Открыть. Одним из свойств, которые необходимо реализовать, является значение в поле GetPropertyNumber, и оно равно PIDX_ServiceObjectVersion. Вам нужно будет установить этот номер, чтобы вернуться (1000000 * majorVersion) + (1000 * minorVersion) + revision, так как я делаю OPOS 1,13 совместимый SO мой вернулся ServiceObjectVersion является 1013000. Вы также хотите реализовать 3 свойства в GetPropertyString:

  • PIDX_DeviceDescription
  • PIDX_DeviceName
  • PIDX_ServiceObjectDescription

Для всех других значений вы можете вернуть пустую строку или 0 до тех пор, пока не начнете перехватывать все эти вещи.

В качестве побочного примечания, если вы не хотите делать это на C++, вам не нужно. Вы можете сделать это на любом языке, на котором вы можете написать объект ActiveX (например, библиотеку классов .NET, видимую COM)