如何在 ATL COM 模块中打印控制台输出?

Posted

技术标签:

【中文标题】如何在 ATL COM 模块中打印控制台输出?【英文标题】:How to print console output in ATL COM module? 【发布时间】:2018-06-25 20:27:07 【问题描述】:

我有一个 ATL exe 模块,我想将一些输出打印到控制台。 此模块由另一个 C# 控制台应用程序调用,因此它应该已经有一个控制台。

在 ATL 中:

extern "C" int WINAPI _tWinMain(HINSTANCE, HINSTANCE, LPTSTR , int nShowCmd)

    printf("test");                                   // <- this did nothing
    MessageBox(nullptr, L"test", L"caption", MB_OK);  // <- this work
    //...

【问题讨论】:

您声明“此模块被另一个 C# 控制台应用程序调用”,但是这似乎是一个单独的 Windows 应用程序(不是控制台应用程序),因为您有一个 _tWinMain 而不是一个主入口函数.有关详细信息,请参阅***.com/questions/18709403/winmain-vs-main-c。您应该能够将项目类型从 Windows 更改为 Console,然后查看您的 printf 输出。 @holtavolt 它是单独的 COM 对象 - 因此可以将其作为 EXE 使用(假设 OP 出于某种原因需要进程隔离,或者可能在同一会话中的多个客户端之间共享相同的 COM 对象)跨度> @Alexei Levenkov - 我明白了(我错过了标题中提到的 COM)并赞成你的回答。 【参考方案1】:

EXE COM 服务器将自行启动,而不是附加到调用者的控制台 - 它甚至可能已经由一些以前的客户端启动,甚至可能不是控制台应用程序。

如果您需要将输出发送到调用者的控制台,您最好将文本返回给调用者。

可以将调用者的控制台句柄作为方法参数传递给 COM 对象,并尝试配置默认输出以使用该控制台,但我个人甚至不会尝试。 IE。您必须弄清楚多个客户端如何提供多个控制台句柄以设置为默认值...

【讨论】:

@Dia - 如果您的目标是能够严格地为 COM 服务器的开发调试目的添加文本,您可以考虑添加一个文件记录器,并在您的控制台窗口。或者,您可以使用 OutputDebugString 和 DebugView 实用程序(或只是 Visual Studio 的输出窗口)来获取类似控制台的日志记录。 @holtavolt 我现在正在使用日志文件。感谢您的评论。

以上是关于如何在 ATL COM 模块中打印控制台输出?的主要内容,如果未能解决你的问题,请参考以下文章

Python+Selenium进行UI自动化测试项目中,常用的小技巧4:日志打印,longging模块(控制台和文件同时输出)

如何在控制台中打印 RMarkdown 块代码输出?

在 DOS 批处理文件中找到匹配项后如何打印所有控制台输出?

如何在 Python 中将控制台打印到文件中

VS+Qt代码,显示界面的同时如何在控制台输出打印信息

VS+Qt代码,显示界面的同时如何在控制台输出打印信息