相关疑难解决方法(0)

在Visual Studio 2005输出窗口中捕获cout?

我创建了一个C++控制台应用程序,只想在Visual Studio 2005 IDE中的输出窗口中捕获cout/cerr语句.我敢肯定,这只是一个我不知道的环境.谁能指出我正确的方向?

c++ visual-studio visual-c++-2005

17
推荐指数
3
解决办法
2万
查看次数

SetStdHandle对cout/printf没有影响

标题说明了一切.当我运行以下代码时:

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!被写入到控制台呼叫的一个结果coutprintf,和Hello, world!也被写入文件Foo.txt的调用的结果WriteFile.我的假设是,当一切都在一开始就被初始化时,HANDLE返回的GetStdHandle被缓存并重用于coutprintf.这是完全合理的,正如我所想的那样,我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)

windows winapi visual-c++

6
推荐指数
1
解决办法
4093
查看次数

可以将std :: cout重定向到Visual Studio 2010 C++开箱即用的输出视图吗?

我想知道是否可以在最新版本的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-studio-2010

5
推荐指数
1
解决办法
2489
查看次数

在非托管C++项目中使用C#COM - > 0x7697C41F的第一次机会异常(KernelBase.dll)

我试图在非托管的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)

.net c# com com-interop visual-c++

5
推荐指数
1
解决办法
5476
查看次数