Аннотация:
В данной статье приводится объяснение работы директивы #import компилятора Visual C++ и даны примеры её использования с MS Word, MS Excel, ADO DB и ActiveX Control.
Если нам не помогут, то мы тоже никого не пощадим.
Тупо скопировал оба оффисных примера из текста — получил такие ошибки:
..\debug\msacc9.tlh(19931) : error C2146: syntax error : missing ';' before identifier 'Connection'
..\debug\msacc9.tlh(19931) : error C2501: '_ConnectionPtr' : missing storage-class or type specifiers
..\debug\msacc9.tlh(19931) : error C2501: 'Connection' : missing storage-class or type specifiers
..\debug\msacc9.tlh(19981) : error C2146: syntax error : missing ';' before identifier 'GetConnection'
..\debug\msacc9.tlh(19981) : error C2501: '_ConnectionPtr' : missing storage-class or type specifiers
..\debug\msacc9.tlh(24391) : error C2143: syntax error : missing ';' before 'tag::id'
..\debug\msacc9.tlh(24391) : error C2501: '_ConnectionPtr' : missing storage-class or type specifiers
..\debug\msacc9.tlh(24391) : error C2497: '_ConnectionPtr' : 'implementation_key' can only be applied to function declarations
..\debug\msacc9.tlh(24391) : fatal error C1004: unexpected end of file found
Error executing cl.exe.
Когда закомментировал импорт msacc9 — все сработало как задумано. Вот чешу репу и думаю важно ли это. Извините, если что не так сказал — никогда этим не пользовался, просто потребовалось прочитать эксельский файл.
"Всегда внимательно изучайте файлы *.tlh. Отчасти они могут заменить документацию, а если её нет, то это единственный источник информации (кроме, конечно, OLE/COM Object Viewer)."
И не только для ознакомления.
Иногда в первых строчках содержится информация зависимостей данной библиотеки от других.
Например для #import "D:/Program Files/Microsoft Office/Office/MSWORD8.OLB" файл MSWORD8.tlh содержит
К счастью, исключения не будет в любом случае. К сожалению, некоторый текст в статье не соответствует примерам и требует корректировки. Правильно работающий объект и его правильное использование не должны возбуждать исключения, в примере для ADO это сделано и фразу "Например, метод MoveNext объекта Recordset ADO возвращает код, который не является ошибкой, а лишь индицирует о достижении конца набора записей." можно вполне считать obsolete :)
Здравствуйте, server_mouse, Вы писали:
_>Т.е. что-бы один ехе работал и с 97 и с 2000 офисом. _>#define это конечно класно, но не делать же два отдельных билда....
Чтобы все было универсально, не следует использовать директиву #import.
Обоснование: Технология COM изначально предназначена для того, чтобы обеспечить прозрачность размещения COM объектов. Поэтому использование явных межмодульных ссылок является даунгрейдом на концептуальном уровне. Если в приложении используются жесткие межмодульные ссылки, то это приложение фактически является монолитным, со всеми вытекающими отсюда последствиями типа DLL HELL и т.п.
К счастью, в случае MS Word можно обойтись диспинтерфейсами, используя позднее связывание. В этом случае также не нужно будет на каждый пук перекомпилировать по 12 MB исходников.
Есть грамотная либа, которая позволяет из VC++ работать с диспинтерфейсами практически на том же уровне комфорта, что и из VB. Попробуй из нее класс dispatch_w- это т.н. интеллектуальный указатель, специально для доступа к диспинтерфейсам, используя позднее связывание. В документации есть пример, как это сделать (в примере ведется работа с MSDEV IDE, в случае MS Office принцип тот же )
Re: Как в Excel поменять контекстное меню и обработать событ
Здравствуйте, server_mouse, Вы писали:
_>Т.е. что-бы один ехе работал и с 97 и с 2000 офисом. _>#define это конечно класно, но не делать же два отдельных билда....
Если ты соберешь софтину с использованием import и закомментируешь #define Uses_MSO2000
, то все будет работать и под 97 ,2000 и под 2003 офисы и пока Microsoft будет придерживаться
основного принцыпа в разработке COM объектов — "существующие интерфейсы не меняются —
для добавления функционала внедряются новые"
Именно благодаря этому игры юзающие DirectX 7.0 идут там где стоит DirectX 9.0.....
Так что при разработке учитывай самую раннюю версию сервера которы хочешь использовать и
все.....
ИТ>Авторы: ИТ> Игорь Ткачёв
ИТ>Аннотация: ИТ>В данной статье приводится объяснение работы директивы #import компилятора Visual C++ и даны примеры её использования с MS Word, MS Excel, ADO DB и ActiveX Control.
У меня Office 2003, там нет таких файлов как excel9.olb, mso9.dll. Похожих на них файлов тоже нет.
Скажите, что надо отметить при установке offic`а что бы они были ???
Здравствуйте, Богатырь, Вы писали:
Б>У меня Office 2003, там нет таких файлов как excel9.olb, mso9.dll. Похожих на них файлов тоже нет. Б>Скажите, что надо отметить при установке offic`а что бы они были ???
MS любит это дело менять... Наилучший для Вас "выход" ИМХО — это запустить OLE/COM Object Viewer и им все посмотреть. Вот у меня, например, "Microsoft Excel 11.0 Object Library (Ver 1.5)" наличествует в файле "XL5EN32.OLB", лежащем в "Microsoft Office\Office11".
[ posted via RSDN@Home 1.1.4 stable SR1 r568, accompanied by silence ]
Здравствуйте, Богатырь, Вы писали:
Б>У меня Office 2003, там нет таких файлов как excel9.olb, mso9.dll. Похожих на них файлов тоже нет. Б>Скажите, что надо отметить при установке offic`а что бы они были ???