我想在Winforms应用程序(c ++ / cli)中启动默认的Windows声音记录。在“运行”对话框中,Vista / 7的命令是“soundrecorder”。所以我从最简单的方式开始:
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位兼容性问题。
你对这种行为有什么看法吗?
答案 0 :(得分: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");
^^