powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Маршалинг при позднем связываниии
2 сообщений из 2, страница 1 из 1
Маршалинг при позднем связываниии
    #33771989
Marshall
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Работаю в BCB6.

Есть простая проблема по сути. Программа в потоке выводит в Excel информацию. Нужно организовать возможность отмены построения отчета по команде пользователя. Естественно необходимо закрыть Excel или показать его пользователю.

Проблема в том, что как известно нельзя обратиться из к COM объекту из другого потока. Для работы с этим COM объектом необходимо из потока создавшего Excel замаршалить этот объект, а потом в другом потоке демаршалить и создать прокси, и дальше работать через этот прокси.

Так вот во всей литературе я встречал примеры только когда работа ведется через раннее связывание, когда у меня есть и указатель на интерфейс, и ID интерфейса. У меня же общение с COM просходит через позднее связывание (мне так очень удобно) соответсвенно ничего вышеприведенного у меня нет.

Ну да ладно, решил попробовать вот так создать в потоке Excel
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
                fmMain->excel = Variant::CreateObject("Excel.Application");
                try
                {

                     hr = CoMarshalInterThreadInterfaceInStream(IID_IDispatch,
                                                                  (IDispatch*)fmMain->excel,
                                                                  &fmMain->stream);


                     if(hr == E_OUTOFMEMORY)
                     {
                          fmMain->AddToLog("Error E_OUTOFMEMORY in call CoMarshalInterThreadInterfaceInStream ", true);
                     }
                     if(hr == S_OK)
                     {
                          fmMain->AddToLog("S_OK",  true);
                     }
                }
                catch(Exception& e)
                {
                        fmMain->AddToLog(e.Message, true);
                }



Потом пытаюсь демаршалить в главной программе по команде пользователя "Остановить процесс"

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
             Variant iXL;
             HRESULT hr;

                   hr =   CoGetInterfaceAndReleaseStream(stream,
                                            IID_IUnknown,
                                            (void**)&iXL);
                   if(hr == E_OUTOFMEMORY)
                   {
                      fmMain->AddToLog("Error E_OUTOFMEMORY in call  ", true);

                   }
                   if(hr == S_OK)
                   {
                        fmMain->AddToLog("S_OK", true);
                   }


                     try
                     {

                        iXL.OlePropertySet("Visible",TRUE);
                     }
                     catch(Exception& e)
                     {
                        AddToLog(e.Message,  true);
                     }




Так вот при установке свойства Excel происходит ошибка: "Не могу преобразовать тип ... в Dispatch". вот.

Так что, если кто что-нибудь имеет сказать, буду очень благодарен.
...
Рейтинг: 0 / 0
Маршалинг при позднем связываниии
    #33773235
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
marshall Есть простая проблема по сути. Программа в потоке выводит в Excel информацию. Нужно организовать возможность отмены построения отчета по команде пользователя. Естественно необходимо закрыть Excel или показать его пользователю.Это делается намного проще.
В потоке работающем с внешней программой (в данном случае Excel) между обращениями к внешней программе делается проверка "запросил юзер отмену или нет" (для VCL это Terminate()/if(Terminated) ). Если запросил - то поток начинает заниматься корректным шатдауном внешнего приложения.
Развлекаться с маршалингом конечно можно, но опасно - оно все же не предусматривает работу с такими тяжелыми и глюкавыми приложениями как Эксель. Получит GPF на этой дороге как дважды-два. :)
...
Рейтинг: 0 / 0
2 сообщений из 2, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Маршалинг при позднем связываниии
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]