我尝试使用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);
}
}
答案 0 :(得分:4)
那些可怕的(LPWSTR)
强制转型告诉我您正在使用UNICODE
定义进行编译,因此您使用的OPENFILENAME
结构实际上是OPENFILENAMEW
;鉴于您使用的是GetOpenFileNameA
,您必须使用OPENFILENAMEA
(或使用带有宽字符串的直接GetOpenFileName
)。
(并且请记住,根据经验,如果你必须向/不同于void *
和类似的东西投射指针,你可能做错了;添加指针强制转换只会使编译器静音,不要让错误消失)
答案 1 :(得分:2)
您正在使用TCHAR
版OPENFILENAME
。由于您将Unicode字符串指针分配给其字段,这意味着您的项目正在编译时定义了UNICODE
,因此TCHAR
映射到wchar_t
,OPENFILENAME
映射到{{1 }}。但是您使用的是ANSI字符缓冲区和OPENFILENAMEW
的ANSI版本,并且在整个地方使用了错误的类型转换。
所以摆脱所有类型转换,然后:
为所有内容使用适当的GetOpenFileName()
类型和API:
TCHAR
为所有内容使用适当的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);
}
}