【问题标题】:Win32 GetSaveFileName() return is nonzero but file isnt saved?Win32 GetSaveFileName() 返回非零但文件未保存?
【发布时间】:2021-05-16 00:32:35
【问题描述】:

我目前正在设置一个使用 Win32 的编辑器作为对自己的挑战,但我的保存文件的方法由于某种原因没有保存文件。我用我的资源多次检查并查看了互联网上的线程,但我要么没有首先解决那里的问题,要么根本没有帮助。我在这里监督什么吗?

void SaveUserFile(HWND hwnd)
{
    OPENFILENAME ofn;
    char szFile[MAX_PATH] = "";

    ZeroMemory(&ofn, sizeof(ofn));
    ofn.lStructSize = sizeof(ofn);
    ofn.hwndOwner = hwnd;
    ofn.lpstrFile = szFile;
    ofn.lpstrFile[0] = '\0';
    ofn.hwndOwner = hwnd;
    ofn.nMaxFile = MAX_PATH;
    ofn.lpstrFilter = TEXT("Text document(*.txt*)\0*.txt\0Word 2016 document(*.docx*)\0*.docx\0All Files(*.*)\0*.*\0");
    ofn.nFilterIndex = 1;
    ofn.lpstrInitialDir = NULL;
    ofn.lpstrFileTitle = NULL;
    ofn.lpstrDefExt = "mp";
    ofn.Flags = OFN_PATHMUSTEXIST | OFN_HIDEREADONLY;

    GetSaveFileName(&ofn);
}

【问题讨论】:

  • 您希望系统向文件写入什么内容?您如何建议系统了解您的期望?
  • 您好,这个答案能解决您的问题吗?如果您有任何问题,请随时告诉我,如果有帮助,请接受。

标签: c visual-studio winapi win32gui


【解决方案1】:

GetSaveFileName 不保存文件。它显示一个对话框,允许用户选择文件名。如果返回成功,则程序必须编写代码以保存文件,使用用户提供的文件名,程序可以在szFile 中读取。

在新程序中,您应该使用common item dialogsIFileOpenDialogIFileSaveDialog)而不是GetOpenFileNameGetSaveFileName。这有很多原因,但最明显的原因之一是文件名长度不受限制。

【讨论】:

  • IFileOpenDialogIFileSaveDialog 是 C++ 方法,OP 似乎是用纯 C 编程的。
  • @fra 两个接口都是 COM 接口。 COM 与语言无关。 COM 对客户端的唯一两个语言级别要求是:1 必须能够生成指针结构。 2 必须能够通过指针直接或间接调用函数。 C 符合这些要求。
  • @IInspectable 两者都是 COM 接口,但在GetSaveFileName 中 COM 接口在Comdlg32.dll 中对用户透明处理,而常用项对话框需要特定的初始化。虽然 COM 接口也可以在纯 C 中处理,但许多 C 编译器不能使用或没有 COM 支持头文件。在这种情况下,前一种功能是显而易见且有效的解决方案。
  • @Frankie_C 确实,对于许多需求,遗留功能都很好。但是,如果您曾经实现过一个多选文件打开对话框,那么您将不想使用它们,除非您对一次可以选择多少个文件的限制感到满意。
  • @fra A C 编译器不需要任何特定的 COM 支持头文件。 COM 支持内置于核心语言中,如果您请求它们,Windows SDK 标头会公开 C 结构。同样,COM 不需要任何特定的初始化。线程需要注册到正确的单元,当然,但这需要用任何语言完成,比如 C++。
猜你喜欢
  • 2012-05-14
  • 2017-11-24
  • 1970-01-01
  • 2021-11-26
  • 1970-01-01
  • 1970-01-01
  • 2016-08-29
  • 1970-01-01
  • 2018-04-10
相关资源
最近更新 更多