0

我想在 Winforms 应用程序 (c++/cli) 中启动默认的 Windows 录音。在“运行”对话框中,Vista/7 的命令是“录音机”。所以我从最简单的方法开始:

System::Diagnostics::Process::Start("soundrecorder");

但它会引发 System.ComponentModel.Win32Exception(消息:系统找不到指定的文件)。所以我使用了真实的路径:

String^ path = Environment::GetFolderPath(Environment::SpecialFolder::System);
path = System::IO::Path::Combine(path, "soundrecorder.exe");
System::Diagnostics::Process::Start(path);

结果相同。硬编码完整路径也失败了。像“mspaint”这样的任何其他命令都可以正常运行。

我认为问题出在我的环境/当前用户/机器上。然后我用 C# 编写了一个愚蠢的程序:

public abstract class StupidProgram{
  public static void Main(string[] args)
  {
    Process.Start("soundrecorder");
  }
}

它可以工作,甚至更多:如果我从我的应用程序运行“StupidProgram.exe”,它也可以工作。

该应用程序在 C++/CLI 中编码为 32 位程序。我正在使用 Windows 7 64 位。我在 Windows 7 32 位中测试了该应用程序并且它可以工作,因此它接缝了 32/64 位兼容性问题。

您对这种行为有任何想法吗?

4

1 回答 1

0

引用您的 C++/CLI 代码:

System::Diagnostics::Process::Start("soundrecord");

引用您的 C# 代码:

Process.Start("soundrecorder");
                          ^^

指定“soundrecord”不起作用,因为它被称为“soundrecord er

如果没有确切的异常文本,我认为指定完整路径不起作用,因为您的应用程序正在编译为 x86,并且您正在运行 64 位 Windows,并且操作系统正在执行文件系统重定向。

我建议您使用与 C# 命令等效的命令:Windows 具有搜索可执行文件路径的功能,让它这样做。当 MS 决定移动它时,对完整路径进行硬编码将在未来产生兼容性问题。

System::Diagnostics::Process::Start("soundrecorder");
                                                ^^
于 2013-05-31T15:36:42.663 回答