Либа для работы с COM объектами
От: D_Tony  
Дата: 18.04.16 10:26
Оценка:
Вопрос такого плана — есть ли либа свободная, позволяющая в С++ коде работать
легко и непринужденно с СОМ объектами Office 2007-2016.
Наподобие такого плана работа интересует:
псевдокод:
        CREATE( objXL )
        objXL.Create('Excel.Application')
    objXL('Workbooks.Open("название",,,4,,,,,,,,,)')
    objXL('ActiveWorkbook.SaveAs("TargetFileName", -4143)')
    objXL('ActiveWorkbook.Worksheets.Item(1).Name') = 'Экспорт из таблицы'


т.е. она должна позволять вызывать те функции и в той же нотации — как это можно было бы
в VBA написать. Собсно как это видно из примера выше.
Re: Либа для работы с COM объектами
От: PM  
Дата: 18.04.16 13:14
Оценка:
Здравствуйте, D_Tony, Вы писали:

D_T>Вопрос такого плана — есть ли либа свободная, позволяющая в С++ коде работать

D_T>легко и непринужденно с СОМ объектами Office 2007-2016.
D_T>Наподобие такого плана работа интересует:
D_T>псевдокод:
D_T>
D_T>        CREATE( objXL )
D_T>        objXL.Create('Excel.Application')
D_T>    objXL('Workbooks.Open("название",,,4,,,,,,,,,)')
D_T>    objXL('ActiveWorkbook.SaveAs("TargetFileName", -4143)')
D_T>    objXL('ActiveWorkbook.Worksheets.Item(1).Name') = 'Экспорт из таблицы'
D_T>


D_T>т.е. она должна позволять вызывать те функции и в той же нотации — как это можно было бы

D_T>в VBA написать. Собсно как это видно из примера выше.

Для вызова через IDispatch когда-то была http://vole.sourceforge.net/
С variadic templates в С++11 можно наверно даже проще сделать сейчас.
Re[2]: Либа для работы с COM объектами
От: D_Tony  
Дата: 18.04.16 15:14
Оценка:
Здравствуйте, PM, Вы писали:

PM>Здравствуйте, D_Tony, Вы писали:



PM>Для вызова через IDispatch когда-то была http://vole.sourceforge.net/


интересно.
примеров правда маловато. но пощупаем.
а с++11 нам не катит.
Re[3]: Либа для работы с COM объектами
От: PM  
Дата: 18.04.16 16:10
Оценка:
Здравствуйте, D_Tony, Вы писали:

PM>>Для вызова через IDispatch когда-то была http://vole.sourceforge.net/


D_T>интересно.

D_T>примеров правда маловато. но пощупаем.
D_T>а с++11 нам не катит.

Matt Wilson писал пару статей на CodeProject с примерами использования:

http://www.codeproject.com/Articles/19962/Driving-Microsoft-Word-using-VOLE
http://www.codeproject.com/Articles/18365/A-Simple-XML-Validator-using-VOLE
Re: Либа для работы с COM объектами
От: bnk СССР http://unmanagedvisio.com/
Дата: 18.04.16 20:40
Оценка:
Здравствуйте, D_Tony, Вы писали:

D_T>Вопрос такого плана — есть ли либа свободная, позволяющая в С++ коде работать

D_T>легко и непринужденно с СОМ объектами Office 2007-2016.
D_T>Наподобие такого плана работа интересует:
D_T>псевдокод:
D_T>
D_T>        CREATE( objXL )
D_T>        objXL.Create('Excel.Application')
D_T>    objXL('Workbooks.Open("название",,,4,,,,,,,,,)')
D_T>    objXL('ActiveWorkbook.SaveAs("TargetFileName", -4143)')
D_T>    objXL('ActiveWorkbook.Worksheets.Item(1).Name') = 'Экспорт из таблицы'
D_T>


D_T>т.е. она должна позволять вызывать те функции и в той же нотации — как это можно было бы

D_T>в VBA написать. Собсно как это видно из примера выше.


Поскольку за "как" — это на stackoverflow, спрошу — зачем?
Зачем работать с COM объектами офиса из C++, то есть.

Если нужно экспортировать данные в Excel/Word, то OpenXml возможно получше будет (ну и на порядок быстрее)
Если писать Addin — то C++ странный выбор, ввиду многословности и несовместимости с веб.
Если портировать существующй VBA код — то проще (и эффективнее) все оставить как есть, и выполнять макросы через Application.Run() например.
Re[2]: Либа для работы с COM объектами
От: D_Tony  
Дата: 19.04.16 10:16
Оценка:
Здравствуйте, bnk, Вы писали:

