选择文件对话框错误
Choose file dialog errors
我从互联网上取下了这段代码。但是,每当我找到打开文件对话框代码时,我都会一遍又一遍地收到相同的错误。都是一样的错误,真烦人。
int choosefile() {
char filename[MAX_PATH];
OPENFILENAME ofn;
ZeroMemory(&filename, sizeof(filename));
ZeroMemory(&ofn, sizeof(ofn));
ofn.lStructSize = sizeof(ofn);
ofn.hwndOwner = NULL;
ofn.lpstrFilter = L"Text Files[=10=]*.txt[=10=]Any File[=10=]*.*[=10=]";
ofn.lpstrFile = filename;
ofn.nMaxFile = MAX_PATH;
ofn.lpstrTitle = L"Select a File, yo!";
ofn.Flags = OFN_DONTADDTORECENT | OFN_FILEMUSTEXIST;
if (GetOpenFileNameA(&ofn))
{
std::cout << "You chose the file \"" << filename << "\"\n";
}
else
{
switch (CommDlgExtendedError())
{
case CDERR_DIALOGFAILURE: std::cout << "CDERR_DIALOGFAILURE\n"; break;
case CDERR_FINDRESFAILURE: std::cout << "CDERR_FINDRESFAILURE\n"; break;
case CDERR_INITIALIZATION: std::cout << "CDERR_INITIALIZATION\n"; break;
case CDERR_LOADRESFAILURE: std::cout << "CDERR_LOADRESFAILURE\n"; break;
case CDERR_LOADSTRFAILURE: std::cout << "CDERR_LOADSTRFAILURE\n"; break;
case CDERR_LOCKRESFAILURE: std::cout << "CDERR_LOCKRESFAILURE\n"; break;
case CDERR_MEMALLOCFAILURE: std::cout << "CDERR_MEMALLOCFAILURE\n"; break;
case CDERR_MEMLOCKFAILURE: std::cout << "CDERR_MEMLOCKFAILURE\n"; break;
case CDERR_NOHINSTANCE: std::cout << "CDERR_NOHINSTANCE\n"; break;
case CDERR_NOHOOK: std::cout << "CDERR_NOHOOK\n"; break;
case CDERR_NOTEMPLATE: std::cout << "CDERR_NOTEMPLATE\n"; break;
case CDERR_STRUCTSIZE: std::cout << "CDERR_STRUCTSIZE\n"; break;
case FNERR_BUFFERTOOSMALL: std::cout << "FNERR_BUFFERTOOSMALL\n"; break;
case FNERR_INVALIDFILENAME: std::cout << "FNERR_INVALIDFILENAME\n"; break;
case FNERR_SUBCLASSFAILURE: std::cout << "FNERR_SUBCLASSFAILURE\n"; break;
default: std::cout << "You cancelled.\n";
}
}
}
这是代码,它给我一个错误:
ofn.lpstrFile = filename;
a value of type "char *" cannot be assigned to an entity of type "LPWSTR"
Error C2440 '=': cannot convert from 'char [260]' to 'LPWSTR'
然后它又给我另一个错误:
if (GetOpenFileNameA(&ofn))
argument of type "OPENFILENAME *" is incompatible with parameter of type "LPOPENFILENAMEA"
Error C2664 'BOOL GetOpenFileNameA(LPOPENFILENAMEA)': cannot convert argument 1 from 'OPENFILENAME *' to 'LPOPENFILENAMEA'
我在每一行代码中都遇到了两个错误,这对我来说真的毫无意义,而且非常烦人。我总是在与打开对话框和让用户 select 文件有关的每一件事上遇到这些相同的错误。它不像C#
那么简单
您似乎决定使用 char
数组来接收路径和 GetOpenFileNameA()
函数,因此应该使用 OPENFILENAMEA
结构。
OPENFILENAME ofn;
ZeroMemory(&filename, sizeof(filename));
ZeroMemory(&ofn, sizeof(ofn));
ofn.lStructSize = sizeof(ofn);
ofn.hwndOwner = NULL;
ofn.lpstrFilter = L"Text Files[=10=]*.txt[=10=]Any File[=10=]*.*[=10=]";
ofn.lpstrFile = filename;
ofn.nMaxFile = MAX_PATH;
ofn.lpstrTitle = L"Select a File, yo!";
ofn.Flags = OFN_DONTADDTORECENT | OFN_FILEMUSTEXIST;
应该是
OPENFILENAMEA ofn;
ZeroMemory(&filename, sizeof(filename));
ZeroMemory(&ofn, sizeof(ofn));
ofn.lStructSize = sizeof(ofn);
ofn.hwndOwner = NULL;
ofn.lpstrFilter = "Text Files[=11=]*.txt[=11=]Any File[=11=]*.*[=11=]";
ofn.lpstrFile = filename;
ofn.nMaxFile = MAX_PATH;
ofn.lpstrTitle = "Select a File, yo!";
ofn.Flags = OFN_DONTADDTORECENT | OFN_FILEMUSTEXIST;
(将 A
添加到结构名称并从字符串中删除 L
前缀)
我从互联网上取下了这段代码。但是,每当我找到打开文件对话框代码时,我都会一遍又一遍地收到相同的错误。都是一样的错误,真烦人。
int choosefile() {
char filename[MAX_PATH];
OPENFILENAME ofn;
ZeroMemory(&filename, sizeof(filename));
ZeroMemory(&ofn, sizeof(ofn));
ofn.lStructSize = sizeof(ofn);
ofn.hwndOwner = NULL;
ofn.lpstrFilter = L"Text Files[=10=]*.txt[=10=]Any File[=10=]*.*[=10=]";
ofn.lpstrFile = filename;
ofn.nMaxFile = MAX_PATH;
ofn.lpstrTitle = L"Select a File, yo!";
ofn.Flags = OFN_DONTADDTORECENT | OFN_FILEMUSTEXIST;
if (GetOpenFileNameA(&ofn))
{
std::cout << "You chose the file \"" << filename << "\"\n";
}
else
{
switch (CommDlgExtendedError())
{
case CDERR_DIALOGFAILURE: std::cout << "CDERR_DIALOGFAILURE\n"; break;
case CDERR_FINDRESFAILURE: std::cout << "CDERR_FINDRESFAILURE\n"; break;
case CDERR_INITIALIZATION: std::cout << "CDERR_INITIALIZATION\n"; break;
case CDERR_LOADRESFAILURE: std::cout << "CDERR_LOADRESFAILURE\n"; break;
case CDERR_LOADSTRFAILURE: std::cout << "CDERR_LOADSTRFAILURE\n"; break;
case CDERR_LOCKRESFAILURE: std::cout << "CDERR_LOCKRESFAILURE\n"; break;
case CDERR_MEMALLOCFAILURE: std::cout << "CDERR_MEMALLOCFAILURE\n"; break;
case CDERR_MEMLOCKFAILURE: std::cout << "CDERR_MEMLOCKFAILURE\n"; break;
case CDERR_NOHINSTANCE: std::cout << "CDERR_NOHINSTANCE\n"; break;
case CDERR_NOHOOK: std::cout << "CDERR_NOHOOK\n"; break;
case CDERR_NOTEMPLATE: std::cout << "CDERR_NOTEMPLATE\n"; break;
case CDERR_STRUCTSIZE: std::cout << "CDERR_STRUCTSIZE\n"; break;
case FNERR_BUFFERTOOSMALL: std::cout << "FNERR_BUFFERTOOSMALL\n"; break;
case FNERR_INVALIDFILENAME: std::cout << "FNERR_INVALIDFILENAME\n"; break;
case FNERR_SUBCLASSFAILURE: std::cout << "FNERR_SUBCLASSFAILURE\n"; break;
default: std::cout << "You cancelled.\n";
}
}
}
这是代码,它给我一个错误:
ofn.lpstrFile = filename;
a value of type "char *" cannot be assigned to an entity of type "LPWSTR"
Error C2440 '=': cannot convert from 'char [260]' to 'LPWSTR'
然后它又给我另一个错误:
if (GetOpenFileNameA(&ofn))
argument of type "OPENFILENAME *" is incompatible with parameter of type "LPOPENFILENAMEA"
Error C2664 'BOOL GetOpenFileNameA(LPOPENFILENAMEA)': cannot convert argument 1 from 'OPENFILENAME *' to 'LPOPENFILENAMEA'
我在每一行代码中都遇到了两个错误,这对我来说真的毫无意义,而且非常烦人。我总是在与打开对话框和让用户 select 文件有关的每一件事上遇到这些相同的错误。它不像C#
那么简单您似乎决定使用 char
数组来接收路径和 GetOpenFileNameA()
函数,因此应该使用 OPENFILENAMEA
结构。
OPENFILENAME ofn;
ZeroMemory(&filename, sizeof(filename));
ZeroMemory(&ofn, sizeof(ofn));
ofn.lStructSize = sizeof(ofn);
ofn.hwndOwner = NULL;
ofn.lpstrFilter = L"Text Files[=10=]*.txt[=10=]Any File[=10=]*.*[=10=]";
ofn.lpstrFile = filename;
ofn.nMaxFile = MAX_PATH;
ofn.lpstrTitle = L"Select a File, yo!";
ofn.Flags = OFN_DONTADDTORECENT | OFN_FILEMUSTEXIST;
应该是
OPENFILENAMEA ofn;
ZeroMemory(&filename, sizeof(filename));
ZeroMemory(&ofn, sizeof(ofn));
ofn.lStructSize = sizeof(ofn);
ofn.hwndOwner = NULL;
ofn.lpstrFilter = "Text Files[=11=]*.txt[=11=]Any File[=11=]*.*[=11=]";
ofn.lpstrFile = filename;
ofn.nMaxFile = MAX_PATH;
ofn.lpstrTitle = "Select a File, yo!";
ofn.Flags = OFN_DONTADDTORECENT | OFN_FILEMUSTEXIST;
(将 A
添加到结构名称并从字符串中删除 L
前缀)