Является ли getopenfilenname плохо взаимодействующим с VS сейчас?
Rebuilt some old code, and executed a portion to open a file. In all the years before there were no issues opening files, and the last good production build of the program executes properly without any issues in that area, *and* I didn't make any changes in that part of the code. The rebuilt version gives an 'Exception thrown at ____ reading location 0xFFFFFFFC' in wntdll (Visual Studio 2015) in both Debug and Release versions. If I continue it twice, it executes as expected. Open another file without closing the program and there are no more exceptions thrown. If I execute the debug or release version directly from Explorer I don't get a crash, and it works as expected.
Есть идеи? Оставить его, зная, что он, кажется, работает везде, кроме VS? Единственное, о чем я могу думать, это то, что что-то в Windows изменилось с тех пор, как код в последний раз выполнялся правильно в VS. Но это только потому, что мне надоело на него смотреть. Новейший тестовый код, который дает исключение (воссозданное почти с нуля из онлайн-образца и удаление из класса, в котором оно находится), выглядит следующим образом:
TCHAR filePtrC[MAX_PATH]; bool openDialog() { OPENFILENAME tofn = { 0 }; tofn.lStructSize = sizeof ( tofn ); tofn.hwndOwner = NULL; tofn.lpstrFile = filePtrC; tofn.nMaxFile = MAX_PATH; tofn.lpstrFilter = L"All\0*.*\0Text\0*.TXT\0"; tofn.nFilterIndex = 1; tofn.lpstrFileTitle = NULL; tofn.nMaxFileTitle = 0; tofn.lpstrInitialDir=NULL; tofn.Flags = OFN_PATHMUSTEXIST|OFN_FILEMUSTEXIST; return (GetOpenFileName(&tofn) == TRUE); //Exception thrown here. }
Что я уже пробовал:
Сквернословие. Кулаки трясутся. Первая и вторая стадии из пяти стадий принятия. Снова ругань. Несколько ревизий вышеприведенного кода. И еще ругань, для хорошей меры.
Richard MacCutchan
Вы уверены, что в свойствах вашего проекта указано Unicode
? Если нет, то ваша строка фильтра вполне может быть неправильной. Как говорит Карло, вы должны использовать _T
макрос, а не L
префикс на ваших струнах.
David O'Neil
Спасибо. Оба проекта в решении настроены для Unicode. Изменение его на макрос _T не имело никакого значения. Но попробовать стоило!
Richard MacCutchan
Это, а также ваши комментарии выше, предполагают, что проблема вполне может быть вызвана каким-то кодом, который не является частью вышеуказанной функции. Плохой адрес где-то еще может довольно легко повредить что-то, что приводит к исключению. Но найти такую ошибку никогда не бывает легко.
David O'Neil
Реалист во мне тоже так думает. Я просто не хочу его слушать! Я помню, как трудно было в прошлый раз выследить одного из них! Отрывая по кусочку за раз... Тьфу!
Richard MacCutchan
Если вы используете отладчик, то при попадании исключения трассировка стека может помочь.
David O'Neil
К сожалению, в окне стека вызовов всего три строки.
ntdll.dll!77e7436f()
ntdll.dll![Нижеприведенные кадры могут быть неверными/отсутствующими...
[внешний код]
Я не знаю, как использовать эту информацию, чтобы решить загадку. Можете ли вы каким-то образом поставить точку останова памяти на этом 77e7436f, который, похоже, является функцией?
Richard MacCutchan
Извините, я не уверен в этом, и, вероятно, уже слишком поздно.
David O'Neil
Спасибо за ответ. Я посмотрю, что можно сделать.