سؤال

لقد كتبت برنامجًا بسيطًا يضفي ثلاثة مواقع ثم يتفاعل مع ما إذا كان يمكن الوصول إليه أم لا.

سؤالي هو: هل يمكنني قمع النظام ("Ping")؟ لقد كتبت الكود الخاص بي في C ++ كما أعرف تلك اللغة الأفضل. حاليًا يفتح الرمز ping.exe تشغيل أمر النظام. إذا كان بإمكاني منع الإخراج من الظهور بينما لا يزال ذلك مثاليًا.

سأقوم في النهاية بتشغيل هذا البرنامج في خدمة Windows ولهذا السبب أود قمع نافذة وحدة التحكم في سطر الأوامر بالإضافة إلى قمع إخراج Ping. شكرًا.

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

المحلول

محاولة القيام system("ping host > nul") (nul هل Windows يعادل UNIX /dev/null).

نصائح أخرى

بشكل عام ، إذا كنت ستتصل ببرنامج آخر ولكن لا تريد أن يتصرف مثل std::system, ، ستحتاج إلى وظيفة خاصة بالمنصة fork()/exec() على UNIX أو CreateProcess() على Windows. تمنحك هذه الوظائف التحكم في كيفية تشغيل البرنامج الآخر ، على سبيل المثال ، أنه لا يظهر الإخراج أو عدم إنشاء نافذة وحدة تحكم ، إلخ.

يمكنك استخدام أمر النظام مثل أدناه لقمع إخراج أمر ping.

system("ping 100.100.100.100 > response.dat");

أعلاه عنوان IP Pings عنوان IP 100.100.100.100 ويوجه الإخراج إلى ملف يسمى Response.dat. ردًا على ذلك. يمكنك رؤية استجابة أمر ping.

do system ("ping site.com> nul 2> nul") ؛ والتحقق من القيمة إرجاع shell. إذا نجحت Ping ، ستعود Shell 0 ، وإلا ستعود 1. سأكون أكثر تفصيلًا ، لكن Vis Studio يعيد تثبيت نفسه. قون

هناك أيضًا طريقة لإخفاء نافذة وحدة التحكم باستخدام واجهة برمجة تطبيقات WIN لتنفيذ الأمر ، لكن ... لا أتذكر التفاصيل.

تحرير: ما زلت أنتظر عملية تثبيت MSVS ، لذلك ... :) استخدم المعالجة Creative مع علامة detached_process لمعلمة dwCreationFlags لإخفاء نافذة وحدة التحكم.

بعد استدعاء عملية إنشاء عملية ، سيتعين عليك استخدام waitforsingleobject على مقبض العملية لانتظار إكمال ping. يجب أن يكون للمعلمة الأخيرة إلى CreateProcess مؤشر لمعالجة المعلومات التي تحتوي على معالجة العملية. (على افتراض أن CreateProcess كان ناجحًا) عليك الانتظار حتى يكتمل الأمر. بمجرد اكتماله ، يمكنك استخدام مقبض العملية للحصول على قيمة الإرجاع ، على الرغم من أنني متضمنة جدًا لإخبارك بكيفية القيام بذلك في هذه المرحلة.

عندما تصل إلى Windows واتصل عمليه الخلق(), ، تأكد من تعيين:

    lpStartupInfo->wShowWindow = SW_HIDE;

سيضمن هذا إخفاء أي نوافذ تم إنشاؤها بواسطة العملية الجديدة.

سيؤدي استخدام علامة detached_process إلى منع العملية الجديدة من ورث وحدة التحكم في التطبيق الخاصة بك ، لكن هذا لا يمنع العملية الجديدة من إنشاء وحدة تحكم جديدة. لست متأكدًا مما سيفعله Ping ، ولكن من الأفضل إزالة كل الشك باستخدام SW_Hide.

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

#include <Windows.h>

ثم أرسل أمر ping واكتب الإخراج في ملف مثل هذا ؛

WinExec("ping google.com > file.dat", SW_HIDE); 

سيؤدي ذلك إلى إرسال أمر ping إلى google.com ويكتب الإخراج إلى ملف "file.dat" في دليل برنامج التشغيل الحالي. لذلك يمكنك تغيير File.dat إلى أي ملف أو FilePath الذي تريده ، وبالطبع يمكنك تغيير أمر ping. الحرف> يعني أن إخراج الأمر يحتاج إلى كتابة في مسار الملف وراءه. إذا كنت ترغب في إظهار نافذة وحدة التحكم وتجميد التطبيق أثناء تشغيل أمر ping ، فيجب عليك استخدام السطر التالي من التعليمات البرمجية بدلاً من رمز Windexec () ؛

system("ping google.com > file.dat");
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top