Здравствуйте, globus, Вы писали:
G>Здравствуйте, Dmitriy Yakovlev, по ходу приспосабливания своего аддина под Ворд появились новые к Вам вопросы.
G>В своем проекте подключаю с помощью директивы #import нужную вордовскую тайп либу (MSWORD.OLB). Ну и работаю через смарт-поинтеры. Так мне проще
Возникла одна ситуация, ниже кусок кода:
G>G>MSWORD::_ApplicationPtr spApp = m_spApp;
G>MSWORD::_DocumentPtr spDoc = spApp->GetActiveDocument();
G>_variant_t vt(1);
G>int cnt = spDoc->GetHyperlinks()->GetCount();
G>MSWORD::HyperlinkPtr spLink = spDoc->GetHyperlinks()->Item(&vt);
G>// сначада использовал
G>// bstr_t bstrAddress = GetAddress();
G>BSTR bstr = NULL;
G>HRESULT hr = spLink->get_Address(&bstr);
G>
G>В ХР офисе на этом месте все нормально, в 97 spLink не NULL (смотрю через Watch m_pInterface = 0x02e5973c и все вроде на месте). cnt = 17 (17 гиперлиннок в документе).
G>И в ДебагВью вижу:
G>G>First-chance exception at 0x00000000 in WINWORD.EXE: 0xC0000005: Access violation reading location 0x00000000.
G>First-chance exception at 0x7c81eb33 in WINWORD.EXE: 0x80010105: The server threw an exception.
G>
G>Это hr в Watch-е
G>G>hr 0x80010105 The server threw an exception. HRESULT
G>
G>Тут я подумал, что нельза наверное подключать ТайпЛибы от 2000 офиса 97 офису. Если так, то к Вам вопрос — ка тогда быть, делать ли отдельно для 97 офиса все? я видел в Ваших предыдущих постах код:
G>G>#ifdef __OFFICE_97
DY>> pCBButton->OnAction = _bstr_t(_T("OnCmd"));
DY>>#endif // __OFFICE_97
G>
G>значит у Вас отдельный билд для 97 офиса.
G>И Вы так же само подключаете ТайпЛибы (через #define __OFFICE_97) ?
G>Я думаю Вы поняли мою проблему, в двох словах — Как надо сделать чтобы работало и в 2000 и в 97 офисе. Но если другие тайплибы, то ведь код совсем другой получется — это ж надо будет с другого неймспейса выбирать интерфейсы. Или возможно, Вы сразу ОЛБ 8 версии подключали и таким образом у Вас работает аддин везде. Да если это так, прийдется переписывать
ух-как не хочется то
G>Уже уверен на 90% что Вы наверное подключали msword8.olb
И зачем я 2000 то подключал ....
G>Заранее Вам благодарен!!!
Да Вы абсолютно правы!
У меня есть возможность делать для каждой версии офиса свой билд. Хотя реально для 2000, XP и 2003 я использую один и тот же билд с тайплибами от 2000. А вот для офиса 97 у меня отдельный билд с тайплибами именно от 97 офиса. Насчет совсем другого кода — это громко сказано! на самом деле там набор объектов и методов практически один в один такой же как и в 2000 и некоторые отличия элементарно поправляются при помощи @ifdef...#endif, я и сам не знаю почему я решил делать отдельный билд, просто показалось что так лучше будет. Проект у меня довольно большой, но чтобы все компилировалось под 97 у меня ушло ну может быть день работы. Основное время ушло на переделку кода для MS Access (работа с Reports), хотя у меня так и не получилось подключить его позже

Я Вам рекомендую делать также 2 билда, так как если все сделать на тайплибах от 97 то работать оно будет везде! но вот только придется работать через макросы!!! А это очень существенное ограничение, ведь юзер может настроить политику безопасности так, что макросы будут отключены и тогда ...
А неймспейсы там отличаются только некоторыми классами, я воспользовался директивой #define чтобы привести их название к такому же названию как и в 2000 и выше, поэтому ничего переделавать мне не пришлось!
#if (defined __OFFICE_97) // Office 97
#import "D:\Program Files\Common Files\Designer\msaddndr.dll" \
raw_interfaces_only, \
raw_native_types, \
no_namespace, \
named_guids
#import "D:\Program Files\Microsoft Office\Office\mso97.dll" \
rename_namespace("Office")
#import "D:\Program Files\Common Files\Microsoft Shared\VBA\VBEEXT1.olb"
#define _CommandBarButtonEvents VBIDE::_CommandBarControlEvents
#define _CommandBarsEvents VBIDE::CommandBarEvents
#define _CommandBarsPtr Office::CommandBarsPtr
#define _CommandBarButtonPtr Office::CommandBarButtonPtr
// access
#pragma message(" Linking with MS Access")
#import "D:\Program Files\Microsoft Office\Office\msacc8.olb" \
raw_interfaces_only \
rename("SHIFT_MASK","SHIFT_MASK_X") \
rename("CTRL_MASK","CTRL_MASK_X") \
rename("ALT_MASK","ALT_MASK_X") \
rename("LEFT_BUTTON","LEFT_BUTTON_X") \
rename("RIGHT_BUTTON","RIGHT_BUTTON_X") \
rename("MIDDLE_BUTTON","MIDDLE_BUTTON_X") \
rename("Property","IDispatch")
#import "d:\Program Files\Common Files\Microsoft Shared\dao\dao360.dll" \
rename("EOF","_EOF")
// excel
#pragma message(" Linking with MS Excel")
#import "D:\Program Files\Microsoft Office\Office\excel8.olb" \
rename("DialogBox","_DialogBox"), \
rename("RGB","_RGB")
// outlook
#pragma message(" Linking with MS Outlook")
#import "D:\Program Files\Microsoft Office\office\msoutl8.olb" \
rename("IPage","IDispatch") \
rename("Font","IFont")
// power point
#pragma message(" Linking with MS PowerPoint")
#import "D:\Program Files\Microsoft Office\office\msppt8.olb"
// word
#pragma message(" Linking with MS Word")
#import "D:\Program Files\Microsoft Office\office\msword8.olb" \
rename("ExitWindows", "_ExitWindows")
#endif