SEHException при вызове метода COM-объекта из другой нити
От: apilikov Россия  
Дата: 06.10.10 11:30
Оценка:
Уважаемые коллеги!

есть довольно неприятная проблема.
есть 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 описанием "Внешний компонент создал исключение".

Пока категорически не могу понять почему это происходит именно так и как с этим бороться. Буду признателен любым мыслям которые у вас есть. Заранее благодарю.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.