我在使用 Comdlg32.lib 库的 Win32 API 的 Windows 10 中遇到问题。
似乎这里列出了 GetOpenFileNameW 函数的功能: https://learn.microsoft.com/en-us/windows/win32/api/commdlg/nf-commdlg-getopenfilenamew
正在短暂打开文件浏览窗口,然后使程序崩溃。
此功能以前在 Windows 10 上运行良好,但现在似乎已损坏。
我当前的 Windows 10 更新版本如下: 微软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 )) {
}
}
预期的行为是它会打开一个文件浏览器窗口,允许用户浏览一个文件,然后什么都不做。
然而,虽然上面的代码以前有这种行为,但最近这种行为似乎发生了变化。它会打开文件浏览器窗口一秒钟,然后文件浏览器窗口会冻结,然后程序会崩溃。
我目前正在尝试在 Windows 10 上运行这个程序,它表现出这种行为。我以前在 Windows 10 上运行过它,但它没有表现出这种行为,所以我想知道 Windows 10 的某些更新是否弃用了 GetOpenFileNameW 功能或弃用了这种特殊的执行方式。
我想我的问题是这样的。上面的代码是否正确?它是否遗漏了可能导致 Windows 窗口崩溃的重要内容?
如果上面的代码是正确的,是否意味着这个功能在 Windows 10 中不再有效?它被弃用了吗?
您将指针传递给未初始化的数组:
wchar_t Filename[500];
...
ofn.lpstrFile = Filename;
lpstrFile
的文档:
[...] 用于初始化文件名编辑控件
如果您不想要默认文件名,只需传递一个空字符串:
wchar_t Filename[500] = "";
...
ofn.lpstrFile = Filename;
此外,您应该传递正确的缓冲区长度,以便在选择许多文件时它不会溢出:
ofn.nMaxFile = sizeof(Filename)/sizeof(Filename[0]);