Решил все-таки запостить в старую тему ответ (или, может, не совсем ответ, а метод).
После долгих исканий и экспериментов результатом использования интерфейсов MSOffice с целью automation были следующие:
Ошибка:
"fatal error LNK1179: invalid or corrupt file: duplicate COMDAT
'<identifier name>'"
обходится двумя путями:
1) разнести #import разных либ в *.h и в *.cpp (данный метод не подходит для случая, когда в *.h нужно продефайнить типы)
2) убрать в одной из импортируемых либ "named_guids". Если это можно сделать безболезненно — проблема решена, если
эти гуиды нужны в удобочитаемом виде — придется скопировать их определения из tlh в отдельный хедер и включать его
по необходимости.
Далее:
случайным брожением по tlh-кам было выяснено, что ошибка:
"Run-Time Check Failure #0 — The value of ESP was not properly saved across a function call.
This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention."
вылезает в сзязи с тем, что многие методы интерфейсов получают параметрами (возвращают) не указатели на интерфейс, как это описано в
OLE/COM viewer'е, а указатели на IDispatch, от которого наследуется данный интерфейс.
Вариантов решения, опять-таки 2:
1) Использовать
Invoke пришедшего указателя на IDispatch нужного интерфейса.
Для некоторых методов это единственное решение, т.к. даже в tlh врапперы соответствующих
методов описаны как принимающие
VARIANT * или просто
VARIANT.
2) Для некоторых методов достаточно сделать явное получение указателя на необходимый интерфейс с помощью
QueryInterface пришедшего (IDispatch*) указателя.
Вроде все (пока что)

.
Как что еще накопаю в дальнейшем — обязательно отсвищу.
Удачи всем в юзании MSOffice automation и всего, что с ним связано.