Вопрос такого плана — есть ли либа свободная, позволяющая в С++ коде работать
легко и непринужденно с СОМ объектами Office 2007-2016.
Наподобие такого плана работа интересует:
псевдокод:
Здравствуйте, D_Tony, Вы писали:
D_T>Вопрос такого плана — есть ли либа свободная, позволяющая в С++ коде работать D_T>легко и непринужденно с СОМ объектами Office 2007-2016. D_T>Наподобие такого плана работа интересует: D_T>псевдокод: D_T>
Здравствуйте, D_Tony, Вы писали:
PM>>Для вызова через IDispatch когда-то была http://vole.sourceforge.net/
D_T>интересно. D_T>примеров правда маловато. но пощупаем. D_T>а с++11 нам не катит.
Matt Wilson писал пару статей на CodeProject с примерами использования:
Здравствуйте, D_Tony, Вы писали:
D_T>Вопрос такого плана — есть ли либа свободная, позволяющая в С++ коде работать D_T>легко и непринужденно с СОМ объектами Office 2007-2016. D_T>Наподобие такого плана работа интересует: D_T>псевдокод: D_T>
D_T>т.е. она должна позволять вызывать те функции и в той же нотации — как это можно было бы D_T>в VBA написать. Собсно как это видно из примера выше.
Поскольку за "как" — это на stackoverflow, спрошу — зачем?
Зачем работать с COM объектами офиса из C++, то есть.
Если нужно экспортировать данные в Excel/Word, то OpenXml возможно получше будет (ну и на порядок быстрее)
Если писать Addin — то C++ странный выбор, ввиду многословности и несовместимости с веб.
Если портировать существующй VBA код — то проще (и эффективнее) все оставить как есть, и выполнять макросы через Application.Run() например.
Здравствуйте, bnk, Вы писали:
bnk>Здравствуйте, D_Tony, Вы писали:
bnk>Поскольку за "как" — это на stackoverflow, спрошу — зачем? bnk>Зачем работать с COM объектами офиса из C++, то есть.
bnk>Если нужно экспортировать данные в Excel/Word, то OpenXml возможно получше будет (ну и на порядок быстрее) bnk>Если писать Addin — то C++ странный выбор, ввиду многословности и несовместимости с веб. bnk>Если портировать существующй VBA код — то проще (и эффективнее) все оставить как есть, и выполнять макросы через Application.Run() например.
О, всё просто.
есть прогаА на с++ написанная. давно.
есть прога на кларионе написанная. помните такой язык? если нет — везет вам)))
поддержку клариону оказывать перестали давно. а функционал нужен здесь и щаз.
и нужен в прогеА. Значит надо переносить код. Код работы с экселем в кларионе
просто шикарно просто описан. я просто охреневаю — отчего до сих пор нет такой
простоты в стандарте С++. Там просто можно брать и вставлять копипастом заготовки
работы из макросов на VBA — и все с ходу работать будет.
Вот и ищется такой же аналог на С++.
Ну и т.к. я ответил на вопрос "зачем" — очень прошу ответить на вопрос "как"
и лучше тут чем на стеке.
Я бы не стал мучать C++ (и себя). Я бы сделал на старом/добром VB6 всю работу с Excel и оформил это в виде ActiveX DLL с максимально простым интерфейсом, который бы уже дергал из C++.
Здравствуйте, 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, т.е. независимо от версии)
Синтаксис само собой будет плюсовый, но зато будет автокомплит например.
Здравствуйте, D_Tony, Вы писали:
D_T>Вопрос такого плана — есть ли либа свободная, позволяющая в С++ коде работать D_T>легко и непринужденно с СОМ объектами Office 2007-2016. D_T>Наподобие такого плана работа интересует: D_T>псевдокод: D_T>
Здравствуйте, PM, Вы писали:
PM>Здравствуйте, D_Tony, Вы писали:
D_T>>Вопрос такого плана — есть ли либа свободная, позволяющая в С++ коде работать D_T>>легко и непринужденно с СОМ объектами Office 2007-2016. D_T>>Наподобие такого плана работа интересует: D_T>>псевдокод: D_T>>
D_T>>т.е. она должна позволять вызывать те функции и в той же нотации — как это можно было бы D_T>>в VBA написать. Собсно как это видно из примера выше.
PM>Для вызова через IDispatch когда-то была http://vole.sourceforge.net/ PM>С variadic templates в С++11 можно наверно даже проще сделать сейчас.
Похоже эта либа самое то, НО одно НО.
Она под mingw + gcc 4.x не компиляется в составе даже HelloWorld.
Симптомы те же что и в mail рассылке на сайте либы описаны.
Но или автор забил на неё, или... Ответа, короче нет.
Может тут спецы поймут — в чем дело?
да, в самом тексте ошибки предлагается кой-какой флаг компиляции поставить, чтоб
ошибку проигнорить — но как то не хочется так грубо решать проблему...
Здравствуйте, D_Tony, Вы писали:
D_T>Вопрос такого плана — есть ли либа свободная, позволяющая в С++ коде работать D_T>легко и непринужденно с СОМ объектами Office 2007-2016.
(Мопед не мой: сто лет не пользовался, мне хватало микрософтовского 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 было присваивание?
Здравствуйте, Кодт, Вы писали:
К>Здравствуйте, 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 было присваивание?
Да, устроит. Вот тока пару вопросов аж даже ДО первого использования у меня уже есть
И по возможности хотелось бы узнать ответы заранее...
т.е. если вдруг будут проблемы с Comet — то я бы хотел опробовать VOLE либу, но пока что
я столкнулся с тупейшей проблемой компиляции. Может глянете?
В любом из этих двух случаев (что в этой либе, что в в VOLE) я сталкиваюсь с другой проблемой,
описанной мною в другом — более подходящем, как мне казалось, топике: http://rsdn.ru/forum/com/6429180.1
Здравствуйте, D_Tony, Вы писали:
D_T>да, в самом тексте ошибки предлагается кой-какой флаг компиляции поставить, чтоб D_T>ошибку проигнорить — но как то не хочется так грубо решать проблему...
Не надо флагами компиляцию исправлять.
Там всё очень просто! get_checked_disp_ принимает один или два параметра: первый — указатель на объект (IDispatch или смартпоинтер), второй по желанию — текст сообщения (об ошибке?).
А в collection.hpp тупо забыли, что эта функция — не член класса object (наследником которого является collection), а внешняя.
Кстати, элементарно же было исправить. Этот "шильдик парового котла" нашлёлся в соседнем хедере, object.hpp
А причина, почему такая фигня пролезла в код, — элементарна.
Муся смотрит сквозь пальцы на код шаблона, который не потребовался при инстанцировании. А гусь, шланг и прочие Ъ-компиляторы проверяют.
Это, кстати, показывает, что авторы Vola нифига не покрыли свой код хотя бы примерами для компиляции...
(В общем, возьми комет, а не поделку. Или сделай доброе дело, портируй ATL на гусе-совместимые компиляторы).
Здравствуйте, Кодт, Вы писали:
К>Здравствуйте, D_Tony, Вы писали:
D_T>>да, в самом тексте ошибки предлагается кой-какой флаг компиляции поставить, чтоб D_T>>ошибку проигнорить — но как то не хочется так грубо решать проблему...
К>Не надо флагами компиляцию исправлять.
К>Там всё очень просто! get_checked_disp_ принимает один или два параметра: первый — указатель на объект (IDispatch или смартпоинтер), второй по желанию — текст сообщения (об ошибке?). К>А в collection.hpp тупо забыли, что эта функция — не член класса object (наследником которого является collection), а внешняя.
К>Лечится как-то так К>
К>Попробуй скомпилировать.
К>Кстати, элементарно же было исправить. Этот "шильдик парового котла" нашлёлся в соседнем хедере, object.hpp
К>А причина, почему такая фигня пролезла в код, — элементарна. К>Муся смотрит сквозь пальцы на код шаблона, который не потребовался при инстанцировании. А гусь, шланг и прочие Ъ-компиляторы проверяют. К>Это, кстати, показывает, что авторы Vola нифига не покрыли свой код хотя бы примерами для компиляции...
К>(В общем, возьми комет, а не поделку. Или сделай доброе дело, портируй ATL на гусе-совместимые компиляторы).
сенкс за наводку!
точная строка фикса выглядит так:
а либу эту натворил совсем не мальчик с универа, а умудренный муж науки. Я даже книги этого Мэтью Уилсона читал: http://www.synesis.com.au/publications.html
не сказать бы — что уровень мал у этого чувака.
не важно на основе какой либы — общий принцип должен быть одинаков.
Но вот какой он? Один вариант нащупал — работает. Но не уверен, что он явно верен....
Кстати, да! this позволяет уточнить контекст поиска имени. (Избаловала меня муся, ей на такие нюансы пофиг, поэтому забываю).
D_T>а либу эту натворил совсем не мальчик с универа, а умудренный муж науки. Я даже книги этого Мэтью Уилсона читал:
Конь о четырёх копытах — и тот спотыкается.
И мужи науки тоже иногда говнокодят.
То, что он не проверил элементарную функциональность своей библиотеки, — как бы настораживает. Может, это был proof of concept, вообще?
Либо другая версия. Он сперва сделал get_checked_disp_ членом класса object, проверил-работает, а потом переделал на свободную функцию и забыл поправить в точках использования.