MFC добавляет Typelib или ActiveX для OPOS

Итак, на работе я несколько месяцев работал над драйвером 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#, так что некоторые из этих вещей НАМНОГО выше моей головы....


person Robert Snyder    schedule 27.12.2012    source источник


Ответы (1)


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

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

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

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

Теперь это трудоемкая работа, потому что вам нужно открыть представление класса, перейти к названию класса вашего проекта. Разверните его и перейдите в раздел «Интерфейс». Имя моего проекта — PinpadSO, а файл, в котором я это реализую, — PinpadSOCPP (что означает, что имя интерфейса — IPinpadSOCPP), щелкните правой кнопкой мыши IPinpadSOCPP и выберите «Добавить»> «Добавить метод». Это подводит вас к двухэтапному процессу. Вы вводите возвращаемое значение, имя своей функции, добавляете все свои параметры. Нажмите «Далее», введите некоторую информацию о строке справки (если хотите) и нажмите «Готово». Теперь, после того, как вы сделаете это более 20 раз, он станет старым и медленным ... и если вы похожи на меня, вы вводите «Компьютер» вместо «Вычислительные» и триггерные буквы или забываете нажать «Добавить» во всех своих параметрах. Кто-то мог бы написать небольшую симпатичную программу для редактирования трех файлов, которые изменяются каждый раз, когда вы добавляете метод, и это значительно ускорит ее. Если вы допустили ошибку, вам нужно будет открыть [project name].idl, [class name].h и [class name].cpp — это 3 файла, в которые напрямую добавляются методы. Рекомендую не ошибиться.

так что теперь, когда вся эта тяжелая работа в стороне. Скомпилируйте свою программу. Если вы хотите избавить себя от дополнительного шага, вы можете включить автоматическую регистрацию в настройках проекта компоновщика (ПРИМЕЧАНИЕ: если вы сделаете это, вам нужно будет запустить Visual Studio от имени администратора, если вы программируете в Vista или выше), это спасет вас необходимости открывать командное окно (администратор), перейти к вашей 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).. и, как я уже говорил, я думаю, что это потому, что у меня не все мои методы правильные. Если это окажется так, я отредактирую этот ответ или отчитаюсь и скажу, что это было на самом деле. В любом случае, я надеюсь, что это поможет любому, кто решит, что хочет сделать свой собственный SO. Удачи

ОБНОВЛЕНИЕ

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

  • PIDX_DeviceDescription
  • PIDX_DeviceName
  • PIDX_ServiceObjectDescription

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

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

person Robert Snyder    schedule 01.01.2013