C++ OpenFileDialog类在c++;
我想显示OpenFileDialog打开的文件名,但它将错误的文本发送到标题栏。我已经改变了这个项目的角色集,但是没有任何帮助。这是我的密码: OpenFileDialog.h:C++ OpenFileDialog类在c++;,c++,openfiledialog,C++,Openfiledialog,我想显示OpenFileDialog打开的文件名,但它将错误的文本发送到标题栏。我已经改变了这个项目的角色集,但是没有任何帮助。这是我的密码: OpenFileDialog.h: class OpenFileDialog { public: OpenFileDialog(){}; void CreateOpenFileDialog(HWND hWnd, LPCWSTR Title, LPCWSTR InitialDirectory, L
class OpenFileDialog
{
public:
OpenFileDialog(){};
void CreateOpenFileDialog(HWND hWnd, LPCWSTR Title, LPCWSTR InitialDirectory, LPCWSTR Filter, int FilterIndex);
~OpenFileDialog(){};
LPCWSTR result=L"";
};
OpenFileDialog.cpp:
void OpenFileDialog::CreateOpenFileDialog(HWND hWnd, LPCWSTR Title, LPCWSTR InitialDirectory, LPCWSTR Filter, int FilterIndex)
{
OPENFILENAME ofn;
TCHAR szFile[MAX_PATH];
ZeroMemory(&ofn, sizeof(ofn));
ofn.lStructSize = sizeof(ofn);
ofn.lpstrFile = szFile;
ofn.lpstrFile[0] = '\0';
ofn.hwndOwner = hWnd;
ofn.nMaxFile = sizeof(szFile);
ofn.lpstrFilter = Filter;
ofn.nFilterIndex = FilterIndex;
ofn.lpstrTitle = Title;
ofn.lpstrInitialDir = InitialDirectory;
ofn.lpstrFileTitle = NULL;
ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
if (GetOpenFileName(&ofn))
{
result = ofn.lpstrFile;
}
else
{
result = L"Empty";
}
}
在WM_命令的windows过程中:
case WM_COMMAND:
{
if (LOWORD(wParam) == ID_FILE_OPEN)
{
OpenFileDialog ofd;
ofd.CreateOpenFileDialog(hwnd, L"Test", L"C:\\", L"All files(*.*)\0*.*\0TextFiles(*.txt)\0*.txt\0", 2);
SetWindowText(hwnd, ofd.result);
}
break;
}
非常感谢。在函数
CreateOpenFileDialog()
中,用于存储文件名的缓冲区是一个本地数组szFile[MAX\u PATH]
。在ofn结构中初始化lpstrFile=szFile
,确保GetOpenFileName()
将用户输入的结果放在正确的位置
问题是,只要从CreateOpenFileDialog()
返回,它的局部变量就会被销毁,包括包含文件名的缓冲区。因此,使用result=ofn.lpstrFile设置的result
指针代码>然后指向无效的内存位置
您可以通过在OpenFileDialog
构造函数的result
中直接分配缓冲区(或使其成为一个数组)来解决此问题,并将此指针直接用于ofn.lpstrFile=buffer代码>