وقمع وحدة التحكم عندما داعيا "النظام" في C++
-
05-07-2019 - |
سؤال
أنا باستخدام 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()
.