Очень странная проблема GetOpenFileName - PullRequest
0 голосов
/ 12 сентября 2011

У меня очень странная проблема с GetOpenFileName.

Это ошибки без видимой причины, однако, если я вызову CommDlgExtendedError() в проверке ошибок, ошибка никогда не произойдет.

Вот мой код:

#include <windows.h>
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    OPENFILENAME fm;
    char flnm[MAX_PATH];
    ZeroMemory(&fm, sizeof(fm));

    fm.lStructSize = sizeof(OPENFILENAME);
    fm.hwndOwner = NULL;
    fm.lpstrFilter = "Text Files (*.txt)\0*.txt\0";
    fm.lpstrFile = flnm;
    fm.nMaxFile = MAX_PATH;
    fm.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
    fm.lpstrDefExt = "";

    if(!GetOpenFileNameA(&fm))
    {
        MessageBoxA(NULL, "failed! :(", NULL, NULL);
    }

    return 0;
}

Что показано? "не удалось! :("

Если я уберу эту проверку, я увижу диалоговое окно файла. Однако это не работает, и поле имени файла предварительно заполнено случайным мусором.

Если я поменяю на:

if(!GetOpenFileNameA(&fm))
{
    DWORD dwErr = CommDlgExtendedError();
    MessageBoxA(NULL, "failed! :(", NULL, NULL);
}

"fail! :(" НЕ отображается. Диалоговое окно файла отображается и работает без проблем.

Что происходит!?!?

1 Ответ

5 голосов
/ 12 сентября 2011
OPENFILENAME fm;
char flnm[MAX_PATH]; // nobody initialized me ...
ZeroMemory(&fm, sizeof(fm));

fm.lStructSize = sizeof(OPENFILENAME);
fm.hwndOwner = NULL;
fm.lpstrFilter = "Text Files (*.txt)\0*.txt\0";
fm.lpstrFile = flnm; // ... who knows what I am?
fm.nMaxFile = MAX_PATH;
fm.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
fm.lpstrDefExt = "";

if(!GetOpenFileNameA(&fm))
{
        MessageBoxA(NULL, "failed! :(", NULL, NULL);
}

Документация для lpstrFile состояния:

Имя файла, используемое для инициализации элемента управления редактированием имени файла. Первый символ этого буфера должен быть NULL, если инициализация не требуется. Когда функция GetOpenFileName или GetSaveFileName успешно возвращается, этот буфер содержит обозначение диска, путь, имя файла и расширение выбранного файла.

Вы не инициализируете flnm, и в этом заключается проблема. Вы можете решить проблему, написав flnm[0] = '\0', прежде чем позвонить GetOpenFileName.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...