GetOpenFileName和系统函数调用运行时错误c ++ win32 api

时间:2011-12-19 00:20:10

标签: c++ winapi openfiledialog common-dialog

我一直在64位Windows 7机器上使用Visual C ++ 2010 express开发一个简单的Windows程序。到目前为止,我有简单的菜单和可编辑的文本区域。我正在尝试允许用户选择媒体文件(电影或音乐文件)并使用默认程序播放。

当用户从菜单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之前的任何地方工作,但不能在之后。

我唯一真正需要的是文件路径,所以我想知道是否有人知道如何解决这个问题或更好的方法来实现这个目标?

FileOpen()的代码:

    void FileOpen(HWND hwnd)
    {
        OPENFILENAME ofn;           // common dialog box structure
        char szFile[MAX_PATH];      // buffer for file name MAX_PATH = 260
        HANDLE hf;                  // file handle

        // Initialize OPENFILENAME
        ZeroMemory(&ofn, sizeof(ofn));
        ofn.lStructSize = sizeof(ofn);
        ofn.hwndOwner = hwnd;
        ofn.lpstrFile = szFile;

        // Set lpstrFile[0] to '\0' so that GetOpenFileName does not
        // use the contents of szFile to initialize itself.
        ofn.lpstrFile[0] = '\0';
        ofn.nMaxFile = sizeof(szFile);
        ofn.lpstrFilter = "All\0*.*\0Text\0*.TXT\0";
        ofn.nFilterIndex = 1;
        ofn.lpstrFileTitle = NULL;
        ofn.nMaxFileTitle = 0;
        ofn.lpstrInitialDir = NULL;
        ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;

        // Display the Open dialog box.
        //system("cd c:/windows/system32/&&cmd.exe"); will execute here.

        if (GetOpenFileName(&ofn)==TRUE)
        {
            //system("cd c:/windows/system32/&&cmd.exe"); but not here.
            hf = CreateFile(ofn.lpstrFile,
                    GENERIC_READ,
                    0,
                    (LPSECURITY_ATTRIBUTES) NULL,
                    OPEN_EXISTING,
                    FILE_ATTRIBUTE_NORMAL,
                    (HANDLE) NULL);
            if (hf == (HANDLE)-1)
            {
                MessageBox(NULL,"Could not open this file", "File I/O Error", MB_ICONSTOP);
                return;
            }

        }
    }

2 个答案:

答案 0 :(得分:4)

GetOpenFileName()函数会更改工作目录和驱动器作为其操作的一部分。您对cd的呼叫不会更改工作驱动器,cmd.exe仍然不在工作目录中。

解决方案取决于您最终要尝试做什么,但是您可以指定cmd.exe的完整路径(请参阅%COMSPEC%环境变量)而不依赖于命令解释程序,或传递OFN_NOCHANGEDIR标志,告诉它不要破坏工作目录。

请注意,(GUI)应用程序没有任何真正原因需要特定的工作路径。你应该完全符合你的一切资格。

答案 1 :(得分:0)

调用system()启动一个新进程,所以即使你的cd命令有效(它们不是),也没关系,因为你要更改另一个进程的工作目录,而不是你的应用程序的过程。要设置应用流程的工作目录,请使用SetCurrentDirectory()代替system(),例如:

case ID_PLAY_FFC:     
{     
    SetCurrentDirectory(TEXT("c:/windows/system32/"));     
    FileOpen(hWnd);     
    SetCurrentDirectory(TEXT("c:/windows/system32/"));     
}     
break;

但是,您不需要手动执行此操作,因为OFN_NOCHANGEDIR的{​​{1}}标志会自动为您内部处理。无论调用进程的工作目录是什么,GetOpenFileName()都会在指定GetOpenFileName()时保留它。

试试这个:

OFN_NOCHANGEDIR