كيف يمكنني إرسال أمر إلى برنامج Java قيد التشغيل؟

StackOverflow https://stackoverflow.com/questions/1042705

  •  22-07-2019
  •  | 
  •  

سؤال

لدي برنامج Java وأريد إرسال أمر من تطبيق Win32 الخاص بي.عادة سأستخدم WM_COPYDATA ولكن ما هي الخيارات المتاحة لي مع جافا؟

هل كانت مفيدة؟

المحلول

هناك بعض الطرق للتفاعل بين Java وWindows.مرتبة في القوة والصعوبة:

  • للتعامل مع رسائل النافذة، يمكنك استخدام Jawin - حتى أنه يحتوي على ملف عرض توضيحي لكيفية التعامل مع رسائل النافذة - أو شيئا من هذا القبيل.بالطبع، إذا قمت بربط برنامج Java الخاص بك بمكتبة مثل Jawin، فلن يتم تشغيله أبدًا على جهاز لا يعمل بنظام Windows
  • للتفاعل البسيط بين Win32 وJava، سيكون خياري المفضل هو المقبس المرتبط بالاستماع فقط على المضيف المحلي.قد يكون البروتوكول بسيطًا، لكنني أفضل بروتوكول نص عادي لتسهيل تصحيح الأخطاء.كن على علم بأن اتصال مأخذ التوصيل يمكن أن يتعطل إذا قام المستخدم بإنهاء البرنامج.
  • يمكنك استخدام خدمات الويب (المحلية)، كما هو مقترح في المشاركات الأخرى هنا.على كلا الجانبين تأكد من استخدام مكتبات Webservice/XML الخاصة بك لإنشاء الرسائل وتحليلها، فمن السهل جدًا إنشاء XML تالف إذا قمت بتسلسل السلسلة.
  • يمكنك وضع وظائف برنامج Windows الخاص بك في مكون COM واستخدام جسر Java-to-COM:تعد Jacob أو j-Interop من المكتبات المجانية الشهيرة لهذا الغرض، ويبدو أن j-Integra خيار شائع للشركات ذات الأنظمة القديمة.
  • يمكنك وضع وظائف برنامج Java الخاص بك في مكون COM واستخدام جسر Java-ActiveX الخاص بشركة Sun.من تجربتي الشخصية، هذا خيار محرج إلى حد ما:لقد توقف تطوير جسر Java-ActiveX منذ الإصدار 1.4، ويؤدي تثبيت ActiveX إلى تثبيت مكون Java الخاص بك في مكان ما في دليل JRE كما أن تصحيح أخطاء مكونات Java داخل حاوية ActiveX أمر مرهق إلى حد ما.

ملاحظة جانبية: إذا كنت تتعامل مع سلاسل على كلا الجانبين، فضع في الاعتبار دائمًا أن Java تتعامل مع السلاسل كشيء مختلف تمامًا عن مصفوفات البايت.خاصة إذا كنت تستخدم سلاسل Windows ANSI، فاعلم أن الأحرف 81 و8D و8F و90 و9D محددة على أنها غير محددة في صفحة الرموز Windows-1252، وبالتالي ستنتج Java علامات استفهام أو استثناءات إذا كانت سلاسل Windows الخاصة بك تحتوي على هذه العناصر.لذلك، إذا كان ذلك ممكنًا، استخدم سلاسل WChar على جانب Windows أو قم بتقييد نفسك بالأحرف الآمنة.

نصائح أخرى

سوف تحتاج إلى إنشاء خادم شبكة، كما هو موضح في J16 SDiZ.

  • إحدى الطرق البسيطة هي الاستخدام XML-RPC.توجد مكتبات جاهزة للغة Java وأي لغة أخرى تقريبًا، والأمر بسيط.نحن نستخدمها في التطبيق لدينا.ولكن في الحقيقة، أي بروتوكول شبكة سيفي بالغرض.
  • في الحالات البسيطة جدًا، يمكنك أيضًا إنشاء ملف واستقصائه من جانب Java.
  • يمكنك أيضًا استخدام توجيهات الإخراج المسماة: http://www.coderanch.com/t/328057/Java-جنرال-advanced/java/Use-Named-Pipe-IPC-between
  • ثم هناك أيضا جمهورية جزر مارشال, ، ولكن ربما يكون هذا مبالغة في غرضك (البسيط).أخيرًا، يمكنك استخدام JNI للوصول مباشرة إلى آلية الاتصال الأصلية لـ Window.

أنا شخصياً سأستخدم XML-RPC أو بعض البروتوكولات القياسية البسيطة الأخرى.

لا، لا يمكنك.

لديك لإنشاء ملقم الشبكة والاستماع إلى مأخذ (المحلي). أو، بدلا من ذلك، استخدم JNI.

تطبق Java وwin32 bith الكثير من نفس التقنيات، لذا فإن التواصل بين التطبيقين ليس أمرًا مستحيلًا، يحتاج المرء فقط إلى اختيار وسيلة نقل وبروتوكول مشترك لكلا التطبيقين.

بعض الخيارات:

  1. قم بإنشاء اتصال TCP بين العمليات وأرسل الحزم إلى واجهة الاسترجاع.
  2. استخدم أي شيء يحتوي عليه جافا للتشغيل المتداخل للكود الأصلي (JNI؟) للاشتراك في الرسائل المخصصة (بمعنى الكلمة win32)
  3. باستخدام التعليمات البرمجية الأصلية، قم بإنشاء أنبوب مسمى بين العمليتين
  4. القراءة/الكتابة إلى ملف نصي (ليست الفكرة الأفضل)

أتمنى أن يساعدك هذا

يمكنك استخدام تدفقات الإدخال/الإخراج لسطر الأوامر لإرسال الأوامر واسترداد الإجابات:

  • System.in ملفوفة في BufferedReader والاتصال readLine()
  • System.out.println() لكتابة الردود

أعتقد أن Win32 لديه طرق لالتقاط تدفقات الإدخال/الإخراج للتطبيق الذي تبدأه.

في الأساس نظام التشغيل Windows المكافئ لطريقة نظام Linux للأنابيب:

ls | grep java
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top