我正在尝试使用GetOpenFileNameA打开一个对话框。但是,对话框不会打开。相反,我得到一个不错的CommDlgError2。在Google和StackOverflow中搜索该错误并没有产生任何有用的结果。

令人困惑的是,此代码可在也使用Visual Studio的学校计算机上运行,​​尽管版本不同。

注意:在此代码块中未声明的所有变量都是“全局”变量,只能在主代码模块中访问。

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);
    }

}

最佳答案

那些糟糕的(LPWSTR)强制类型转换告诉我,您正在使用定义的UNICODE进行编译,因此您正在使用的OPENFILENAME结构实际上是OPENFILENAMEW;假设您使用的是GetOpenFileNameA,则必须使用OPENFILENAMEA(或对宽字符串使用直接的GetOpenFileName)。

(请记住,根据经验,如果必须将指针投射到void *或类似指针之外的任何东西,则可能做错了;添加指针强制转型只会使编译器静音,而不会使错误消失远)

08-16 00:54