Здравствуйте, paharelau, Вы писали:
P>Привет всем!
P>Вопрос может не совсем в тему, но я не знаю куда обратиться. Дело в следующем. Пытаюсь из Visual C++ сравнивать Word документы. В принципе, все нормальнло, до тех пор пока не надо работать с коллекциями ревизий (Word::RevisionsPtr). А тут-то и наступает темная ночь. Как нормально пройтись по этой коллекии.
P>Вариант 1:
P>
P>P>...
P>Word::RevisionPtr spRevisions =...;
P>long lCount = spRevision->GetCount();
P>for(long it = 1L; it<=lCount; it++)
P>{
P> Word::RevisionPtr = spRevisions->Item(it)
P> ...
P>}
P>...
P>
P>Полная задница!!!
P>Во-первых, если ревизий много — работает очень медленно!!!(Очень!!!). Во-вторых, на Word 2000 количество может быть, к примеру, 10, а реально в коллекции 4-5 ревизий, причем с абсолютно рандомными индексами!
P>При попытке взять ревизию может просто крахнуться.
P>Вариант 2:
P>
P>P> Word::_DocumentPtr doc = ...;
P> IUnknownPtr spUnk = doc->Revisions->Get_NewEnum();
P> CComQIPtr<IEnumVARIANT, &IID_IEnumVARIANT> pNewEnum = spUnk;
P> Word::RevisionPtr spRevision;
P> VARIANT varRev;
P> ::VariantInit(&varRev);
P> while (pNewEnum->Next(1, &varRev, NULL) == S_OK)
P> {
P> ASSERT (varRev.vt == VT_DISPATCH);
P> spRevision = varRev.pdispVal;
P> ::VariantClear(&varRev);
P> ...
P> }
P>
P>
P>В принципе это работает, пока не сравниваются 2 абсолютно разных документа. Иначе на Word XP входит в бесконечный цикл.
P>Вопрос, может кто сталкивался с работой с ревизиями. Буду благодарен любым идеям и предложениям.
P>
А почему бы тебе в методе Next получать не по одному елементу, а целый массив ? И проверять надо на S_FALSE.