سؤال

أنا مهتم بالاتصال سوكس, ، تطبيق وحدة تحكم مفتوح المصدر، من برنامج Windows GUI آخر (مكتوب بلغة دلفي بشكل طبيعي).بدلاً من التعامل مع كشط وإخفاء نافذة وحدة التحكم، أود فقط تحويل التطبيق إلى ملف DLL يمكنني الاتصال به من تطبيقي.

قبل أن أبدأ في هذا المسار، أشعر بالفضول حول مقدار العمل الذي يجب أن أتوقع القيام به؟هل نتحدث عن مشروع كبير أم أن هناك حلاً مباشرًا؟أعرف بعض لغة C، لكني لست خبيرًا بأي حال من الأحوال.

لا أتوقع تفاصيل محددة لـ SoX، فقط تحويل تطبيق وحدة التحكم EXE إلى DLL بشكل عام.إذا كان شخص ما على دراية بـ SoX، فهذا أفضل.

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

المحلول

بالنسبة للموضوع المحدد المتمثل في تحويل وحدة التحكم القابلة للتنفيذ إلى مكتبة عن طريق تعديل كود مصدر C، فإن ذلك يعتمد على كيفية تحليل تطبيق سطر الأوامر.إذا تمت كتابته بطريقة يتم من خلالها توجيه الإدخال/الإخراج من خلال مجموعة صغيرة من الوظائف أو حتى مؤشرات وظيفية أفضل، فمن الواضح أنه سيكون تافهًا.

إذا تم كل ذلك باستخدام printf وscanf والأصدقاء، فمن الأفضل أن تبحث عن/إنشاء ملف تضمين يتضمن جميع الملفات المصدر وإضافة ماكرو يعيد توجيه printf/scanf والأصدقاء إلى وظائفك المكتوبة بحيث تكون قابلة لتنفيذ DLL.يمكن إنشاء أشياء مثل printf من vsnprintf (استخدم الإصدار n للأمان)، لذلك لا تحتاج إلى إعادة تنفيذ النظام الفرعي للإدخال/الإخراج C RTL بالكامل.ومع ذلك، لا يوجد vsscanf، ولكن هناك تطبيقات تابعة لجهات خارجية على الويب.

إذا كان الرمز يستخدم fprintf، fscanf، وما إلى ذلك.لتمكين الاتصال غير المباشر بين الملفات ووحدة التحكم، فأنت لا تزال غير محظوظ.بنية FILE غير شفافة، وعلى عكس ملفات Pascal النصية، لا يمكن تنفيذ برنامج تشغيل ملف نصي محمول.ربما لا يزال ذلك ممكنًا إذا قمت بالتنقيب في C RTL الخاص بك، ولكن من الأفضل أن ننصحك بالسير في مسار الماكرو وإعادة تنفيذ نوع FILE المعاد تسميته.

أخيرًا، أصبح أسلوب "popen()" ممكنًا في دلفي وأصبح أسهل إلى حد ما في دلفي 2009 باستخدام فئتي TTextReader وTTextWriter.قم بدمجها مع TFileStream الملتف حول الأنابيب، وحدد الأنابيب للإدخال القياسي والإخراج القياسي والخطأ القياسي في العملية الجديدة وSTARTF_USESTDHANDLES وما إلى ذلك، وسوف تعمل.إذا كنت لا ترغب في كتابة ما تريده بنفسك، فهناك معادلات/عينات من جهات خارجية على الويب لـ Delphi أيضًا. هنا واحد.

نصائح أخرى

في نظام التشغيل Windows، ما عليك سوى الاتصال عمليه الخلق مع سطر الأوامر SoX.لا أعرف روابط دلفي لـ Win32، لكنني فعلت هذا الشيء بالضبط في كل من Win32 وC#.

والآن بعد أن عرفت أن CreateProcess هو ما تريد تسميته، فإن البحث في Google حول كيفية القيام بذلك من دلفي من شأنه أن يوفر لك كل التعليمات البرمجية التي تحتاجها.

