我正在尝试使用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 *
或类似指针之外的任何东西,则可能做错了;添加指针强制转型只会使编译器静音,而不会使错误消失远)