【问题标题】:Choose file dialog errors选择文件对话框错误
【发布时间】:2020-06-28 08:36:04
【问题描述】:

我从互联网上删除了此代码。但是,每当我找到打开的文件对话框代码时,我都会一遍又一遍地遇到相同的错误。他们都是同一个错误,真的很烦人。

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\0*.txt\0Any File\0*.*\0";
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'

每行代码都有两个错误,这对我来说真的没有意义,而且非常烦人。在与打开对话框并让用户选择文件有关的每一个问题上,我都会遇到同样的错误。它不像C#那么简单

【问题讨论】:

    标签: c++ openfiledialog


    【解决方案1】:

    看来你决定使用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\0*.txt\0Any File\0*.*\0";
    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\0*.txt\0Any File\0*.*\0";
    ofn.lpstrFile = filename;
    ofn.nMaxFile = MAX_PATH;
    ofn.lpstrTitle = "Select a File, yo!";
    ofn.Flags = OFN_DONTADDTORECENT | OFN_FILEMUSTEXIST;
    

    (将A添加到结构名称并从字符串中删除L前缀)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-05
      • 2011-04-29
      • 2015-11-29
      • 1970-01-01
      • 1970-01-01
      • 2014-04-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多