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

Обновление до вопроса 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 ГБ!

Спасибо за помощь и время, которое вы, ребята, потратили на настройку и запуск образцов с вашей стороны! Просто слышать, что я не упускаю что-то очевидное, было облегчением!

0 Ответов