Поиск:

Ответ в темуСоздание новой темы Создание опроса
> CodeGuard сравнение GUID, ошибка access overrun 
V
    Опции темы
Alexeis
Дата 30.8.2012, 12:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 26
Всего: 459



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

__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 потока (локи внутри его внутренних вызовов). 

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


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
artsb
Дата 30.8.2012, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



А так не работает:
Код

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

?

Есть ещё апишная функция - IsEqualGUID.


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
Alexeis
Дата 30.8.2012, 13:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 26
Всего: 459



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));
}



--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
artsb
Дата 30.8.2012, 13:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



Цитата(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.


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
Alexeis
Дата 30.8.2012, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 26
Всего: 459



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

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


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
artsb
Дата 30.8.2012, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



Вот так работает:
Код

    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-проект.


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
Alexeis
Дата 30.8.2012, 15:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 26
Всего: 459



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


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
artsb
Дата 30.8.2012, 16:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



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

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


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
Alexeis
Дата 30.8.2012, 16:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 26
Всего: 459



Хм.. возможно дело в константах. А если сделать
Код

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




--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
artsb
Дата 30.8.2012, 20:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



Отработало:
Код

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


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

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


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
Alexeis
Дата 31.8.2012, 01:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 26
Всего: 459



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


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
artsb
Дата 31.8.2012, 07:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



Да. Вот так работает:
Код

    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);



--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0883 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.