Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > CodeGuard сравнение GUID


Автор: Alexeis 30.8.2012, 12:16
Доброго времени суток. Пишет что выхожу за рамки размера. Перепробовал несколько способов сравнения. Даже самый тупой
Код

__inline int IsEqualGUID2(REFGUID rguid1, REFGUID rguid2)
{
    return rguid1.Data1    == rguid2.Data1    && rguid1.Data2    == rguid2.Data2    &&
           rguid1.Data3    == rguid2.Data3    &&
           rguid1.Data4[0] == rguid2.Data4[0] && rguid1.Data4[1] == rguid2.Data4[1] &&
           rguid1.Data4[2] == rguid2.Data4[2] && rguid1.Data4[3] == rguid2.Data4[3] &&
           rguid1.Data4[4] == rguid2.Data4[4] && rguid1.Data4[5] == rguid2.Data4[5] &&
           rguid1.Data4[6] == rguid2.Data4[6] && rguid1.Data4[7] == rguid2.Data4[7];
}


Обычно я игнорю эту ошибку, но в данном случае из-за частых ошибок этого типа CodeGuard сваливается в дедлок и глушит мне сразу 3 потока (локи внутри его внутренних вызовов). 

Кто-то поборол у тебя проблему со сравниваниями Гуидов? 

Автор: artsb 30.8.2012, 13:13
А так не работает:
Код

bool IsEqualGUID2(REFGUID rguid1, REFGUID rguid2)
{
    return (memcmp(rguid1, rguid2, sizeof(GUID)) == 0);
}

?

Есть ещё апишная функция - http://msdn.microsoft.com/en-us/library/ms680575%28VS.85%29.aspx.

Автор: Alexeis 30.8.2012, 13:40
artsb, это исходный варант. 
Апишной функции такой нет. Она реализована в заголовке следующим образом 
Код

__inline int InlineIsEqualGUID(REFGUID rguid1, REFGUID rguid2)
{
   return (
      ((unsigned long *) &rguid1)[0] == ((unsigned long *) &rguid2)[0] &&
      ((unsigned long *) &rguid1)[1] == ((unsigned long *) &rguid2)[1] &&
      ((unsigned long *) &rguid1)[2] == ((unsigned long *) &rguid2)[2] &&
      ((unsigned long *) &rguid1)[3] == ((unsigned long *) &rguid2)[3]);
}

__inline int IsEqualGUID(REFGUID rguid1, REFGUID rguid2)
{
    return !memcmp(&rguid1, &rguid2, sizeof(GUID));
}

Автор: artsb 30.8.2012, 13:58
Цитата(Alexeis @  30.8.2012,  13:40 Найти цитируемый пост)
Она реализована в заголовке следующим образом 

Она тоже отказывается работать?

И ещё вопрос: ошибка происходит постоянно или систематически?

У меня вот это работает:
Код

    GUID guid1, guid2;

    memset(&guid1, 0, sizeof(GUID));
    memset(&guid2, 0, sizeof(GUID));

    if(CoCreateGuid(&guid1) != S_OK)
    {
        return;
    }

    // equal
    memcpy(&guid2, &guid1, sizeof(GUID));
    // not equal
//    if(CoCreateGuid(&guid2) != S_OK)
//    {
//        return;
//    }

    int res;

    res = IsEqualGUID(guid1, guid2);

Использую Embarcadero RadStudio XE.

Автор: Alexeis 30.8.2012, 14:49
Цитата(artsb @  30.8.2012,  14:58 Найти цитируемый пост)
И ещё вопрос: ошибка происходит постоянно или систематически?

На каждом вызове. Попробуй вызвать memcmp .

Автор: artsb 30.8.2012, 15:15
Вот так работает:
Код

    GUID guid1, guid2;

    memset(&guid1, 0, sizeof(GUID));
    memset(&guid2, 0, sizeof(GUID));

    if(CoCreateGuid(&guid1) != S_OK)
    {
        return;
    }

    memcpy(&guid2, &guid1, sizeof(GUID));

//    if(CoCreateGuid(&guid2) != S_OK)
//    {
//        return;
//    }

    int res;

    res = memcmp(&guid1, &guid2, sizeof(GUID)); //IsEqualGUID(guid1, guid2);

Кстати, я создал VCL-проект.

Автор: Alexeis 30.8.2012, 15:28
artsb,  CodeGuard точно включен? (не путать с CodeGear smile ) Дело в том, что я проверял на нескольких версиях. И везде тоже самое.

Автор: artsb 30.8.2012, 16:02
Был выключен.
Включил его в Project > Options > C++ Compiler > Debugging
И поставил все галочки, которые там были.

Последний пример отработал без ошибок.

Автор: Alexeis 30.8.2012, 16:10
Хм.. возможно дело в константах. А если сделать
Код

   IsEqualGUID(__uuidof(IUnknown),   __uuidof(IUnknown))

? 

Автор: artsb 30.8.2012, 20:11
Отработало:
Код

res = IsEqualGUID(__uuidof(IUnknown), __uuidof(IUnknown));


Добавлено через 2 минуты и 54 секунды
А вот со включённым CodeGuard - нет. Такая же ошибка как и у вас. Причём, если один из аргументов функции заменить на реальный GUID - всё ок.

Добавлено через 9 минут и 49 секунд
С memcmp() такая же ситуация.

Автор: Alexeis 31.8.2012, 01:08
  В принципе, вариант для версии с кодегардом записывать данные в промежуточную переменную, чтобы не вызывать исключение и иметь возможность отлаживаться. Где-то в хелпе находил специальный дефайн когдегардовский. 

Автор: artsb 31.8.2012, 07:59
Да. Вот так работает:
Код

    GUID guid1, guid2;

    memset(&guid1, 0, sizeof(GUID));
    memset(&guid2, 0, sizeof(GUID));

    guid1 = __uuidof(IUnknown);
    guid2 = __uuidof(IUnknown);

    int res;

    res = IsEqualGUID(guid1, guid2);
    res = (guid1 == guid2);

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)