GETOpenFLAMENEMENT和系统函数调用运行时错误C++ +Win32 API 我一直在使用一个64位Windows 7机器上的Visual C++ 2010 Express来编写一个简单的Windows程序。到目前为止,我有一个简单的菜单和一个可编辑的文本区域。我正在尝试允许用户选择媒体文件、电影或音乐文件,并使用默认程序播放

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; 问题是第一个系统调用按

当用户从菜单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;
问题是第一个系统调用按预期运行。第二个调用告诉我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;  
        }  
    }  
}