SetColor() в IDA 5.2

Тема в разделе "WASM.BEGINNERS", создана пользователем GoldFinch, 22 авг 2008.

  1. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    В IDA 5.2 функция IDC SetColor(), при нажатии hotkey'я, визуально не изменяет цвет, хотя в базе изменение цвета прописывается.

    Подробнее:
    Код (Text):
    1. static _ToggleColor(void) {
    2. auto c,ea,r;
    3. ea=ScreenEA();
    4. c=GetColor(ea,1);
    5. if (c==0xFFFFFF) {c=0xFFE0E0;} else {c=0xFFFFFF;};
    6. r=SetColor(ea,1,c);
    7. Message("r=%d, c=%x\n",r,c);
    8. }
    В командной строке или окне ввода idc-команд (Shift-F2) _ToggleColor(), переключает цвет, выводит "r=1, с=FF...".
    После установки хоткея, AddHotkey("*","_ToggleColor"), жму [*], выводится "r=1, с=FF...", цвет не переключается, хотя функция SetColor() выполняется успешно. Закрываю и открываю файл - отображается нужный цвет. Также цвет отображается при открытии-закрытии диалогов настроек.

    Как пофиксить?
     
  2. Sergey_R

    Sergey_R Member

    Публикаций:
    0
    Регистрация:
    9 янв 2005
    Сообщения:
    138
    До выполнения функции элемент, на котором стоит курсор, как правило, имеет цвет
    #define DEFCOLOR 0xFFFFFFFF // Default color

    Как следствие, при _первом_ выполнении
    c=GetColor(ea,1);
    ты получаешь 'c==0xFFFFFFFF', а _не_ 'c==0xFFFFFF' со всеми вытекающими.

    Обнули старший байт перед проверкой:
    if ((c&0xFFFFFF)==0xFFFFFF) {c=0xFFE0E0;} else {c=0xFFFFFF;};
     
  3. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    Sergey_R, во-первых начальное значение цвета никак не влияет на логику алгоритма, а во-вторых неплохо бы проверять свои солюшены перед тем как их постить.
     
  4. reverser

    reverser New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2004
    Сообщения:
    615
    В 5.3 код работает. Думаю, просто не обновляется экран. Попробуй вызвать Jump(here) или Refresh() в конце.
     
  5. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    Спасибо, Refresh() помог.

    ЗЫ: про "here" почемуто в хелпе ИДЫ ни слова оО
     
  6. reverser

    reverser New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2004
    Сообщения:
    615
    idc.idc:
    #define here ScreenEA()