Вот сценарий ...
Приложение на VC ++ под Windows (я использую Visual Studio 2008).
У меня есть родительское окно с несколькими вкладками и некоторыми элементами управления. В одной из вкладок я динамически загружал приложение при выборе его в строке меню. Когда дочернее приложение исполняется, родительское окно перестает отвечать, и единственный способ закрыть приложение - использовать ctrl + alt + del.
Но ...
Эта проблема возникла только тогда, когда я добавил какой-то другой код в событие click определенного элемента меню, которое инициировало дочерний процесс.
Вот две версии кода:
namespace MyApplication
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Process proc = new Process();
proc.StartInfo.Arguments = "some arguments";
proc.StartInfo.FileName = "ApplicationName.exe";
proc.Start();
proc.WaitForInputIdle();
SetParent(proc.MainWindowHandle, panel1.Handle);
}
[DllImport("user32.dll")]
static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);
}
}
Приведенный выше код работает нормально.
Вот код проблемы:
namespace MyApplication
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
if(SomeSettings == 1)
{
Process proc = new Process();
proc.StartInfo.Arguments = "some arguments";
proc.StartInfo.FileName = "ApplicationName.exe";
proc.Start();
proc.WaitForInputIdle();
SetParent(proc.MainWindowHandle, panel1.Handle);
textBox1.Text = System.IO.File.ReadAllText("LogFile.log"); //some log file created by the process
}
else
{
//few if-else statements
//few switch-case statements
Process proc = new Process();
proc.StartInfo.Arguments = "some arguments";
proc.StartInfo.FileName = "ApplicationName.exe";
proc.Start();
proc.WaitForInputIdle();
SetParent(proc.MainWindowHandle, panel1.Handle);
textBox1.Text = System.IO.File.ReadAllText("LogFile.log"); //some log file created by the process
}
}
[DllImport("user32.dll")]
static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);
}
}
При выполнении второго кода родительский процесс запускает дочерний процесс, но окно приложения останавливается.
Может кто-нибудь сказать мне, почему это происходит ... ??? Это из-за чрезмерного случая if-else и switch или из-за загрузки файла журнала ... ??? И как это исправить ... ???
Спасибо.