Как выдрать словарь синонимов из ВордаХР
статье с rsdn.ru.
Вот пример. Собиралось и работало под MSVC 6.0 SP6 + Word 2003. Переделка из примера к
// word.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
// Тут импорты для Word 2003
#pragma warning(disable : 4146)
#import "E:\Program Files\Common Files\Microsoft Shared\OFFICE11\mso.dll"
#pragma warning(default : 4146)
#import "e:\Program Files\Common Files\Microsoft Shared\VBA\VBA6\VBE6EXT.OLB"\
exclude("CommandBars")
#import "e:\Program Files\Microsoft Office\Office11\MSWORD.OLB"\
rename("ExitWindows","_ExitWindows")
void TraverseWordList(_variant_t vtList)
{
SAFEARRAY* pArr = vtList.parray;
BSTR HUGEP *pBSTR;
SafeArrayAccessData(pArr, (void HUGEP**)&pBSTR);
UINT i, nElem = pArr->rgsabound->cElements;
if (!nElem) printf("<empty list>\n");
for (i = 0; i < nElem; i++)
{
_bstr_t tmpBstr(pBSTR[i], FALSE);
char buf[1024];
sprintf(buf, "%s\n", (LPCTSTR)tmpBstr);
CharToOem(buf, buf);
printf(buf);
}
SafeArrayUnaccessData(pArr);
}
void main
{
::CoInitialize(NULL);
try {
using namespace Word;
_ApplicationPtr wordApp(L"Word.Application");
wordApp->Visible = true;
wordApp->Activate;
_DocumentPtr wordDoc = wordApp->Documents->Add;
wordApp->Selection->PutText("коса"); // вот оно, наше тестовое слово
BOOL IsInfoFound = wordApp->Selection->Range->SynonymInfo->Found;
if (IsInfoFound) {
LONG meaningCount = wordApp->Selection->Range->SynonymInfo->MeaningCount;
printf("Meanings count from [Word.SynonymInfo.MeaningCount]:\n%d\n", meaningCount);
_variant_t meaList = wordApp->Selection->Range->SynonymInfo->MeaningList;
printf("List of meanings from [Word.SynonymInfo.MeaningList]:\n");
TraverseWordList(meaList);
LONG nMeaning;
for(nMeaning = 1L; nMeaning <= meaningCount; nMeaning++)
{
_variant_t synList = wordApp->Selection->Range->SynonymInfo->SynonymList[&_variant_t(nMeaning)];
printf("List of synonyms from [Word.SynonymInfo.SynonymList] for meaning #%d:\n", nMeaning);
TraverseWordList(synList);
}
_variant_t relList = wordApp->Selection->Range->SynonymInfo->RelatedWordList;
printf("Related words list from [Word.SynonymInfo.RelatedWordList]:\n");
TraverseWordList(relList);
_variant_t antList = wordApp->Selection->Range->SynonymInfo->AntonymList;
printf("Antonym words list from [Word.SynonymInfo.AntonymList]:\n");
TraverseWordList(antList);
}
else{
printf("No synonyms was found!\n");
}
long wordDontSave = 0;
wordApp->Quit(&_variant_t(wordDontSave;
} catch (_com_error& er) {
char buf[1024];
sprintf(buf,"_com_error:\n"
"Error : %08lX\n"
"ErrorMessage: %s\n"
"Description : %s\n"
"Source : %s\n",
er.Error
(LPCTSTR)_bstr_t(er.ErrorMessage
(LPCTSTR)_bstr_t(er.Description
(LPCTSTR)_bstr_t(er.Source;
CharToOem(buf,buf);
printf(buf);
}
::CoUninitialize;
}
Спасибо!
А если не секрет, где нашёл доки к этому всему? в МСДН и на том сайте?
А если не секрет, где нашёл доки к этому всему?
Во-первых MSDN, да. Набираешь там "Word 2000 object model" и попадаешь на картинку, где модель эта показана. Во-вторых, если в Worde нажать Alt+F11, откроется редактор VBA. В нём есть Object Browser, который показывает, какие объекты какими свойствами / методами обладают. Можно тут же всё быстренько попробовать на VBA, а потом уже, если надо, перенести на другой язык, скажем C++. И ещё help у редактора VBA содержит описание объектной модели Offic'а.
Спасибо!
Оставить комментарий
margadon
Заметил в контекстном меню WordXP пункт Синонимы. Родилась идея написать прогу (например через COM которая бы определяла синонимы данного слова посредством ворда. А вот как добраться до этого метода?! Перерыл весь МСДН, но вполне вероятно, что руки кривы...