سؤال

أنا باستخدام system القيادة في C++ إلى استدعاء بعض برامج خارجية, و كلما كنت استخدامها ، إطار وحدة تحكم يفتح ويغلق بعد الأمر التشطيبات.

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

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

المحلول

وهذا يبدو وكأنه كنت تستخدم ويندوز.

في لينكس (و* لا شىء بشكل عام)، ويهمني ان يحل محل الدعوة إلى system مع المكالمات إلى fork وexec، على التوالي. على النوافذ، وأعتقد أن هناك نوعا من وظيفة تفرخ واحد في عملية جديدة في API-راجع وثائق ويندوز.

وعندما كنت تشغل الأوامر قذيفة و / أو البرامج الخارجية، البرنامج من الصعب جعل منصة مستقلة، لأنها سوف تعتمد على منصة جود أوامر و / أو البرامج الخارجية الذي تقوم بتشغيله.

نصائح أخرى

وربما هذا هو أسهل و ربما أفضل وسيلة ، وهذا أيضا سوف تجعل من ذلك أن البرنامج لا تجميد أثناء تشغيل هذا الأمر.في البداية لا تنسى أن تشمل ويندوز رأس استخدام.

#include <Windows.h>

ثم كنت بحاجة إلى استخدام الدالة التالية لتشغيل الأمر ،

WinExec("your command", SW_HIDE); 

ملاحظة ؛ على WinExec الطريقة تم إيقافها لأكثر من عقد من الزمان.فإنه لا يزال يعمل بشكل جيد على الرغم من اليوم.لا يجب استخدام هذا الأسلوب إذا لم يكن مطلوبا.

...بدلا من طريقة لا تحتاج إلى استخدام;

system("your command");

والذي exec () تبدو مستقلة منصة تماما كما هو POSIX. على النوافذ، انها _exec () في حين انها إكسيك () على يونيكس: انظر <لأ href = "http://msdn.microsoft.com/en-us/library/431x4c1w(VS.71).aspx" يختلط = "نوفولو noreferrer "> http://msdn.microsoft.com/en-us/library/431x4c1w (VS.71) .aspx اتصال

وErrm. CreateProcess أو ShellExecute.

إليك وسيلة لتنفيذ الأوامر بدون إطار cmd.exe الجديد. وبناء على رولان Rabien في الإجابة و <لأ href = "https://msdn.microsoft.com/en-ca/library /windows/desktop/ms682425(v=vs.85).aspx "يختلط =" نوفولو noreferrer "> MSDN ، لقد كتبت وظيفة العمل:

int windows_system(const char *cmd)
{
  PROCESS_INFORMATION p_info;
  STARTUPINFO s_info;
  LPSTR cmdline, programpath;

  memset(&s_info, 0, sizeof(s_info));
  memset(&p_info, 0, sizeof(p_info));
  s_info.cb = sizeof(s_info);

  cmdline     = _tcsdup(TEXT(cmd));
  programpath = _tcsdup(TEXT(cmd));

  if (CreateProcess(programpath, cmdline, NULL, NULL, 0, 0, NULL, NULL, &s_info, &p_info))
  {
    WaitForSingleObject(p_info.hProcess, INFINITE);
    CloseHandle(p_info.hProcess);
    CloseHandle(p_info.hThread);
  }
}

ويعمل على جميع أنظمة تشغيل ويندوز. مجرد دعوة وكأنك system().

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