Обновление до вопроса getopenfilename
Продолжая мой предыдущий вопрос (Является ли getopenfilenname плохо взаимодействующим с VS сейчас?[^]), Я воспроизвел эту проблему с помощью почти самого простого окна. В VS 2019 Я создаю минимальный проект Windows и добавляю только "commdlg.h" include и
OpenFileDialog
код к шаблону по умолчанию code VS генерирует. Когда я выполняю его, я получаю те же самые исключения, брошенные на OpenFileDialog
звоните так, как я ранее получал.Есть какие-нибудь идеи относительно того, что может вызвать эту проблему? Я считаю, что это исключает любые перерасходы памяти с моей стороны, потому что это весь код MS по умолчанию, за исключением
OpenFileDialog
материал.Текст исключения: исключение, вызванное в 0x77E7436F (ntdll.dll) в WindowsProject1.exe: 0xC0000005: нарушение доступа к местоположению чтения 0xFFFFFFFC.
Как и раньше, я могу продолжать казнь и не вижу никаких немедленных проблем. Я склоняюсь к единственному решению-переустановке Windows, но молюсь, чтобы упустить что-то очевидное.
Спасибо,
Дэвид
//Add following include: #include "commdlg.h" //WinMain NOW LOOKS LIKE: int APIENTRY wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPWSTR lpCmdLine, _In_ int nCmdShow) { UNREFERENCED_PARAMETER(hPrevInstance); UNREFERENCED_PARAMETER(lpCmdLine); // TODO: Place code here. //THE FOLLOWING IS ONLY ADDITION TO VS'S AUTO-GENERATED CODE: TCHAR filePtrC[MAX_PATH] = { 0 }; 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; GetOpenFileName(&tofn); //Get two exceptions thrown here. // Initialize global strings LoadStringW(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING); LoadStringW(hInstance, IDC_WINDOWSPROJECT1, szWindowClass, MAX_LOADSTRING); MyRegisterClass(hInstance); // Perform application initialization: if (!InitInstance (hInstance, nCmdShow)) { return FALSE; } HACCEL hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_WINDOWSPROJECT1)); MSG msg; // Main message loop: while (GetMessage(&msg, nullptr, 0, 0)) { if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } } return (int) msg.wParam; }
Что я уже пробовал:
Гораздо больше ругани. Создание самого простого решения в мире для репликации проблемы. Затем последовал большой wtf, когда он потерпел неудачу.
Stefan_Lang
Какой тип символов вы объявили в настройках своего проекта? Я спрашиваю, потому что вы передаете литерал wchar_t* в параметр фильтра. Если он ожидает char* вместо этого ... все может случиться.
Richard MacCutchan
Я только что попробовал то же самое в VS2017, и он отлично работает, так что он должен быть специфичен для конкретной версии (извините, что не установлен 2019). Вы могли бы попробовать поставить точку останова на OPENFILENAME
строчка и шаг через код, проверка всех переменных, чтобы увидеть, если вы можете обнаружить какие-либо аномалии.
Кроме того, для полноты картины вам следует изменить это TCHAR
к WCHAR
поскольку ваша программа, очевидно, специфична для Юникода.
David O'Neil
Спасибо вам, ребята! Я изменил его на WCHAR
и ничего, ничего не меняется в беге. (Да, это Юникод.) Я установлю VS на свой другой компьютер и посмотрю, будет ли он там гадить. Вид сборки показывает следующее, с курсором в последней строке, когда возникает исключение, но я никогда не осваивал сборку:
77B7432F je _RtlCaptureStackContext@12+5D7Ch (77BCEE9Ch) 77B74335 mov dword ptr [edx],ecx 77B74337 mov ebx,dword ptr [ebp+8] 77B7433A test ebx,0FFFFFFFCh 77B74340 jne _RtlCaptureStackContext@12+5D7Ch (77BCEE9Ch) 77B74346 mov eax,dword ptr [ebp+0Ch] 77B74349 test eax,eax 77B7434B je _RtlCaptureStackContext@12+5D7Ch (77BCEE9Ch) 77B74351 cmp eax,0FFFFFFFFh 77B74354 je _RtlCaptureStackContext@12+5D7Ch (77BCEE9Ch) 77B7435A mov edi,dword ptr [ebp+14h] 77B7435D test bl,1 77B74360 je RtlImageNtHeaderEx+0DDh (77B743CDh) 77B74362 xor bl,bl 77B74364 mov esi,dword ptr [ebp+10h] 77B74367 mov dword ptr [ebp-4],ecx 77B7436A mov edx,5A4Dh 77B7436F cmp word ptr [eax],dx
David O'Neil
После загрузки с серверов MS symbol стек вызовов находится на ntdll.dll!RtlImageNtHeaderEx(), если это полезная подсказка.
David O'Neil
И вид на разборку. Курсор находится в самом конце cmp
линия:
006B1DED mov dword ptr [ebp-244h],0 tofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST; 006B1DF7 mov dword ptr [ebp-23Ch],1800h GetOpenFileName(&tofn); 006B1E01 mov esi,esp 006B1E03 lea eax,[tofn] 006B1E09 push eax 006B1E0A call dword ptr [__imp__GetOpenFileNameW@4 (06BB000h)] 006B1E10 cmp esi,esp
Rick York
Я, конечно, могу понять эту ругань. Я запустил эту маленькую функцию в своей тестовой программе, и она работала так, как ожидалось, без каких-либо исключений. Это по существу то, что у вас есть с несколькими нулевыми заданиями, удаленными с тех пор, как вы уже позаботились об этом.void DoOpenFileNameTest()
{
TCHAR filePtrC[ MAX_PATH ] = { 0 };
OPENFILENAME ofn = { 0 };
ofn.lStructSize = sizeof( ofn );
ofn.lpstrFile = filePtrC;
ofn.nMaxFile = MAX_PATH;
ofn.lpstrFilter = L"All\0*.*\0Text\0*.TXT\0";
ofn.nFilterIndex = 1;
ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
if( GetOpenFileName( & ofn ) )
trace( _T( "selected '%s'\n" ), filePtrC );
else
trace( _T( "ope file name was cancelled\n" ) );
}
Единственное, о чем я могу думать, так это о том, что с вашей системой происходит что-то очень странное. Если у вас есть другая система с VS на ней, вы должны попробовать ее там, и если она работает, то обратите пристальное внимание на библиотеки DLL, которые вы видите загруженными в окне вывода отладчика, и попытайтесь увидеть, чем они отличаются от вашей системы, где она терпит неудачу.
David O'Neil
Я только что создал вышеупомянутый проект на другом компьютере, и он отлично работает. Я склоняюсь к переустановке Windows на моем главном ящике, но пока я просто проигнорирую исключение и продолжу работу. С другой стороны, при переустановке я должен был бы использовать старую лицензию Win8 pro, чтобы получить Win10 pro на ней, а не дома. И накопленный за 5 лет хлам будет вычищен. На негативе: все время переустановка всего. Блич!
Stefan_Lang
Если у вас в настоящее время есть Win8, обновление будет стоить того, даже если оно займет целый день. Win 8-это Win7 и Win 10, Как Vista-XP и Win 7, по крайней мере, с точки зрения разработчика: много полусырых изменений, которые вызывают больше страданий, чем пользы, и мало усилий для более плавного опыта, потому что все уже работали над следующей итерацией Windows...
David O'Neil
У меня был Win 10, который пришел из бесплатного обновления с 8.0 -> 8.1, который шел вместе с машиной. Я действительно не хотел тратить время на то, чтобы снова все настроить, но я почти закончил установку Office и еще нескольких основных элементов. Вернуть все обратно будет намного сложнее, но я просто установлю по мере необходимости.
Теперь, когда я это сделал, есть ли какая-то причина не обновляться до Visual Studio 2019 постоянно? Я видел, что он добавил около 12 КБ к моему исполняемому файлу размером 2 МБ, но это не очень беспокоит, если только все это не телеметрия.
Stefan_Lang
Я чувствую вашу боль: когда я обновил свой ноутбук Win 8.0 до 8.1, это заняло большую часть дня - без переустановки моих вещей. Я сделал это только для того, чтобы немедленно перейти на Win10 (что по какой-то непонятной причине я не мог сделать с 8.0), и это обновление прошло гораздо более гладко.
Когда я закончил и убедился, что установка была правильно зарегистрирована, я сделал новую установку с нуля, чтобы избавиться от любых артефактов из предыдущих версий и обновлений.
Когда я думаю об этом, я задаюсь вопросом, стоит ли боль от прохождения этапов обновления сэкономить на новой лицензии ...
P.S.: За исключением технических ограничений (например, сотрудничество с другими командами, использующими другую версию), я не вижу причин использовать более старую версию VS.
David O'Neil
>> (чего по какой-то непонятной причине я не мог сделать с 8.0)
Я думаю, что помню почему: в 8.0 не было Магазина Windows, и вы должны были иметь его в 8.1, чтобы получить обновление! :Большая Малина:
Какое-то время у меня был 8.1, и я был им доволен. Он работает почти так же, как Win7 без Aero. Все еще скучаю по Аэро. :( Ходж-подж дизайнерских идей в 10-м году не так всесторонне продуман, как 7-й с Аэро.
David O'Neil
Сделал решительный шаг и переустановил Windows. Снова запустил VS, и больше никаких проблем! И диск C более чем на 70 ГБ свободнее, чем был, хотя мне все еще нужно переустановить кучу больше. Хотя я не знаю, что это будет стоить 70 ГБ!
Спасибо за помощь и время, которое вы, ребята, потратили на настройку и запуск образцов с вашей стороны! Просто слышать, что я не упускаю что-то очевидное, было облегчением!