Re[6]: Add-in в Ворде 2000 работает, а в Ворде97 нет!!!!
От: Dmitriy Yakovlev Украина www.prof-uis.com
Дата: 18.10.04 13:28
Оценка: 12 (2)
Здравствуйте, 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
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.