Хорошо, название немного запутанно.
Что у меня есть: у меня есть программа M, которую я не могу изменить. У меня есть только возможность сделать некоторые скрипты и добавить доступ к общим объектам (DLL).
Теперь я хочу сделать некоторые сумасшедшие вещи с данными в M. Сценарий lnaguage недостаточен для моих нужд, и я не хочу делать все в DLL (мало опыта в C (++),...).
Моя мысль заключалась в создании DLL (позволяет называть его B для моста), который должен быть вставлен в некоторый код клея в M. Теперь пользовательское приложение A (в моем случае, написанное в java) должно подключиться к B. Теперь взаимодействие должно быть возможно подключить M с A throug B.
Я просто попытался связать эти вещи в примерной системе под Linux. Здесь я сталкиваюсь с проблемой, что библиотека не передает необходимую информацию.
Я имею для тестирования два java-экземпляра, называемых J1 и J2. J1 зарегистрировал функцию обратного вызова в SO. Выполнение обратного вызова из J1 (J1 → SO → J1) работает. Попытка запуска через J2 не работает: кажется, J1 не зарегистрирован. Вместо этого J2 получает registeresd. (см. источники)
Посмотрев в сети, я обнаружил:
Код проверки библиотеки: http://pastebin.com/bFUbwE68
Код Java: http://pastebin.com/zpecisVN
Что бы вы сделали, чтобы получить данные от M до A и некоторые данные от A до M (частые опросы от M в порядке)?
Изменение: Долгосрочная цель - запустить M + B на виртуализированной машине win, а A - через сеть.
Лучше ли разрабатывать DLL-часть непосредственно под Win, а не под Linux и позже портировать?
Вы можете использовать систему обмена сообщениями, такую как IBM MQ Series, для публикации и получения сообщений между двумя приложениями. JAVA JMS (Java Messaging System) упростит подключение к поставщику сообщений.
Я, вероятно, начну с Java Native Access, если это не сработает, я могу посмотреть на JNI. Если бы это не сработало, я бы, вероятно, попробовал Apache Thrift. Если он все еще не работает, я бы, вероятно, попробовал omniORB или вообще любой другой C++ ORB. К сожалению, вы не можете использовать Windows DLL непосредственно в Linux, как это (Windows DLL не являются перекрестной платформой). Если вы необычайно талантливы и терпеливы, вы можете заставить его работать под эмуляцией Wine. В противном случае вам понадобится использовать механизм RPC, такой как Thrift или CORBA, или вы можете написать свой собственный проводной протокол (это может показаться хорошей идеей, но, вероятно, это не так), для подключения между вашей машиной Windows и Linux.
для java вы можете использовать простой класс переменных, который инициализирует все переменные и создает концепцию одноэлементного объекта, вы можете сделать глобальные переменные доступными для других файлов в конкретном проекте