مقالة ركن دلفي - استخدام CreateProcess لتنفيذ البرامج

استدعاء CreateProcess() بطريقة سهلة

قد لا تحتاج حتى إلى ملف DLL، يمكنك استخدام ملف بوبين () وظيفة لتشغيل تطبيق وحدة التحكم وجمع أي نص الإخراج.

تنصل:لا أعرف شيئًا عن SoX.ربما تم تصميم الكود لتسهيل الأمر، أو قد يكون أكثر صعوبة.وفي كلتا الحالتين، فإن العملية هي نفسها:

تريد أولاً العثور على الوظائف الموجودة في تطبيق SoX التي تريد الاتصال بها.على الأرجح، يحتوي تطبيق وحدة التحكم على رمز لتحليل سطر الأوامر واستدعاء الوظائف المناسبة.لذا، أولاً، ابحث عن الوظائف التي تريد استخدامها.

بعد ذلك، تحقق من المعلومات المتعلقة بتصدير الوظائف في مكتبات DLL من لغة C على هذا الموقع: إنشاء واستخدام ملفات DLL

بعد ذلك، أنشئ ملف تعريف جديد أو ملف مشروع استوديو مرئي بحيث يكون الهدف ملف DLL، وأضف الملفات المصدرية من برنامج SoX الذي قمت بتعديله ليتم تصديره.

قم بتشغيل العملية بالطريقة التي نصح بها Indiv والتقط المخرجات كما أظهرها آدم.

ومع ذلك، إذا كنت لا تزال ترغب في إجراء تحويل DLL، فهذا سيساعدك على البدء

  1. قم بتكوين SOX لنظام التشغيل Windows وقم بتجميعه
  2. قم بإنشاء مشروع DLL فارغ باستخدام أداة C++ الخاصة بك
  3. أضف ملفات SOX لتكون جزءًا من المشروع
  4. أضف وظيفة جديدة تسمى DLLMain

    Bool Apientry dllmain (Handle Hmodule ، dword ul_reason_for_call ، lpvoid) {return true ؛}

  5. أضف ملف .DEF (استخدم اسم المشروع كاسم ملف) الذي يسرد عمليات التصدير في DLL - أضف المحتوى التالي إليه

    LIBRARY      "name.DLL" 
    

    صادرات

    اتصل بـOldMain الخاص

  6. إعادة تسمية SOX الرئيسي باسم CallOldMain

  7. اكتب وظيفة مخصصة لتسجيل خطأ الإخراج/الإرجاع وما إلى ذلك.

  8. ابحث عن جميع printfs / cout في تطبيق SOX واستبدله باستدعاءات لوظيفتك المخصصة أعلاه

  9. بمجرد تجميع ملف DLL، يمكنك الآن استدعاء الدالة CallOldMain بنفس المعلمات التي تتوقعها برامج C الرئيسية.يمكنك تعديل هذا التوقيع لإرجاع الأخطاء/المخرجات من الأعلى.

لم تذكر ما هي سلسلة الأدوات الخاصة بك، ولكن إذا قمت بتكوين gcc في Windows، فيمكنك استخدام config;make;make install العادي لتجميع sox فقط.في هذه العملية، سيتم إنشاء ملف dll وتطبيق وحدة التحكم.أو يمكنك فقط تحديد هدف الإنشاء لإنشاء ملف dll فقط.سيؤدي هذا إلى تجميع مكتبة Windows الأصلية التي تعتمد فقط على ملف MS Runtime dll، ويمكنك استخدام هذا في تطبيقك الخاص.

يمكنك تنفيذ تطبيق وحدة التحكم والتقاط مخرجاته باستخدام الأنابيب.يمكنك استخدام جانب واحد من الأنبوب باعتباره stdout لـ CreateProcess وتقرأ من الجانب الآخر كملف مشترك.

يمكنك رؤية مثال عملي مكتوب بلغة دلفي هنا: http://delphi.about.com/cs/adptips2001/a/bltip0201_2.htm

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