GETOpenFLAMENEMENT和系统函数调用运行时错误C++ +Win32 API 我一直在使用一个64位Windows 7机器上的Visual C++ 2010 Express来编写一个简单的Windows程序。到目前为止,我有一个简单的菜单和一个可编辑的文本区域。我正在尝试允许用户选择媒体文件、电影或音乐文件,并使用默认程序播放
当用户从菜单File->Play->File from Computer中选择时,它运行以下代码GETOpenFLAMENEMENT和系统函数调用运行时错误C++ +Win32 API 我一直在使用一个64位Windows 7机器上的Visual C++ 2010 Express来编写一个简单的Windows程序。到目前为止,我有一个简单的菜单和一个可编辑的文本区域。我正在尝试允许用户选择媒体文件、电影或音乐文件,并使用默认程序播放,c++,winapi,openfiledialog,common-dialog,C++,Winapi,Openfiledialog,Common Dialog,当用户从菜单File->Play->File from Computer中选择时,它运行以下代码 case ID_PLAY_FFC: { system("cd c:/windows/system32/&&cmd.exe"); FileOpen(hWnd); system("cd c:/windows/system32/&&cmd.exe"); } break; 问题是第一个系统调用按
case ID_PLAY_FFC:
{
system("cd c:/windows/system32/&&cmd.exe");
FileOpen(hWnd);
system("cd c:/windows/system32/&&cmd.exe");
}
break;
问题是第一个系统调用按预期运行。第二个调用告诉我cmd.exe不被识别为内部或外部命令、可操作程序或批处理文件。我试着将第二个系统调用放在File Open函数中,它似乎在GetOpenFileName之前的任何地方都能工作,但在GetOpenFileName之后就不行了
我唯一真正需要得到的是文件路径,所以我想知道是否有人知道如何解决这个问题,或者有更好的方法来解决这个问题
FileOpen的代码:
GetOpenFileName函数在其操作中更改工作目录和驱动器。您对cd的调用不会更改工作驱动器,并且cmd.exe仍不在工作目录中
解决方案取决于您最终尝试执行的操作,但您可以指定cmd.exe的完整路径,查看%COMSPEC%环境变量,而不依赖于命令解释器,或者传递OFN_NOCHANGEDIR标志以告诉它不要关闭工作目录
请注意,GUI应用程序需要特定的工作路径并没有任何真正的原因。您应该尽可能完全限定所有内容。呼叫系统将启动一个新进程,因此,即使您的cd命令有效,但它们无效,也无所谓,因为您将更改另一个进程的工作目录,而不是应用程序的进程。要设置应用程序进程的工作目录,请使用SetCurrentDirectory而不是system,例如:
但是,您不需要手动执行此操作,因为GetOpenFileName的OFN_NOCHANGEDIR标志会自动在内部为您处理此操作。无论调用进程的工作目录是什么,当指定OFN_NOCHANGEDIR时,GetOpenFileName将保留它
试试这个:
case ID_PLAY_FFC:
{
FileOpen(hWnd);
}
break;
void FileOpen(HWND hwnd)
{
OPENFILENAME ofn; // common dialog box structure
TCHAR szFile[MAX_PATH+1]; // buffer for file name MAX_PATH = 260
// Zero out szFile so that GetOpenFileName does
// not use the contents to initialize itself.
ZeroMemory(szFile, sizeof(szFile));
// Initialize OPENFILENAME
ZeroMemory(&ofn, sizeof(ofn));
ofn.lStructSize = sizeof(ofn);
ofn.hwndOwner = hwnd;
ofn.lpstrFile = szFile;
ofn.nMaxFile = MAX_PATH;
ofn.lpstrFilter = TEXT("All\0*.*\0Text\0*.TXT\0");
ofn.nFilterIndex = 1;
ofn.lpstrFileTitle = NULL;
ofn.nMaxFileTitle = 0;
ofn.lpstrInitialDir = NULL;
ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST | OFN_NOCHANGEDIR;
// Display the Open dialog box.
if (GetOpenFileName(&ofn)==TRUE)
{
int ret = (int) ShellExecute(
hwnd,
NULL,
ofn.lpstrFile,
NULL,
TEXT("c:/windows/system32/"),
SW_SHOWNORMAL);
if (ret <= 32)
{
MessageBox(NULL, TEXT("Could not open this file"), TEXT("File I/O Error"), MB_ICONSTOP);
return;
}
}
}
系统调用是关于什么的?我不明白这有什么必要。尝试将OFN_NOCHANGEDIR包含在标志中。如果要在默认播放器中播放文件,请使用ShellExecute。
case ID_PLAY_FFC:
{
SetCurrentDirectory(TEXT("c:/windows/system32/"));
FileOpen(hWnd);
SetCurrentDirectory(TEXT("c:/windows/system32/"));
}
break;
case ID_PLAY_FFC:
{
FileOpen(hWnd);
}
break;
void FileOpen(HWND hwnd)
{
OPENFILENAME ofn; // common dialog box structure
TCHAR szFile[MAX_PATH+1]; // buffer for file name MAX_PATH = 260
// Zero out szFile so that GetOpenFileName does
// not use the contents to initialize itself.
ZeroMemory(szFile, sizeof(szFile));
// Initialize OPENFILENAME
ZeroMemory(&ofn, sizeof(ofn));
ofn.lStructSize = sizeof(ofn);
ofn.hwndOwner = hwnd;
ofn.lpstrFile = szFile;
ofn.nMaxFile = MAX_PATH;
ofn.lpstrFilter = TEXT("All\0*.*\0Text\0*.TXT\0");
ofn.nFilterIndex = 1;
ofn.lpstrFileTitle = NULL;
ofn.nMaxFileTitle = 0;
ofn.lpstrInitialDir = NULL;
ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST | OFN_NOCHANGEDIR;
// Display the Open dialog box.
if (GetOpenFileName(&ofn)==TRUE)
{
int ret = (int) ShellExecute(
hwnd,
NULL,
ofn.lpstrFile,
NULL,
TEXT("c:/windows/system32/"),
SW_SHOWNORMAL);
if (ret <= 32)
{
MessageBox(NULL, TEXT("Could not open this file"), TEXT("File I/O Error"), MB_ICONSTOP);
return;
}
}
}