在cmd启动一个win32程序,printf把信息输出到启运它的那个CMD窗口

1
2
3
4
5
6
7
8
9
10
11
12
#define ProcessBasicInformation 0 
typedef struct 
    DWORD ExitStatus; 
    DWORD PebBaseAddress; 
    DWORD AffinityMask; 
    DWORD BasePriority; 
    ULONG UniqueProcessId; 
    ULONG InheritedFromUniqueProcessId; 
}   PROCESS_BASIC_INFORMATION; 
typedef LONG (WINAPI *PROCNTQSIP)(HANDLE, UINT, PVOID, ULONG, PULONG); 
PROCNTQSIP NtQueryInformationProcess;

  在CWinApp::InitInstance()中添加:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
NtQueryInformationProcess = (PROCNTQSIP)GetProcAddress(GetModuleHandle(L"ntdll.dll"),
            "NtQueryInformationProcess"); 
 
        HANDLE                    hProcess; 
        PROCESS_BASIC_INFORMATION pbi; 
 
        hProcess = OpenProcess(PROCESS_QUERY_INFORMATION,FALSE,GetCurrentProcessId());
 
        NtQueryInformationProcess(hProcess, ProcessBasicInformation, (PVOID)&pbi, 
            sizeof(PROCESS_BASIC_INFORMATION), NULL); 
 
        CloseHandle(hProcess); 
 
        AttachConsole(pbi.InheritedFromUniqueProcessId);
 
        freopen("CONOUT$","w",stdout);             // 重定向输出

  用printf函数就可以把信息输出到启运它的那个CMD窗口了。

方法二:

1
2
3
AttachConsole(ATTACH_PARENT_PROCESS); // 将当前程序附着到父进程上,因为是从控制台启动的,所以当前程序的父进程就是那个控制台。
    freopen("CONIN$", "r+t", stdin); // 重定向 STDIN
    freopen("CONOUT$", "w+t", stdout); // 重定向STDOUT

  

posted @   一样菜  阅读(1393)  评论(1编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
点击右上角即可分享
微信分享提示