P>Только работает медленнее. Может есть идея как ускорить?
В Next получай сразу все значения. Т.е
pVar = new VARIANT[spDestinationDoc->Revisions->Count] и затем это в Next... В общем как это делать я уже писал выше
Вопрос может не совсем в тему, но я не знаю куда обратиться. Дело в следующем. Пытаюсь из Visual C++ сравнивать Word документы. В принципе, все нормальнло, до тех пор пока не надо работать с коллекциями ревизий (Word::RevisionsPtr). А тут-то и наступает темная ночь. Как нормально пройтись по этой коллекии.
Вариант 1:
Во-первых, если ревизий много — работает очень медленно!!!(Очень!!!). Во-вторых, на Word 2000 количество может быть, к примеру, 10, а реально в коллекции 4-5 ревизий, причем с абсолютно рандомными индексами!
При попытке взять ревизию может просто крахнуться.
Здравствуйте, paharelau, Вы писали:
P>Привет всем!
P>Вопрос может не совсем в тему, но я не знаю куда обратиться. Дело в следующем. Пытаюсь из Visual C++ сравнивать Word документы. В принципе, все нормальнло, до тех пор пока не надо работать с коллекциями ревизий (Word::RevisionsPtr). А тут-то и наступает темная ночь. Как нормально пройтись по этой коллекии. P>Вариант 1:
P> P>
P>Полная задница!!!
P>Во-первых, если ревизий много — работает очень медленно!!!(Очень!!!). Во-вторых, на Word 2000 количество может быть, к примеру, 10, а реально в коллекции 4-5 ревизий, причем с абсолютно рандомными индексами! P>При попытке взять ревизию может просто крахнуться.
P>Вариант 2:
P> P>
P> P>В принципе это работает, пока не сравниваются 2 абсолютно разных документа. Иначе на Word XP входит в бесконечный цикл.
P>Вопрос, может кто сталкивался с работой с ревизиями. Буду благодарен любым идеям и предложениям.
P>
А почему бы тебе в методе Next получать не по одному елементу, а целый массив ? И проверять надо на S_FALSE.
Здравствуйте, Tom, Вы писали:
Tom>Здравствуйте, paharelau, Вы писали:
P>>Привет всем!
P>>Вопрос может не совсем в тему, но я не знаю куда обратиться. Дело в следующем. Пытаюсь из Visual C++ сравнивать Word документы. В принципе, все нормальнло, до тех пор пока не надо работать с коллекциями ревизий (Word::RevisionsPtr). А тут-то и наступает темная ночь. Как нормально пройтись по этой коллекии. P>>Вариант 1:
P>> P>>
P>>Полная задница!!!
P>>Во-первых, если ревизий много — работает очень медленно!!!(Очень!!!). Во-вторых, на Word 2000 количество может быть, к примеру, 10, а реально в коллекции 4-5 ревизий, причем с абсолютно рандомными индексами! P>>При попытке взять ревизию может просто крахнуться.
P>>Вариант 2:
P>> P>>
P>> P>>В принципе это работает, пока не сравниваются 2 абсолютно разных документа. Иначе на Word XP входит в бесконечный цикл.
P>>Вопрос, может кто сталкивался с работой с ревизиями. Буду благодарен любым идеям и предложениям.
P>>
Tom>А почему бы тебе в методе Next получать не по одному елементу, а целый массив ? И проверять надо на S_FALSE.
Здравствуйте, paharelau, Вы писали:
P>Здравствуйте, Tom, Вы писали:
P>>>Можно пример кода?
Tom>>Примерно так, но я ессно не компилировал Tom>>
Tom>>VARIANT varRev[12345];
Tom>>ULONG celtFetched;
Tom>>HRESULT hr;
Tom>>//Тут проинициализировать весь массив вариантов
Tom>>do
Tom>>{
Tom>> celtFetched = 0; //Обнулить на всякий случай
Tom>> hr = pNewEnum->Next(12345, &varRev, &celtFetched);
Tom>>
Tom>> if ((hr = S_OK) && (celtFetched))
Tom>> {
Tom>> //тут проверяй свои елементы массива,
Tom>> //только столько членов, сколько вернулось в celtFetched
Tom>> }
Tom>>} while (celtFetched)
Tom>>
P>
P>
P> IUnknownPtr spUnk = spDestinationDoc->Revisions->Get_NewEnum();
P> CComQIPtr<IEnumVARIANT, &IID_IEnumVARIANT> pNewEnum = spUnk;
P>
P> ULONG celtFetched;
P> HRESULT hr;
P> do
P> {
P> VARIANT varRev[1024];
P> for (long l=0; l<1024; l++)
P> VariantInit(&varRev[l]);
P> celtFetched = 0; //Обнулить на всякий случай
P> hr = pNewEnum->Next(1024, varRev, &celtFetched);
P> if (celtFetched)
P> {
P> TRACE0("\n");
P> //тут проверяй свои елементы массива,
P> //только столько членов, сколько вернулось в celtFetched
P> }
P> } while (celtFetched);
P>
P> Уходит на бесконечный цикл...
Забыл сказать. Это происходит в случае абсолютно различных документов на Word XP. Если документы призошли один от другого — все работает корректно, т.е. то что и было
Скорее всего он просто возвращает пустые варианты. Вставь ещё проверку на то, что варианты не пустые.
IUnknownPtr spUnk = spDestinationDoc->Revisions->Get_NewEnum();
CComQIPtr<IEnumVARIANT, &IID_IEnumVARIANT> pNewEnum = spUnk;
pNewEnum->Reset();
ULONG celtFetched;
HRESULT hr;
bool bArrayEmpty;
VARIANT varRev[1024];
do
{
/*
Инициализация
*/for (long l=0; l<1024; l++)
VariantInit(&varRev[l]);
celtFetched = 0;
bArrayEmpty = true;
/*
Получаем коллекцию
*/
hr = pNewEnum->Next(1024, varRev, &celtFetched);
/*
Проверяем результат
*/if (celtFetched)
{
/*
Проходимся по всем вариантам, которые нам вернули,
и если хотя бы один из них не пустой, то делаем чё надо
*/for (long l=0; l<celtFetched; l++)
if varRev[l].vt <> VT_EMPTY
{
bArrayEmpty = false;
//Делаем полезную работу здесьbreak;
}
}
} while ((celtFetched) && (!bArrayEmpty));
А может у тебя количества Ревизий увеличиваются (или изменяется) после каждого действия с документами? Сам я с этим не работал, сразу извиняюсь за возможную глупость. Но это очень похоже на реализацию реакции на изменение чего-то, в которой это что-то изменяется.
Если это так, то правильно советует Tom — считай все ревизии и все характеристики этих ревизий у одного документа, потом у другого и затем сравнивай или делай то, что нужно.
P>>Только работает медленнее. Может есть идея как ускорить? Tom>В Next получай сразу все значения. Т.е Tom>pVar = new VARIANT[spDestinationDoc->Revisions->Count] и затем это в Next... В общем как это делать я уже писал выше
Все это работает только в случае если документ — это измененный базовый. Иначе мы получаем массив, но не тот! Все ревизии имеют тип Word::wdNoRevision.
P>Все это работает только в случае если документ — это измененный базовый. Иначе мы получаем массив, но не тот! Все ревизии имеют тип Word::wdNoRevision.
Так вроде так и должно быть. Revisions Collection — это же коллекция изменений.
A collection of Revision objects that represent the changes marked with revision marks in a range or document.