Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Процедура генерации пароля 
V
    Опции темы
StillPhelix
Дата 6.1.2016, 17:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 6.1.2016

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



Неработает процедура генерации пароля. Это строки 25-30.
Код

BOOL CALLBACK CrDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    char buffer[] = "";
    HWND hEditBox;
    WORD twoChar;
    unsigned char ch;
    char calcCode[] = "";
    char userInputCode[] = "";
    int lenText;
    
    switch (uMsg)
    {
    case WM_COMMAND:
        switch (LOWORD(wParam))
        {
        case IDOK:
            hEditBox = GetDlgItem(hDlg, IDC_USER_NAME);
            lenText=Edit_GetTextLength(hEditBox);
            GetWindowText(hEditBox, buffer, lenText+1);
            if ((GetWindowTextLength(hEditBox)+1)<0xA)
            {
                MessageBox(hDlg, "Your name too short!", "Error", MB_OK | MB_ICONSTOP);
                return false;
            }
            for (int i = 0; i<lenText+1; i++)
            {
                twoChar = (WORD)buffer[i]*buffer[i+1];//при пошаговом прохождении это пропускается
                ch=twoChar % 0x20 + 'A';//при пошаговом прохождении это пропускается
                calcCode[i]=ch;//А тут что-то делается. Что тут можно накопить, если предыдущие 2 строки пропущены
            }

            hEditBox = GetDlgItem(hDlg, IDC_EDIT1);
            lenText=Edit_GetTextLength(hEditBox);
            GetWindowText(hEditBox, userInputCode, lenText+1);
            if (calcCode == userInputCode)
            {
                MessageBox(hDlg, "Password OK.", "Info", MB_OK | MB_ICONASTERISK);
                return false;
            } 
            else
            {
                MessageBox(hDlg, "Wrong Password!", "Error", MB_OK | MB_ICONSTOP);
                SendMessage(hEditBox, EM_SETSEL, 0, -1);
            }
            break;

        case IDCANCEL:
            EndDialog(hDlg, 0);
            return true;
        }
        break;
    }
    return false;
}

PM MAIL   Вверх
feodorv
Дата 6.1.2016, 19:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 9
Всего: 45



Цитата(StillPhelix @  6.1.2016,  17:46 Найти цитируемый пост)
Неработает процедура генерации пароля.

В каком смысле "не работает"?


Цитата(StillPhelix @  6.1.2016,  17:46 Найти цитируемый пост)
//А тут что-то делается. Что тут можно накопить, если предыдущие 2 строки пропущены

Наверняка Вы компилите с оптимизацией, тогда Ваши три строки просто эквивалентны одной:
Код
                calcCode[i]= ((WORD)buffer[i]*buffer[i+1]) % 0x20 + 'A';
Вряд ли в ней делается что-то не то, всё должно вычисляться, но да, оптимизация съела две первые строки (которые Вы и не видите при пошаговом просмотре), дело обычное.


Замечания по коду.

Цитата(StillPhelix @  6.1.2016,  17:46 Найти цитируемый пост)
            for (int i = 0; i<lenText+1; i++)
Здесь очень нехороший +1, так как ниже идёт обращение к buffer[i+1], что даёт выход за пределы строки (на один байт после '\0').


Цитата(StillPhelix @  6.1.2016,  17:46 Найти цитируемый пост)
   char buffer[] = "";
Такой подход - это просто безобразие. Как Вы думаете, сколько байт выделено под буфер? (И обязана ли эта память быть доступной на запись?) Ниже совершенно безосновательно считается, что буфер вмещает как минимум lenText+1 байт, что совершенно не верно. То же касается массивов calcCode и userInputCode.


Цитата(StillPhelix @  6.1.2016,  17:46 Найти цитируемый пост)
          lenText=Edit_GetTextLength(hEditBox);
            GetWindowText(hEditBox, buffer, lenText+1);
            if ((GetWindowTextLength(hEditBox)+1)<0xA)
Чему верить, Edit_GetTextLength(hEditBox) или GetWindowTextLength(hEditBox)? И если это одно и тоже, то зачем тогда оно два раза?

Добавлено через 8 минут и 20 секунд
Цитата(StillPhelix @  6.1.2016,  17:46 Найти цитируемый пост)
            if (calcCode == userInputCode)
Так строки не сравниваются. Так сравниваются указатели (которые, очевидно, различные).



--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
StillPhelix
Дата 6.1.2016, 20:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 6.1.2016

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



Цитата

В каком смысле "не работает"?

Не заполняется массив calcCode[i]
Цитата

Такой подход - это просто безобразие. Как Вы думаете, сколько байт выделено под буфер? (И обязана ли эта память быть доступной на запись?) Ниже совершенно безосновательно считается, что буфер вмещает как минимум lenText+1 байт, что совершенно не верно. То же касается массивов calcCode и userInputCode.

Буфер должен быть динамическим. Неизвестно, сколько символов будет введено в TextEdit. Как правильно определить/установить его размер?
Цитата

Так строки не сравниваются. Так сравниваются указатели (которые, очевидно, различные).

strcmp не работает тоже.
а после 
Код

GetWindowText(hEditBox, userInputCode, lenText+1);

это строка 34, заполняются все массивы. этого не должно быть.
PM MAIL   Вверх
StillPhelix
Дата 6.1.2016, 20:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 6.1.2016

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