bnk>Здравствуйте, D_Tony, Вы писали:



bnk>Поскольку за "как" — это на stackoverflow, спрошу — зачем?

bnk>Зачем работать с COM объектами офиса из C++, то есть.

bnk>Если нужно экспортировать данные в Excel/Word, то OpenXml возможно получше будет (ну и на порядок быстрее)

bnk>Если писать Addin — то C++ странный выбор, ввиду многословности и несовместимости с веб.
bnk>Если портировать существующй VBA код — то проще (и эффективнее) все оставить как есть, и выполнять макросы через Application.Run() например.


О, всё просто.
есть прогаА на с++ написанная. давно.
есть прога на кларионе написанная. помните такой язык? если нет — везет вам)))
поддержку клариону оказывать перестали давно. а функционал нужен здесь и щаз.
и нужен в прогеА. Значит надо переносить код. Код работы с экселем в кларионе
просто шикарно просто описан. я просто охреневаю — отчего до сих пор нет такой
простоты в стандарте С++. Там просто можно брать и вставлять копипастом заготовки
работы из макросов на VBA — и все с ходу работать будет.
Вот и ищется такой же аналог на С++.

Ну и т.к. я ответил на вопрос "зачем" — очень прошу ответить на вопрос "как"
и лучше тут чем на стеке.
Re[3]: Либа для работы с COM объектами
От: aloch Россия  
Дата: 19.04.16 17:19
Оценка:
Здравствуйте, D_Tony, Вы писали:

Я бы не стал мучать C++ (и себя). Я бы сделал на старом/добром VB6 всю работу с Excel и оформил это в виде ActiveX DLL с максимально простым интерфейсом, который бы уже дергал из C++.


Re[3]: Либа для работы с COM объектами
От: bnk СССР http://unmanagedvisio.com/
Дата: 19.04.16 19:11
Оценка: +1
Здравствуйте, D_Tony, Вы писали:

D_T>О, всё просто.

D_T>есть прогаА на с++ написанная. давно.
D_T>есть прога на кларионе написанная. помните такой язык? если нет — везет вам)))
D_T>поддержку клариону оказывать перестали давно. а функционал нужен здесь и щаз.

Не, кларион я не застал

D_T>и нужен в прогеА. Значит надо переносить код. Код работы с экселем в кларионе

D_T>просто шикарно просто описан. я просто охреневаю — отчего до сих пор нет такой
D_T>простоты в стандарте С++. Там просто можно брать и вставлять копипастом заготовки
D_T>работы из макросов на VBA — и все с ходу работать будет.
D_T>Вот и ищется такой же аналог на С++.

Увы, дословного аналога я не знаю.
Можно, как уже предложили, сделать все на VBA, а из C++ дергать макросы через Application.Run например
Еще можно прикрутить VBA ScriptEngine например, тогда код будет на vbscript соответственно.

Обычная практика для C++ — директива #import (можно no_dual_interfaces, чтобы все было через IDispatch, т.е. независимо от версии)
Синтаксис само собой будет плюсовый, но зато будет автокомплит например.
Отредактировано 19.04.2016 19:12 bnk . Предыдущая версия .
Re: Либа для работы с COM объектами
От: malafish  
Дата: 20.04.16 07:24
Оценка:
Здравствуйте, D_Tony, Вы писали:

D_T>Вопрос такого плана — есть ли либа свободная, позволяющая в С++ коде работать

D_T>легко и непринужденно с СОМ объектами Office 2007-2016.
D_T>Наподобие такого плана работа интересует:
D_T>псевдокод:
D_T>
D_T>        CREATE( objXL )
D_T>        objXL.Create('Excel.Application')
D_T>    objXL('Workbooks.Open("название",,,4,,,,,,,,,)')
D_T>    objXL('ActiveWorkbook.SaveAs("TargetFileName", -4143)')
D_T>    objXL('ActiveWorkbook.Worksheets.Item(1).Name') = 'Экспорт из таблицы'
D_T>


У Qt в примерах есть инструмент (dumpcpp) который генерирует по com-объекту обертку со всем методами, свойствами.
Re[2]: Либа для работы с COM объектами
От: D_Tony  
Дата: 27.04.16 11:50
Оценка:
Здравствуйте, PM, Вы писали:

PM>Здравствуйте, D_Tony, Вы писали:


D_T>>Вопрос такого плана — есть ли либа свободная, позволяющая в С++ коде работать

