Здравствуйте, Tom, Вы писали:
Tom>Здравствуйте, 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>>
Tom>А почему бы тебе в методе Next получать не по одному елементу, а целый массив ? И проверять надо на S_FALSE.
Можно пример кода?