【问题标题】:returning filename from file save dialog (windows32)从文件保存对话框返回文件名(windows32)
【发布时间】:2011-01-09 16:02:00
【问题描述】:

我有一个简单的保存文件对话框,我希望将其用作返回文件路径、名称和扩展名的工具。此函数产生运行时错误,表示文件名周围的堆栈已损坏。我希望这样使用它:

wchar_t filename[] = L"";
newGradebookDialog( hwnd, filename );

这是我的功能。它会按照我的预期修改文件名,但运行时堆栈错误是我没有得到的。

void newGradebookDialog( HWND hwnd, wchar_t file[] )
{
 OPENFILENAME ofn;

 wchar_t saveFileName[MAX_PATH] = L"";

 ZeroMemory( &ofn, sizeof( ofn ) );

 ofn.lStructSize = sizeof(OPENFILENAME);
 ofn.hwndOwner = hwnd;
 ofn.lpstrFilter = L"Database File (*.db)\0*.db\0";
 ofn.lpstrFile = saveFileName;
 ofn.nMaxFile = MAX_PATH;
 ofn.lpstrDefExt = L"db";
 ofn.Flags  = OFN_EXPLORER | OFN_PATHMUSTEXIST | OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT;
 ofn.lpstrTitle = L"Save New Database";

 if(GetSaveFileName(&ofn))
  wcscpy(file,saveFileName);
}

【问题讨论】:

    标签: c++ winapi savefiledialog wstring


    【解决方案1】:
     wchar_t filename[] = L"";
    

    这是一个只有一个元素的数组。您正在将一个更大的字符串复制到其中,这会破坏堆栈帧。修复:

     wchar_t filename[MAX_PATH] = {0};
    

    【讨论】:

      【解决方案2】:

      我感觉你通过 wcscpy 破坏了内存——你分配了空的“文件名”并将非空值(来自 saveFileName)复制到它,从而破坏了内存。

      另外,最好通过分配 MAXPATH+1 元素而不是 MAXPATH 来为尾随 \0 保留空间。虽然在这个特定的地方可能不需要,但多保留一个字符有时可以为您节省数小时的内存损坏错误跟踪。

      【讨论】:

        【解决方案3】:

        试试

        wchar_t filename[MAX_PATH]
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-08-23
          • 1970-01-01
          • 1970-01-01
          • 2013-08-17
          • 1970-01-01
          • 2021-11-18
          相关资源
          最近更新 更多