D_T>>легко и непринужденно с СОМ объектами Office 2007-2016.
D_T>>Наподобие такого плана работа интересует:
D_T>>псевдокод:
D_T>>
D_T>>        CREATE( objXL )
D_T>>        objXL.Create('Excel.Application')
D_T>>    objXL('Workbooks.Open("название",,,4,,,,,,,,,)')
D_T>>    objXL('ActiveWorkbook.SaveAs("TargetFileName", -4143)')
D_T>>    objXL('ActiveWorkbook.Worksheets.Item(1).Name') = 'Экспорт из таблицы'
D_T>>


D_T>>т.е. она должна позволять вызывать те функции и в той же нотации — как это можно было бы

D_T>>в VBA написать. Собсно как это видно из примера выше.

PM>Для вызова через IDispatch когда-то была http://vole.sourceforge.net/

PM>С variadic templates в С++11 можно наверно даже проще сделать сейчас.

Похоже эта либа самое то, НО одно НО.
Она под mingw + gcc 4.x не компиляется в составе даже HelloWorld.
Симптомы те же что и в mail рассылке на сайте либы описаны.
Но или автор забил на неё, или... Ответа, короче нет.
Может тут спецы поймут — в чем дело?

ссылка на описание проблемы:
https://sourceforge.net/p/vole/mailman/message/31007126/

да, в самом тексте ошибки предлагается кой-какой флаг компиляции поставить, чтоб
ошибку проигнорить — но как то не хочется так грубо решать проблему...
Re: Либа для работы с COM объектами
От: Кодт Россия  
Дата: 27.04.16 17:33
Оценка:
Здравствуйте, D_Tony, Вы писали:

D_T>Вопрос такого плана — есть ли либа свободная, позволяющая в С++ коде работать

D_T>легко и непринужденно с СОМ объектами Office 2007-2016.

Comet?
https://github.com/alamaison/comet
http://www.codeproject.com/Articles/5748/Introducing-Comet

(Мопед не мой: сто лет не пользовался, мне хватало микрософтовского ATL).

D_T>т.е. она должна позволять вызывать те функции и в той же нотации — как это можно было бы

D_T>в VBA написать. Собсно как это видно из примера выше.

        com_ptr<IDispatch> dp( L"CometExampleDynamicDispatch.Demo" );

        int x = dp->call(L"AddOne", 1);

        int the_answer = dp->get(L"MeaningOfTheUniverse");
        dp->put(L"Item", L"MyPlace", the_answer);

        int the_answer2 = dp->get(L"Item", L"MyPlace");

Устроит? Или нужно, чтобы вместо get/put было присваивание?
Перекуём баги на фичи!
Re[2]: Либа для работы с COM объектами
От: D_Tony  
Дата: 28.04.16 07:49
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Здравствуйте, D_Tony, Вы писали:


D_T>>Вопрос такого плана — есть ли либа свободная, позволяющая в С++ коде работать

D_T>>легко и непринужденно с СОМ объектами Office 2007-2016.

К>Comet?

К>https://github.com/alamaison/comet
К>http://www.codeproject.com/Articles/5748/Introducing-Comet

К>(Мопед не мой: сто лет не пользовался, мне хватало микрософтовского ATL).


D_T>>т.е. она должна позволять вызывать те функции и в той же нотации — как это можно было бы

D_T>>в VBA написать. Собсно как это видно из примера выше.

К>
К>        com_ptr<IDispatch> dp( L"CometExampleDynamicDispatch.Demo" );

К>        int x = dp->call(L"AddOne", 1);

К>        int the_answer = dp->get(L"MeaningOfTheUniverse");
        dp->>put(L"Item", L"MyPlace", the_answer);

К>        int the_answer2 = dp->get(L"Item", L"MyPlace");
К>

К>Устроит? Или нужно, чтобы вместо get/put было присваивание?

Да, устроит. Вот тока пару вопросов аж даже ДО первого использования у меня уже есть
И по возможности хотелось бы узнать ответы заранее...

http://rsdn.ru/forum/cpp.applied/6430028.1
Автор: D_Tony
Дата: 27.04.16
— это чуть выше по ветке обсуждения мой коммент.

т.е. если вдруг будут проблемы с Comet — то я бы хотел опробовать VOLE либу, но пока что
я столкнулся с тупейшей проблемой компиляции. Может глянете?

В любом из этих двух случаев (что в этой либе, что в в VOLE) я сталкиваюсь с другой проблемой,
описанной мною в другом — более подходящем, как мне казалось, топике:
http://rsdn.ru/forum/com/6429180.1
Автор: D_Tony
Дата: 26.04.16


Можете предположить — КАК мне это решить — ну хотя бы средствами Comet, если Вы с ней лучше знакомы.

