GetOpenFileNameW 函数似乎不再正常工作

-2 c++ windows winapi windows-10

我在 Windows 10 中使用 Comdlg32.lib 库的 Win32 API 时遇到问题。

似乎此处列出了 GetOpenFileNameW 函数的功能: https: //learn.microsoft.com/en-us/windows/win32/api/commdlg/nf-commdlg-getopenfilenamew

短暂打开文件浏览窗口,然后使程序崩溃。

此功能过去在 Windows 10 上运行良好,但现在似乎已损坏。

我当前的 Windows 10 更新版本如下: Microsoft Windows 版本 22H2(操作系统内部版本 19045.2604)

对于以下使用 Comdlg32.lib 库的简短 Windows CPP 代码:

#include <windows.h>
int main() {
    wchar_t Filename[500];
    OPENFILENAMEW ofn;
    ZeroMemory(&ofn, sizeof(ofn));
    ofn.lStructSize  = sizeof(ofn);
    ofn.hwndOwner    = NULL; 
    ofn.lpstrFile    = Filename;
    ofn.nMaxFile     = (unsigned int)1000000;
    ofn.lpstrTitle   = L"Select a File";
    ofn.Flags        = OFN_DONTADDTORECENT | OFN_FILEMUSTEXIST | OFN_ALLOWMULTISELECT | OFN_EXPLORER;
    if (GetOpenFileNameW( &ofn )) {
    }
} 
Run Code Online (Sandbox Code Playgroud)

预期的行为是它将打开一个文件浏览器窗口,允许用户浏览文件,然后不执行任何操作。

然而,虽然上面的代码以前有这种行为,但最近这种行为似乎发生了变化。相反,它会打开文件浏览器窗口一秒钟,然后文件浏览器窗口将冻结,然后程序将崩溃。

我目前正在尝试在 Windows 10 上运行此程序,并且它表现出此行为。我之前在 Windows 10 上运行过它,但它没有表现出这种行为,所以我想知道 Windows 10 的某些更新是否弃用了 GetOpenFileNameW 功能或弃用了这种特定的执行方式。

我想我的问题是这样的。上面的代码正确吗?是否缺少一些可能导致 Windows 窗口崩溃的重要内容?

如果上述代码正确,是否意味着此功能在 Windows 10 中不再起作用?它已被弃用吗?

ybu*_*ill 6

您传递一个指向未初始化数组的指针:

wchar_t Filename[500];
...
ofn.lpstrFile    = Filename;
Run Code Online (Sandbox Code Playgroud)

根据文档lpstrFile

[...]用于初始化文件名​​编辑控件

如果您不需要默认文件名,只需传递一个空字符串:

wchar_t Filename[500] = "";
...
ofn.lpstrFile    = Filename;
Run Code Online (Sandbox Code Playgroud)

另外,您应该传递正确的缓冲区长度,以便在选择许多文件时不会溢出:

ofn.nMaxFile     = sizeof(Filename)/sizeof(Filename[0]);
Run Code Online (Sandbox Code Playgroud)