Я схожу с ума?

Модератор: Хакер

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16473
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Я схожу с ума?

Сообщение Хакер » 03.01.2008 (Чт) 10:44

У меня есть код, который вызывает некоторую функцию и, в зависимости от того, что она возвратит - 0 или код ошибки, либо делает некоторые действия, либо сообщеает об ошибке.

И тут мой код вдруг стал возвращать иногда (в 1 из 3 случаев) какой-то (судя по описанию ошибки) неизвестный код.
Мессага об ошибке писал(а):Непредусмотренная ситуация. Ошибка при создании InfoProvider


Дай, думаю, посмотрю, что за код:
Код: Выделить всё
hRes = НекотораяФунция(.......)
Select Case hRes
    Case HRESULTS.S_OK   ' Константа SULTS.S_OK = 0, если что
          '''''''''''   ВЫРЕЗАНО.
          ' ТУТ СОВЕРШАЮТСЯ НЕКОТОРЫЕ ДЕЙСТВИЯ.
          ' НЕВАЖНО КАКИЕ.




    Case HRESULTS.E_OUTOFMEMORY
        MsgBox "Не удаётся совершить операцию: недостаточно памяти!", vbCritical, "Критическая ошибка"
    Case CLASS_E_CLASSNOTAVAILABLE
        MsgBox "Не удаётся совершить операцию: не удаётся создать объект указанного класса", vbCritical, "Критическая ошибка"
    Case HRESULTS.E_INVALIDARG
        MsgBox "Ошибка во время совершения операции: неверные аргументы!", vbCritical, "Ошибка"
    Case Else
        MsgBox "Непредусмотренная ситуация. Ошибка при создании InfoProvider (hresult: 0x" + Right("00000000" + Hex$(hRes), 8) + ")", vbCritical, "Критическая ошибка"
End Select


Видите, я добавил (hresult: 0x" + Right("00000000" + Hex$(hRes), 8) + ")" в код, чтобы в следующий раз при возникновении ошибки я мог узнать значение переменной hRes (т.е. код ошибки в 16-ричном представлении).

Запускаем, и видим следующий шедевр:
Непредусмотренная ситуация. Ошибка при создании InfoProvider (hresult: 0x00000000)


Думаем: если hRes = 0, то почему начинает выполняться Case Else, тогда как должен выполняться Case HRESULTS.S_OK ?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Сообщение Sebas » 03.01.2008 (Чт) 11:26

какой VB?

если NET + hRes as long

то легко.

выведи hres чистоганом
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16473
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 03.01.2008 (Чт) 11:27

VB6. Другого быть не может.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 03.01.2008 (Чт) 12:03

А что происходит под отладкой? Поставь бряк на вызов функции, посмотри в Watch значение hRes, далее иди шагами по F8 и смотри, куда перекинет конструкция Select Case. Кстати, кинь сюда работающий пример, или результирующий asm-код.
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

Debugger
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1667
Зарегистрирован: 17.06.2006 (Сб) 15:11

Сообщение Debugger » 03.01.2008 (Чт) 12:05

А ты поставь красную точку на Select Case и на сам Case. Если они значения hRes и HRESULTS.S_OK совпадут, то ты вероятно, сходишь с ума.
А кто сказал, что в VB отлажены все-все баги?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16473
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 03.01.2008 (Чт) 12:08

BV
При отладке в среде разработки словить такой баг не удалось.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16473
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 03.01.2008 (Чт) 13:06

Положим конец безумию?

Код: Выделить всё
MsgBox "Непредусмотренная ситуация. Ошибка при создании InfoProvider (hresult: 0x" + Right("00000000" + Hex$(hRes), 8) + ") " + CStr(hRes = S_OK) + ". Does " + CStr(hRes) + " equals " + CStr(S_OK) + "? -- " + CStr(S_OK = hRes) + " Сумма = " + CStr(S_OK + hRes), vbCritical, "Критическая ошибка"


Ответ был весьма оригинальным:
Непредусмотренная ситуация. Ошибка при создании InfoProvider (hresult: 0x00000000) False. Does 0 equals
1367072
? -- False Сумма = 0"

Из синего текста делаем вывод, что S_OK не 0 (хотя ведь 0 - Edanmo же не конченый псих декларировать S_OK с таким значением, как у меня, да и Object Browser заверяет меня в том, что она всё-таки 0), а 1367072. Ой :shock: А может уже и True не True, а, скажем, vbYesNo ? :shock:

Ладно. Допустим, что S_OK всё-таки 1367072.
Тогда CStr(S_OK = hRes) действительно будет False.
Но, чёрт возьми, почему тогда CStr(S_OK + hRes) будет 0?

Я в шоке :shaking:
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 03.01.2008 (Чт) 13:11

BV писал(а):Кстати, кинь сюда работающий пример, или результирующий asm-код.
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16473
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 03.01.2008 (Чт) 13:11

Исключено.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 03.01.2008 (Чт) 13:13

По каким причинам?
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16473
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 03.01.2008 (Чт) 13:14

По многим.
Во-первых, проект (теперь) с закрытым исходным кодом. Во-вторых, коду нужен специальный файл, который генерируется другим кодом. В-третьих, коду нужна DLL-библиотека, специальным образом сгенерированная.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16473
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 03.01.2008 (Чт) 13:20

Ы!
Код: Выделить всё
If hRes = 0 Then
                    MsgBox "hres равен нулю"
                Else
                    MsgBox "hres НЕ равен нулю"
                End If
                Select Case hRes
                    Case Is = 0
                      ' Ы
                      ' Ы
                      ' Ы
                    Case HRESULTS.E_OUTOFMEMORY
                        MsgBox "Не удаётся совершить операцию: недостаточно памяти!", vbCritical, "Критическая ошибка"
                    Case CLASS_E_CLASSNOTAVAILABLE
                        MsgBox "Не удаётся совершить операцию: не удаётся создать объект указанного класса", vbCritical, "Критическая ошибка"
                    Case HRESULTS.E_INVALIDARG
                        MsgBox "Ошибка во время совершения операции: неверные аргументы!", vbCritical, "Ошибка"
                    Case Else
                        MsgBox "Непредусмотренная ситуация. Ошибка при создании InfoProvider (hresult: 0x" + Right("00000000" + Hex$(hRes), 8) + ") " + CStr(hRes = S_OK) + ". Does " + CStr(hRes) + " equals " + CStr(S_OK), vbCritical, "Критическая ошибка"
                End Select

видите If-блок. Угадайте с трёх раз какое сообщение я увидел.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 03.01.2008 (Чт) 13:26

А что мешает привести asm-код?
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16473
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 03.01.2008 (Чт) 13:26

какой asm-код?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 03.01.2008 (Чт) 13:30

Машинный, тот, который компилятор пишет в obj-файлы. С добрым утром.
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16473
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 03.01.2008 (Чт) 13:35

А. опять я думал, что BV умнее, чем мне кажется. Опять я переспрашивал у него, и получал хамский ответ, показыющий, что моё мнение насчёт него было ошибочным. Ты хочешь, чтобы я сюда выложил огромную простныю из 72 кб asm-кода, да? Нет? Прикрепить файл с кодом, да? Это чем-то лучше, чем выкладывание самого файла?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.


Вернуться в Мой блог

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4

    TopList