Заранее спасибо за любой коммент и любую помощь по этим проблемам!
Re[3]: Либа для работы с COM объектами
От: Кодт Россия  
Дата: 28.04.16 13:35
Оценка: 4 (1)
Здравствуйте, D_Tony, Вы писали:

D_T>да, в самом тексте ошибки предлагается кой-какой флаг компиляции поставить, чтоб

D_T>ошибку проигнорить — но как то не хочется так грубо решать проблему...

Не надо флагами компиляцию исправлять.

Там всё очень просто! get_checked_disp_ принимает один или два параметра: первый — указатель на объект (IDispatch или смартпоинтер), второй по желанию — текст сообщения (об ошибке?).
А в collection.hpp тупо забыли, что эта функция — не член класса object (наследником которого является collection), а внешняя.

Лечится как-то так
        ptr_type        disp = get_checked_disp_(/*this->*/get());

Попробуй скомпилировать.

Кстати, элементарно же было исправить. Этот "шильдик парового котла" нашлёлся в соседнем хедере, object.hpp

А причина, почему такая фигня пролезла в код, — элементарна.
Муся смотрит сквозь пальцы на код шаблона, который не потребовался при инстанцировании. А гусь, шланг и прочие Ъ-компиляторы проверяют.
Это, кстати, показывает, что авторы Vola нифига не покрыли свой код хотя бы примерами для компиляции...

(В общем, возьми комет, а не поделку. Или сделай доброе дело, портируй ATL на гусе-совместимые компиляторы).
Перекуём баги на фичи!
Re[4]: Либа для работы с COM объектами
От: D_Tony  
Дата: 28.04.16 15:03
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Здравствуйте, D_Tony, Вы писали:


D_T>>да, в самом тексте ошибки предлагается кой-какой флаг компиляции поставить, чтоб

D_T>>ошибку проигнорить — но как то не хочется так грубо решать проблему...

К>Не надо флагами компиляцию исправлять.


К>Там всё очень просто! get_checked_disp_ принимает один или два параметра: первый — указатель на объект (IDispatch или смартпоинтер), второй по желанию — текст сообщения (об ошибке?).

К>А в collection.hpp тупо забыли, что эта функция — не член класса object (наследником которого является collection), а внешняя.

К>Лечится как-то так

К>
К>        ptr_type        disp = get_checked_disp_(/*this->*/get());
К>

К>Попробуй скомпилировать.

К>Кстати, элементарно же было исправить. Этот "шильдик парового котла" нашлёлся в соседнем хедере, object.hpp


К>А причина, почему такая фигня пролезла в код, — элементарна.

К>Муся смотрит сквозь пальцы на код шаблона, который не потребовался при инстанцировании. А гусь, шланг и прочие Ъ-компиляторы проверяют.
К>Это, кстати, показывает, что авторы Vola нифига не покрыли свой код хотя бы примерами для компиляции...

К>(В общем, возьми комет, а не поделку. Или сделай доброе дело, портируй ATL на гусе-совместимые компиляторы).


сенкс за наводку!
точная строка фикса выглядит так:
ptr_type        disp = object_helper::get_checked_disp_(this->get());


а либу эту натворил совсем не мальчик с универа, а умудренный муж науки. Я даже книги этого Мэтью Уилсона читал:
http://www.synesis.com.au/publications.html
не сказать бы — что уровень мал у этого чувака.

А теперь бы разобраться с моей проблемой в топике http://rsdn.ru/forum/com/6429180.1
Автор: D_Tony
Дата: 26.04.16

не важно на основе какой либы — общий принцип должен быть одинаков.
Но вот какой он? Один вариант нащупал — работает. Но не уверен, что он явно верен....
Re[5]: Либа для работы с COM объектами
От: Кодт Россия  
Дата: 28.04.16 15:39
Оценка:
Здравствуйте, D_Tony, Вы писали:

D_T>сенкс за наводку!

D_T>точная строка фикса выглядит так:
D_T>
D_T>ptr_type        disp = object_helper::get_checked_disp_(this->get());
D_T>


Кстати, да! this позволяет уточнить контекст поиска имени. (Избаловала меня муся, ей на такие нюансы пофиг, поэтому забываю).

D_T>а либу эту натворил совсем не мальчик с универа, а умудренный муж науки. Я даже книги этого Мэтью Уилсона читал:


Конь о четырёх копытах — и тот спотыкается.
И мужи науки тоже иногда говнокодят.

То, что он не проверил элементарную функциональность своей библиотеки, — как бы настораживает. Может, это был proof of concept, вообще?
Либо другая версия. Он сперва сделал get_checked_disp_ членом класса object, проверил-работает, а потом переделал на свободную функцию и забыл поправить в точках использования.
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.