Итак, я прорыл ТОННЫ копаний, и это похоже на поиски динозавров. Не легко и трудно найти. Я закончу тем, что напишу немного, как это сделать, а пока я опубликую свои выводы. Хотя у меня все еще нет этого на 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