Re[8]: Add-in в Ворде 2000 работает, а в Ворде97 нет!!!!
От: FUriCK Украина  
Дата: 18.07.05 12:01
Оценка:
Решил все-таки запостить в старую тему ответ (или, может, не совсем ответ, а метод).

После долгих исканий и экспериментов результатом использования интерфейсов 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 и всего, что с ним связано.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.