Уважаемые коллеги!
есть довольно неприятная проблема.
есть COM компонент который используется .NET клиентом. Данный компонент оформлен в виде DLL. Назовем его ядром. Внутри себя он вызывает функции другого COM-компонента, который в свою очередь оформлен в виде EXE. Назовем его сервером.
ход выполнения программы выглядит примерно так:
программа на .NET использующая Windows Forms имеет главное окно которое выглядит так:
namespace WindowsFormsApplication9
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
public IMyApp m_app2;
private void button1_Click(object sender, EventArgs e)
{
IApp app = new AppClass();
m_app2 = (IMyApp)app.GetApp();
Form2 frm2 = new Form2(m_app2);
frm2.ShowDialog();
}
}
}
как прекрасно видно форма эта по нажатию на кнопку создает другую форму которая выглядит так:
namespace WindowsFormsApplication9
{
public partial class Form2 : Form
{
public IMyApp m_app2;
public Thread m_thread;
public Form2(IMyApp app2)
{
m_app2 = app2;
m_thread = new Thread(TreadEntryPoint);
m_thread.Start();
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
}
private void TreadEntryPoint()
{
m_app2.SomeMethod("test");
}
}
}
как прекрасно видно форма в своем конструкторе получает указатель на некий интерфейс COM-объекта созданного в основном потоке, потом создает новый поток и вызывает в нем функцию этого объекта.
При вызове функции SomeMethod вызов попадает сначала в ядро, а потом переадресуется внешнему компоненту реализованному в EXE (так называемому серверу). Так вот собственно теперь проблема.
Если во время выполнения SomeMethod я идентифицирую ошибку через SetErrorInfo, то все прекрасно. Во второй нити я получаю COMException в котором вижу корректные данные об ошибке, здесь все нормально.
Однако стоит мне сделать тоже самое в сервере и получить эту ошибку в ядре, то независимо от того, игнорирую ее я или передаю уже непосредственно в .NET поток создавший объект (внимание, не тот который вызвал SomeMethod) получается SEHException c описанием "Внешний компонент создал исключение".
Пока категорически не могу понять почему это происходит именно так и как с этим бороться. Буду признателен любым мыслям которые у вас есть. Заранее благодарю.