David O'Neil Ответов: 1

Является ли 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

Спасибо за ответ. Я посмотрю, что можно сделать.

1 Ответов

Рейтинг:
0

CPallini

Я сделал тест с вашим кодом в моей системе. С Visual Studio 2019 оба Выпускать и Отлаживать сборка (как для x86 и x64) беги нормально.
Так что, да, похоже, что на самом деле есть какие-то проблемы с этим Visual Studio установлен в системе yout.
Кстати, я бы воспользовался _T вместо L- но это действительно не имеет значения.


David O'Neil

Спасибо за попытку. Это достаточно ободрило меня, чтобы попробовать опцию "исправить" в установщике VS. Все равно выдает ошибку. Поэтому я скачал и установил 2019 год и построил проект с его помощью. Это все еще дает те же проблемы (или, по крайней мере, первое выполнение сделало то же самое, что и раньше).

Так что либо моя установка Windows имеет что-то странное в ядре (из-за обновления 1903 года?, которое действительно произошло между хорошим и плохим запусками), и нуждается в переустановке, либо изменения в других частях моего фреймворка имеют где-то ошибку. Ура! Я попробую построить его на другом компьютере и посмотрю, работает ли это. Мне не нравится мысль о переустановке всего.

Еще Раз Спасибо!