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

标签 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;
            }

        }
    }

最佳答案

GetOpenFileName() 函数在其操作过程中更改工作目录和驱动器。您对 cd 的调用不会更改工作驱动器,并且 cmd.exe 仍不在工作目录中。

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

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

关于c++ - GetOpenFileName 和系统函数调用运行时错误 c++ win32 api,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8555953/

相关文章:

objective-c - 打开文件对话框

c++ - 二进制搜索树析构函数 C++

c# - 只读打开文件对话框

c++ - GoogleTest 仅在定义在 .h 文件中时有效

c++ - 参数 `NumberOfConcurrentThreads`在 `CreateIoCompletionPort`中是如何使用的

c++ - 如果路径太长,mciSendString 将不会播放音频文件

c++ - WC_NO_BEST_FIT_CHARS 未定义?

c# - OpenFileDialog 继续显示 .lnk 文件 WPF

c++ - 专门模板类的 friend (C++)

c++ - 如何找到我的 C++ 应用程序正在使用的 header ?