Исправил. Текст ниже. Теперь цикл генератора 
Код

for (int i = 0; i<lenText; i++)
 заполняет почему-то все буферы (наверно не правильно определил размер), а 
Код

GetWindowText(hEditBox, userInputCode, lenText+1);
 не копирует текст из поля в буфер. И не вызывается MessageBox.
Код

BOOL CALLBACK CrDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    
    char buffer[] = "";
    HWND hEditBox;
    WORD twoChar;
    unsigned char ch;
    char calcCode[] = "";
    char userInputCode[] = "";
    int lenText;
    
    switch (uMsg)
    {
    case WM_COMMAND:
        switch (LOWORD(wParam))
        {
        case IDOK:
            hEditBox = GetDlgItem(hDlg, IDC_USER_NAME);
            lenText = Edit_GetTextLength(hEditBox);
            GetWindowText(hEditBox, buffer, lenText+1);
            if ((lenText+1)<0xA)
            {
                MessageBox(hDlg, "Your name too short!", "Error", MB_OK | MB_ICONSTOP);
                return false;
            }
            for (int i = 0; i<lenText; i++)
            {
                twoChar = buffer[i]*buffer[i+1];
                ch = twoChar % 0x20 + 'A';
                calcCode[i] = ch;
            }

            hEditBox = GetDlgItem(hDlg, IDC_EDIT1);
            lenText=Edit_GetTextLength(hEditBox);
            GetWindowText(hEditBox, userInputCode, lenText+1);
            if (strcmp(calcCode,userInputCode))
            {
                MessageBox(hDlg, "Password OK.", "Info", MB_OK | MB_ICONASTERISK);
                return false;
            } 
            else
            {
                MessageBox(hDlg, "Wrong Password!", "Error", MB_OK | MB_ICONSTOP);
                SendMessage(hEditBox, EM_SETSEL, 0, -1);
            }
            break;

        case IDCANCEL:
            EndDialog(hDlg, 0);
            return true;
        }
        break;
    }
    return false;
}

PM MAIL   Вверх
StillPhelix
Дата 6.1.2016, 21:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 6.1.2016

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



Рабочий код (не работает только 
Код

SendMessage(hEditBox, EM_SETSEL, 0, -1);
Почему?):
Код

BOOL CALLBACK CrDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    
    char buffer[MAX_LEN] = "";
    HWND hEditBox;
    WORD twoChar;
    unsigned char ch;
    char calcCode[MAX_LEN] = "";
    char userInputCode[MAX_LEN] = "";
    int lenText;
    
    switch (uMsg)
    {
    case WM_COMMAND:
        switch (LOWORD(wParam))
        {
        case IDOK:
            hEditBox = GetDlgItem(hDlg, IDC_USER_NAME);
            lenText = Edit_GetTextLength(hEditBox);
            GetWindowText(hEditBox, buffer, lenText+1);
            if ((lenText+1)<0xA)
            {
                MessageBox(hDlg, "Your name too short!", "Error", MB_OK | MB_ICONSTOP);
                return false;
            }
            for (int i = 0; i<lenText; i++)
            {
                twoChar = buffer[i]*buffer[i+1];
                ch = twoChar % 0x20 + 'A';
                calcCode[i] = ch;
            }

            hEditBox = GetDlgItem(hDlg, IDC_EDIT1);
            lenText=Edit_GetTextLength(hEditBox);
            GetWindowText(hEditBox, userInputCode, lenText+1);
            if (strcmp(calcCode,userInputCode))
            {
                MessageBox(hDlg, "Wrong Password!", "Error", MB_OK | MB_ICONSTOP);
                SendMessage(hEditBox, EM_SETSEL, 0, -1);
            } 
            else
            {
                MessageBox(hDlg, "Password OK.", "Info", MB_OK | MB_ICONASTERISK);
                return false;
            }
            break;

        case IDCANCEL:
            EndDialog(hDlg, 0);
            return true;
        }
        break;
    }
    return false;
}

PM MAIL   Вверх
feodorv
Дата 7.1.2016, 11:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 9
Всего: 45



Цитата(StillPhelix @  6.1.2016,  21:17 Найти цитируемый пост)
не работает только

А что именно Вы хотите сделать? Приведённый код выделяет весь текст в редакторе.


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
StillPhelix
Дата 7.1.2016, 18:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 6.1.2016

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



Цитата

А что именно Вы хотите сделать? Приведённый код выделяет весь текст в редакторе.

В этой программе EM_SETSEL ничего делать не будет. Для того, чтобы это сообщение что-то сделало, нужно элементу управления дать фокус. Что я и сделал. Теперь всё работает. 
PM MAIL   Вверх
feodorv
Дата 8.1.2016, 11:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 9
Всего: 45



Цитата(StillPhelix @  7.1.2016,  18:32 Найти цитируемый пост)
В этой программе EM_SETSEL ничего делать не будет. Для того, чтобы это сообщение что-то сделало, нужно элементу управления дать фокус. Что я и сделал. Теперь всё работает.  

EM_SETSEL прекрасно работает (то есть устанавливаются начальный и конечный символы выделения, каретка передвигается за конечный символ выделения, текст при необходимости скролируется так, чтобы каретка стала видна), просто сам контрол перерисовывается, если уже имеет фокус, или в момент получения фокуса, это да.


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


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

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


 




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


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

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