Устаревшее управление ActiveX вызывает функции DLL - мне нужна помощь - PullRequest
2 голосов
/ 01 сентября 2010

Подсказка: это может показаться сложным, потому что я пытаюсь дать как можно больше информации, но я подозреваю, что я просто хочу, чтобы кто-то сказал мне «да, вы правы».

Об этомВ устаревшей системе, которая датируется 2002 годом, пользователь посещает веб-страницу и использует считыватель RFID для считывания номера тега, который затем записывается в поле ввода на веб-странице.

Единственное программное обеспечение, котороепоставляется с ридером - это пользовательская DLL, nop .exe.

Очень скудная документация настаивает на том, чтобы использовалась только MSIE и чтобы была отключена вся безопасность, связанная с ActiveX.

Когда я смотрю на источник веб-страницы, я вижу вызовы функций в DLL.

Теперь вот забавная часть: я знаю об ActiveX, мне нужно внести небольшие изменения в DLL *, но * исходный код VB6 потерян, так что я думаю,что я должен воссоздать (казалось бы, очень простую) DLL с нуля - на этой неделе.

Декомпиляция DLL показывает мне функции (locateReader, getTagVal, closeReader).Однако, из-за декомпиляции я не могу знать ни количество, ни тип параметров, ни возвращаемые значения ... и если кто-то знает API, они отказываются делиться им, но в основном все это, кажется, потеряно в туманевремени, когда компании обанкротились, были куплены и проданы, слиты и разделены, и первоначальная DLL могла быть написана внешним парнем, но никто не знает, кто.

Итак, я могу получить параметры функции и типиз источника страницы ASP?

Я вижу такие вещи, как

Reader = new ActiveXObject("<dllName>.Reader");
Reader.locateReader();
tagVal = Reader.getTagVal();
Reader.closeReader();

Итак, я бы сказал, что ни один из fn () не принимает параметры, что closeReader не должен ничего возвращать;похоже, что locateReader тоже ничего не возвращает, поэтому я предполагаю, что обработка ошибок должна быть в DLL (цикл навсегда с всплывающим окном, требующим присоединения читателя; и getTagVal, похоже, возвращает строку.

Звучит ли это правильно? Любые другие комментарии (кроме уроков, которые нужно выучить)?

1 Ответ

2 голосов
/ 01 сентября 2010

Код, который вы указали здесь, выглядит как прямой вызов устройства.И getTagVal (), кажется, получает значение RFID?Поскольку это вызов COM (Active X), можете ли вы вызвать его в простой программе .net и посмотреть, сможете ли вы получить доступ к читателю?Если вы можете, то вы можете просто обернуть существующий функционал в свою оболочку.

Вам нужно попытаться сгенерировать TLB из компонента:

Итак,если у вас есть только COM dll, вам нужно получить из него idl-файл :

  1. Visual Studio, запустить его и перейти в меню Tools-> OLE / COMПросмотрщик объектов.Это называется oleview.exe и также может быть получено из Windows SDK

  2. В этом приложении выберите meny File-> View Typelib ..

  3. Выберите COM DLL, и вы увидите Typelib.

  4. Выберите меню Файл-> Сохранить как.Сохраните его с соответствующим именем.Например, «mycom.idl»

  5. Запустите midl.exe или mktyplib.exe с идентификатором idl-filname в качестве аргумента."midl mycom.idl"

Прочтите MSDN для получения дополнительной информации о midl и mktyplib

...