-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 中不再起作用?它已被弃用吗?
您传递一个指向未初始化数组的指针:
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)
| 归档时间: |
|
| 查看次数: |
245 次 |
| 最近记录: |