Sanırım bu soruya biraz geç kaldım ama yine de aynı sorunu yaşayanlar için bir şeyler yazacağım. Ben verdiğim gibi bu aynı cevaptır bu soruya.
Benim sorunum, uygulamamın bir GUI uygulaması olmasını istemem, ancak yürütülen işlemlerin herhangi bir etkileşimli konsol penceresi eklenmeden arka planda çalıştırılması gerektiğiydi. Bence bu çözüm, üst süreç bir konsol süreci olduğunda da işe yaramalı. Yine de "CREATE_NO_WINDOW" bayrağını kaldırmanız gerekebilir.
Bunu bir sarmalayıcı uygulamasıyla GenerateConsoleCtrlEvent () kullanarak çözmeyi başardım . İşin zor yanı, dokümantasyonun tam olarak nasıl kullanılabileceği ve onunla ilgili tuzaklar konusunda gerçekten net olmamasıdır.
Benim çözümüm burada anlatılanlara dayanmaktadır . Ancak bu, tüm ayrıntıları ve bir hatayla gerçekten açıklamadı, bu yüzden işte nasıl çalıştırılacağına dair ayrıntılar.
Yeni bir yardımcı uygulama "Helper.exe" oluşturun. Bu uygulama, uygulamanız (ebeveyn) ile kapatmak istediğiniz alt süreç arasında yer alacaktır. Aynı zamanda gerçek çocuk sürecini de yaratacaktır. Bu "aracı" işlemine sahip olmalısınız, yoksa GenerateConsoleCtrlEvent () başarısız olur.
Yardımcının alt süreci kapatması gerektiğini ebeveynden yardımcı sürece iletmek için bir tür IPC mekanizması kullanın. Yardımcı bu olayı aldığında, kendisini ve alt süreci kapatan "GenerateConsoleCtrlEvent (CTRL_BREAK, 0)" öğesini çağırır. Bunun için kendim için ebeveynin alt süreci iptal etmek istediğinde tamamladığı bir olay nesnesi kullandım.
Helper.exe dosyanızı oluşturmak için CREATE_NO_WINDOW ve CREATE_NEW_PROCESS_GROUP ile oluşturun. Ve alt süreci oluştururken, konsolu üstünden türeteceği anlamına gelen bayraksız (0) oluşturun. Bunu yapmamak, olayı görmezden gelmesine neden olacaktır.
Her adımın böyle yapılması çok önemli. Tüm farklı kombinasyonları deniyorum ama bu kombinasyon işe yarayan tek kombinasyon. CTRL_C olayı gönderemezsiniz. Başarıya geri dönecek, ancak süreç tarafından göz ardı edilecektir. CTRL_BREAK, çalışan tek kişidir. Sonunda ikisi de ExitProcess () çağıracağı için gerçekten önemli değil.
Ayrıca, GenerateConsoleCtrlEvent () öğesini, yardımcı sürecin yaşamaya devam etmesine doğrudan izin veren alt süreç kimliğinin bir işlem groupd kimliğiyle çağıramazsınız. Bu da başarısız olacaktır.
Bunu çalıştırmaya çalışmak için bütün bir gün geçirdim. Bu çözüm benim için çalışıyor, ancak herhangi birinin ekleyeceği bir şey varsa lütfen yapın. Ağın her yerine benzer sorunları olan birçok insan buldum, ancak soruna kesin bir çözüm bulamadım. GenerateConsoleCtrlEvent () nasıl çalışır da biraz tuhaftır, bu yüzden herhangi biri hakkında daha fazla ayrıntı biliyorsa lütfen paylaşın.
jstack
yerine bu özel konu için güvenilir bir şekilde kullanılabileceği görülüyor : stackoverflow.com/a/47723393/603516