C++ COM MFC应用程序don';不显示窗口

C++ COM MFC应用程序don';不显示窗口,c++,com,mfc,C++,Com,Mfc,我有一个支持ATL的MFC应用程序,其思想是当有人创建我在MFC应用程序中声明的接口的实例时,这个实例化创建并显示一个窗口 如果com客户机是cmd.exe,这一切都可以正常工作。我制作了一个快速com客户机,该客户机实例接口,当出现这种实例时,窗口会按需要显示 但是,如果在另一个com对象(例如atl服务器对象(服务))中执行此实例化,则不会显示该窗口。请注意,mfc进程是在DcomLaunch进程下创建的,但不显示任何窗口。一切正常,但窗口不显示在我的桌面上 两个问题: 1) 为什么在这种情

我有一个支持ATL的MFC应用程序,其思想是当有人创建我在MFC应用程序中声明的接口的实例时,这个实例化创建并显示一个窗口

如果com客户机是cmd.exe,这一切都可以正常工作。我制作了一个快速com客户机,该客户机实例接口,当出现这种实例时,窗口会按需要显示

但是,如果在另一个com对象(例如atl服务器对象(服务))中执行此实例化,则不会显示该窗口。请注意,mfc进程是在DcomLaunch进程下创建的,但不显示任何窗口。一切正常,但窗口不显示在我的桌面上

两个问题:

1) 为什么在这种情况下不显示我的窗口

2) 当我用我的控制台应用程序创建相同的界面时,只创建了mfc应用程序的一个进程,无论我启动了多少个控制台应用程序,如果服务尝试实例化多个对象,则会创建多个mfc进程!为什么会这样,我怎样才能避免呢。如何使第一个mfc进程始终与响应客户端调用的进程相同

(我认为这都是由于安全设置……但我已经尝试更改了一些,但什么也没有更改……)

谢谢


Nuno

通常,服务无法创建窗口。在Vista之前,您可以通过给定服务属性的“登录”标记上的“允许服务与桌面交互”复选框启用服务与桌面交互(例如,打开窗口)。如果你的目标是Vista,这不是一个选项

但是,考虑到这是您正在处理的DcomLaunch服务,您显然不想这样做

即使是您自己编写的服务,大多数人都会出于以下几个原因(无特定顺序)建议您不要这样做:

  • 创建的UI只能在会话0中访问
  • 创建窗口会在您(可能)的特权进程中创建攻击服务,因为用户运行的任何其他进程都可以与该服务的窗口交互

同样,由于上述方法仅适用于Vista之前的版本,而且无论如何都不是一个好主意,对于想要公开UI的服务来说,普遍接受的“最佳实践”是使用一个单独的应用程序,该应用程序包含一个UI,该UI使用您选择使用的任何IPC机制与服务进行通信。

一般来说,服务无法创建windows。在Vista之前,您可以通过给定服务属性的“登录”标记上的“允许服务与桌面交互”复选框启用服务与桌面交互(例如,打开窗口)。如果你的目标是Vista,这不是一个选项

但是,考虑到这是您正在处理的DcomLaunch服务,您显然不想这样做

即使是您自己编写的服务,大多数人都会出于以下几个原因(无特定顺序)建议您不要这样做:

  • 创建的UI只能在会话0中访问
  • 创建窗口会在您(可能)的特权进程中创建攻击服务,因为用户运行的任何其他进程都可以与该服务的窗口交互

同样,由于上述方法仅适用于Vista之前的版本,而且无论如何都不是一个好主意,对于想要公开UI的服务来说,普遍接受的“最佳实践”是使用一个单独的应用程序,该应用程序包含一个UI,该UI使用您选择使用的任何IPC机制与服务进行通信。

是的,您是对的,但我所做的是你建议不要做的:)(一个带有“允许服务与桌面交互”复选框的服务),它工作正常。您提供的最佳实践解决方案不错,只是有点烦人,因为对于一些简单但还行的事情来说,工作量太大,我将把您关于最佳实践的建议保存在我的头脑中:)谢谢您是对的,但我所做的是您建议不要做的:)(带有“允许服务与桌面交互”复选框的服务)而且效果很好。您提供的最佳实践解决方案不错,只是有点烦人,因为对于一些简单的事情来说工作量太大了,但是好吧,我会把您关于最佳实践的建议保存在我的头脑中:)谢谢