我创建了一个C++控制台应用程序,只想在Visual Studio 2005 IDE中的输出窗口中捕获cout/cerr语句.我敢肯定,这只是一个我不知道的环境.谁能指出我正确的方向?
标题说明了一切.当我运行以下代码时:
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
HANDLE hFile = CreateFile(TEXT("Foo.txt"), GENERIC_WRITE, FILE_READ_ACCESS | FILE_WRITE_ACCESS,
NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
SetStdHandle(STD_OUTPUT_HANDLE, hFile);
std::cout << "Hello, ";
printf("world!\n");
WriteFile(GetStdHandle(STD_OUTPUT_HANDLE), "Hello, world!\n", 13, NULL, NULL);
SetStdHandle(STD_OUTPUT_HANDLE, hOut);
CloseHandle(hFile);
Run Code Online (Sandbox Code Playgroud)
其结果是,Hello, world!被写入到控制台呼叫的一个结果cout和printf,和Hello, world!也被写入文件Foo.txt的调用的结果WriteFile.我的假设是,当一切都在一开始就被初始化时,HANDLE返回的GetStdHandle被缓存并重用于cout和printf.这是完全合理的,正如我所想的那样,我GetStdHandle需要调用操作系统(可能很长!).麻烦的是我想要覆盖这种行为并尽可能地将cout和printf与应用程序的标准句柄"同步".
在建议任何替代方案之前,让我准确描述一下我正在尝试做什么(是的,我知道可以freopen用于此目的).我需要做的是在更改之前将当前标准输出句柄"保存"在类似堆栈的数据结构上,以便我能够恢复以前的输出句柄.任何不足之处都是这种情况所不能接受的(即我无法恢复CONOUT$等).这需要具有递归的能力.即以下应该按照您的预期工作:
std::cout << "A1" << std::endl;
StartStdOutRedirection(TEXT("Foo.txt"));
std::cout << "B1" << std::endl;
StartStdOutRedirection(TEXT("Bar.txt"));
std::cout << "C1" << std::endl; …Run Code Online (Sandbox Code Playgroud) 我想知道是否可以在最新版本的VS中通过一个简单的设置来完成这个操作,这个设置会导致VS在Eclipse IDE中以与"ContextMenu">"a_Java_src_file_with_main"相同的方式运行.我在新的W7平台上使用VS 2010 Pro的试用版.即使是添加到从"空"模板生成的项目中的最小helloworld cpp源文件也会重定向到命令窗口.
同样的问题3年前:
在Visual Studio 2005输出窗口中捕获cout?
9个月前:
如何将stdout重定向到visual studio的输出窗口
我知道使用OutputDebugString(...)并将流重定向到文件作为替代.
捕获控制台输出以在VS中进行调试?
我试图在非托管的Visual C++解决方案中调用C#COM项目中的方法,但我不断收到下一个错误
First-chance exception at 0x7697C41F (KernelBase.dll) in Program.exe: 0x04242420 (parameters: 0x31415927, 0x6F310000, 0x00BBDAE8).
Run Code Online (Sandbox Code Playgroud)
在下一段代码中
SalesForceNew::IMyObjectClassPtr p;
p.CreateInstance(__uuidof(SalesForceNew::TestObject)); // error
SalesForceNew::MyObject mo = p->getObject(1, "a");
Run Code Online (Sandbox Code Playgroud)
然而,值mo是预期的(5,"aa").
我用这行代码导入tlb文件:
#import "C:\Users\Bob\Desktop\ComTest\SalesForceNew\bin\x86\Debug\SalesForceNew.tlb" named_guids
Run Code Online (Sandbox Code Playgroud)
C#项目如下:
界面:
using System.Runtime.InteropServices;
namespace SalesForceNew
{
[ComVisible(true)]
[Guid("22901ACD-CA30-4D3E-B84B-73B707026AE5")]
public interface IMyObjectClass
{
MyObject getObject(int i, string s);
}
[ComVisible(true)]
[StructLayout(LayoutKind.Sequential)]
public struct MyObject
{
public int Getal;
public string Text;
}
}
Run Code Online (Sandbox Code Playgroud)
实现接口的类:
using System.Runtime.InteropServices;
namespace SalesForceNew
{
[ClassInterface(ClassInterfaceType.None)]
[Guid("234A2A35-F270-458D-A67B-C834EB794B27")]
[ComVisible(true)]
public class TestObject : IMyObjectClass
{ …Run Code Online (Sandbox Code Playgroud)