调用GetOpenFileNameA会导致常见的对话框错误2

时间:2016-11-10 22:45:26

标签: c++ winapi

我尝试使用GetOpenFileNameA打开一个对话框。但是,对话框无法打开。相反,我得到了一个很好的CommDlgError 2.搜索Google和StackOverflow这个错误并没有产生任何有用的结果。

令人困惑的是,此代码适用于也使用Visual Studio的学校计算机,尽管版本不同。

注意:此代码块中未声明的所有变量均为" global"只能在主代码模块中访问的变量。

void GetInputFile()
{
    char szFileNameIN[MAX_PATH];
    char szFileNameOUT[MAX_PATH];

    // get the input file name
    OPENFILENAME ofn;
    ZeroMemory(&fInputPath, sizeof(fInputPath));
    ZeroMemory(&ofn, sizeof(ofn));
    ofn.lStructSize = sizeof(ofn);
    ofn.hwndOwner = NULL;
    ofn.lpstrFilter = LPWSTR("Any File\0*.*\0");
    ofn.lpstrFile = LPWSTR(fInputPath);
    ofn.nMaxFile = MAX_PATH;
    ofn.lpstrFileTitle = LPWSTR(szFileNameIN);
    ofn.nMaxFileTitle = MAX_PATH;
    ofn.lpstrTitle = LPWSTR("Select an input File");
    ofn.Flags = OFN_DONTADDTORECENT | OFN_FILEMUSTEXIST;
    if (GetOpenFileNameA(LPOPENFILENAMEA(&ofn))) // user selected an input file
    {
    }
    else {
        // Get error
        TCHAR error[MAX_LOADSTRING];
        wsprintf(error,TEXT("%i"),CommDlgExtendedError());
        MessageBox(NULL,error,TEXT("ERROR"),MB_OK);
    }

}

2 个答案:

答案 0 :(得分:4)

那些可怕的(LPWSTR)强制转型告诉我您正在使用UNICODE定义进行编译,因此您使用的OPENFILENAME结构实际上是OPENFILENAMEW;鉴于您使用的是GetOpenFileNameA,您必须使用OPENFILENAMEA(或使用带有宽字符串的直接GetOpenFileName)。

(并且请记住,根据经验,如果你必须向/不同于void *和类似的东西投射指针,你可能做错了;添加指针强制转换只会使编译器静音,不要让错误消失)

答案 1 :(得分:2)

您正在使用TCHAROPENFILENAME。由于您将Unicode字符串指针分配给其字段,这意味着您的项目正在编译时定义了UNICODE,因此TCHAR映射到wchar_tOPENFILENAME映射到{{1 }}。但是您使用的是ANSI字符缓冲区和OPENFILENAMEW的ANSI版本,并且在整个地方使用了错误的类型转换。

所以摆脱所有类型转换,然后:

  1. 为所有内容使用适当的GetOpenFileName()类型和API:

    TCHAR
  2. 为所有内容使用适当的void GetInputFile() { TCHAR szFileNameIN[MAX_PATH]; TCHAR szFileNameOUT[MAX_PATH]; // get the input file name OPENFILENAME ofn; ZeroMemory(&fInputPath, sizeof(fInputPath)); ZeroMemory(&ofn, sizeof(ofn)); ofn.lStructSize = sizeof(ofn); ofn.hwndOwner = NULL; ofn.lpstrFilter = TEXT("Any File\0*.*\0"); ofn.lpstrFile = fInputPath; // must be TCHAR[]... ofn.nMaxFile = MAX_PATH; ofn.lpstrFileTitle = szFileNameIN; ofn.nMaxFileTitle = MAX_PATH; ofn.lpstrTitle = TEXT("Select an input File"); ofn.Flags = OFN_DONTADDTORECENT | OFN_FILEMUSTEXIST; if (GetOpenFileName(&ofn)) // user selected an input file { } else { // Get error TCHAR error[MAX_LOADSTRING]; wsprintf(error, TEXT("%i"), CommDlgExtendedError()); MessageBox(NULL, error, TEXT("ERROR"), MB_OK); } } / CHAR类型和API:

    WCHAR

    void GetInputFile()
    {
        WCHAR szFileNameIN[MAX_PATH];
        WCHAR szFileNameOUT[MAX_PATH];
    
        // get the input file name
        OPENFILENAMEW ofn;
        ZeroMemory(&fInputPath, sizeof(fInputPath));
        ZeroMemory(&ofn, sizeof(ofn));
        ofn.lStructSize = sizeof(ofn);
        ofn.hwndOwner = NULL;
        ofn.lpstrFilter = L"Any File\0*.*\0";
        ofn.lpstrFile = fInputPath; // must be WCHAR[]...
        ofn.nMaxFile = MAX_PATH;
        ofn.lpstrFileTitle = szFileNameIN;
        ofn.nMaxFileTitle = MAX_PATH;
        ofn.lpstrTitle = L"Select an input File";
        ofn.Flags = OFN_DONTADDTORECENT | OFN_FILEMUSTEXIST;
        if (GetOpenFileNameW(&ofn)) // user selected an input file
        {
        }
        else
        {
            // Get error
            WCHAR error[MAX_LOADSTRING];
            wsprintfW(error, L"%i", CommDlgExtendedError());
            MessageBoxW(NULL, error, L"ERROR", MB_OK);
        }
    }
    
相关问题