سؤال

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

أنا أساسيات ما أنا أحاول القيام به هو كما يلي:

  1. إطلاق عملية
  2. انتظر حتى تنتهي العملية
  3. استرداد رمز الإرجاع من عملية

أنا حاليا باستخدام التعليمات البرمجية التالية:

STARTUPINFO info={sizeof(info)};
PROCESS_INFORMATION processInfo;
if (CreateProcess(PATH, ARGS, NULL, NULL, TRUE, 0, NULL, NULL, &info, &processInfo))
{
    ::WaitForSingleObject(processInfo.hProcess, INFINITE);

    DWORD exit = 100;
    GetExitCodeProcess(processInfo.hProcess, &exit);

    CloseHandle(processInfo.hProcess);
    CloseHandle(processInfo.hThread);

    return exit;
}

عند استدعاء CreateProcess () ، فإنه ينجح ويدخل الجسم إذا كان البيان.الدعوة إلى WaitForSingleObject يعود فورا, الذي لا ينبغي أن العملية ينبغي أن تأخذ حوالي 20-30 ثانية على النهاية.وأخيرا الدعوة GetExitCodeProcess() يفشل و لا تعيين قيمة "خروج".

لمعلوماتك, هذا هو الكود لقد استخدمت فعلا في مكان آخر مع النجاح ، ليس فقط في الخدمة.

يمكن أن يجري إطلاقه من الخدمة و هناك مشاكل الأذونات??

تحرير: لقد أدركت الآن أن إطلاق التطبيق (أستطيع أن أرى ذلك في TaskMan) ولكن يبدو أن عالقة.إنه هناك, ولكن لا تفعل أي شيء.
على أساس روب كينيدي اقتراح, أنا ثابت عملية التعامل مع هذه القضية ، وأنه في الواقع لا ننتظر حتى تنتهي العملية.لكنه أبدا لا تنتهي إلا إذا قتلت يدويا.

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

المحلول

WaitForSingleObject و GetExitCodeProcess نتوقع عملية التعامل مع نفسه, لا مؤشر إلى عملية التعامل معها.إزالة اقحام.

تحقق أيضا من القيم عودة ودعوة GetLastError عندما تفشل.التي سوف تساعدك على تشخيص المشاكل في المستقبل.لا تفترض أبدا وظيفة API سوف تنجح دائما.

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

نصائح أخرى

بعد تحديث وتحرير, هذا يبدو وكأنه واحد من العديد من ممكن gotchas عند إطلاق عملية من الخدمة.هل هناك أي احتمال - أي على الإطلاق - أن الخارجية العملية ينتظر المستخدم التفاعل ؟ هناك ثلاثة أمثلة رئيسية علي واحدة على سبيل المثال أن يكون تطبيق سطر الأوامر التي يمكن في بعض الظروف تتطلب مدخلات لوحة المفاتيح (على سبيل المثال ، شيء من هذا القبيل "cmd /c del *.*" يتطلب تأكيد المستخدم).أمثلة أخرى تنطبق إذا كان التطبيق يحتاج نافذة و هو عرض ذلك ولكن لا يمكنك أن ترى ذلك.إذا كان هذا هو الحال ، قد ترغب في تعيين الخدمة إلى "التفاعل مع سطح المكتب" في حين التصحيح ، ومن ثم تكون قادرا على رؤية أي نافذة التطبيق (أو غير متوقع Windows رسالة الخطأ مثل أن تكون غير قادر على العثور على ملف DLL أو ما شابه).

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

منذ إطلاق وحدة التحكم التطبيق ، فمن الممكن أن يكون هناك الخفية البرمجية بدء محاولة تهيئة وحدة التحكم.الخدمة لا تعلق على سطح المكتب, و أنا متأكد أن عملية إطلاق الخدمة لن تكون أما ، لذلك لن تكون قادرة على إنشاء وحدة التحكم.التي يمكن أن تكون نقطة حيث هو معلق.

إذا كنت تستطيع حاول تغيير العملية الخاصة بك في ويندوز كامل قابل للتنفيذ ، ولكن تخطي الجزء حيث كنت في محاولة لخلق نافذة.

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