Класс OpenFileDialog не работает должным образом в переполнении стека

Я хочу показать имя файла, который открывается OpenFileDialog, но он отправляет неправильный текст в строку заголовка. Я изменил набор символов проекта, но это не помогло. вот мой код:

OpenFileDialog .h:

    class OpenFileDialog
{
public:
OpenFileDialog(){};
void CreateOpenFileDialog(HWND hWnd, LPCWSTR Title, LPCWSTR InitialDirectory, LPCWSTR Filter, int FilterIndex);
~OpenFileDialog(){};
LPCWSTR result=L"";
};

OpenFileDialog .cpp:

      void OpenFileDialog::CreateOpenFileDialog(HWND hWnd, LPCWSTR Title, LPCWSTR InitialDirectory, LPCWSTR Filter, int FilterIndex)
{
OPENFILENAME ofn;
TCHAR szFile[MAX_PATH];
ZeroMemory(&ofn, sizeof(ofn));
ofn.lStructSize = sizeof(ofn);
ofn.lpstrFile = szFile;
ofn.lpstrFile[0] = '\0';
ofn.hwndOwner = hWnd;
ofn.nMaxFile = sizeof(szFile);
ofn.lpstrFilter = Filter;
ofn.nFilterIndex = FilterIndex;
ofn.lpstrTitle = Title;
ofn.lpstrInitialDir = InitialDirectory;
ofn.lpstrFileTitle = NULL;
ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;if (GetOpenFileName(&ofn))
{
result = ofn.lpstrFile;
}
else
{
result = L"Empty";
}
}

и в процедуре Windows в WM_COMMAND:

        case WM_COMMAND:
{
if (LOWORD(wParam) == ID_FILE_OPEN)
{
OpenFileDialog ofd;
ofd.CreateOpenFileDialog(hwnd, L"Test", L"C:\\", L"All files(*.*)\0*.*\0TextFiles(*.txt)\0*.txt\0", 2);
SetWindowText(hwnd, ofd.result);
}
break;
}

большое спасибо.

-1

Решение

В вашей функции CreateOpenFileDialog(), буфер для хранения имени файла является локальным массивом szFile[MAX_PATH], Вы инициализируете lpstrFile = szFile в ofn структура, убедившись, что GetOpenFileName() ставит результат входа пользователя в нужное место.

Проблема в том, что как только вы вернетесь из CreateOpenFileDialog(), его локальные переменные уничтожаются, включая буфер, содержащий имя файла. Следовательно resultуказатель, который вы установили с result = ofn.lpstrFile; затем указывает на неверную ячейку памяти.

Вы можете решить эту проблему, выделив буфер непосредственно в result в OpenFileDialog конструктор (или сделать его массивом), и использовать этот указатель напрямую с ofn.lpstrFile = buffer;

1

Другие решения


По вопросам рекламы [email protected]