供参考,请参阅此小程序的源代码,EndPointController.exe: http://www.daveamenta.com/2011-05/programmatically-or-command-line-change-the-default-sound-playback-device-in-windows-7/
基本上,它是一个Visual Studio C ++程序,它使用printf
函数将信息写入命令shell窗口。
以下是我在Windows 7 x64上运行程序的示例(使用上面链接中提供的编译二进制文件):
C:\Users\James\Desktop>EndPointController.exe
Audio Device 0: Speakers (High Definition Audio Device)
Audio Device 1: AMD HDMI Output (AMD High Definition Audio Device)
Audio Device 2: Digital Audio (S/PDIF) (High Definition Audio Device)
Audio Device 3: Digital Audio (S/PDIF) (High Definition Audio Device)
C:\Users\James\Desktop>
这完美无缺。现在,我将尝试将输出重定向到文件:
C:\Users\James\Desktop>EndPointController.exe > test.txt
C:\Users\James\Desktop>type test.txt
C:\Users\James\Desktop>
没用; test.txt
是空的。这是权限问题吗?
C:\Users\James\Desktop>dir > test.txt
C:\Users\James\Desktop>type test.txt
Volume in drive C has no label.
Volume Serial Number is 16EC-AE63
Directory of C:\Users\James\Desktop
04/20/2014 03:11 AM <DIR> .
04/20/2014 03:11 AM <DIR> ..
05/31/2011 06:16 PM 7,168 EndPointController.exe
04/20/2014 03:12 AM 0 test.txt
2 File(s) 7,168 bytes
3 Dir(s) 171,347,292,160 bytes free
C:\Users\James\Desktop>
不,它似乎不是权限问题。任何人都可以解释这个printf
函数是如何以某种方式绕过标准的重定向过程的吗?
答案 0 :(得分:3)
当程序因某种原因退出时,似乎没有刷新输出缓冲区。
在fflush(stdout);
行之前添加return hr;
为我修复了它。
我尝试了一些其他的东西,比如将宽字符串转换为narrow并将其传递给printf,使用wprintf,并将其编译为多字节并将字符串转换为narrow以传递给printf,但只能手动刷新缓冲区。
答案 1 :(得分:1)
我尝试从您包含的链接下载项目文件,然后运行已构建并包含在Release文件夹中的可执行文件,它按预期工作。我还在VC ++ 2013中重新构建了代码,它也按预期工作。
我怀疑操作员错误或某些系统问题 - 您问题中的信息似乎并不表示操作员错误;你提供的证据证明这不是一个案例。
我从C:\Users\<userprofile>\Documents\Visual Studio 2013\test\Release
运行了代码。 Desktop
是Windows中的“特殊”文件夹,可能有一些影响,但我对此表示怀疑。无论哪种方式,我认为这不是一个编程问题。