选择文件对话框错误

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 前缀)