问题标签 [out-of-process]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
1041 浏览

winapi - 64位应用程序+进程外32位模态对话框

我们为 3rd 方应用程序开发插件扩展(工具栏)。新版本的应用程序也是 64 位的 - 问题来了。我们的插件是在VB6下开发的。在 32 位应用程序中一切正常。

应用程序的制造商还提供包装器(64 位版本),它为 32 位插件自动运行,因此我们的插件运行“进程外”。通常它工作正常,但它需要(显然)一些必要的解决方法。

我们的插件只有模态形式。当它运行 64 位应用程序的“进程外”时,需要像这样设置所有者和父级

显示表单的代码现在是:

1)第一个小问题是,单击“父”应用程序窗口会导致我们的窗口从插件失去焦点(但插件窗口仍然在顶部并且父应用程序已禁用控件)。在 32 位版本中,它以标准方式运行 - 在模式对话框窗口上播放“哔”并聚焦闪光灯 - 如何在“进程外”完成它?

The Old New Thing 博客上描述了这个问题(黄色矩形),之后的解决方案就像

在进程 B 中调用 DialogBox 时,将 hwndA 作为所有者窗口传递

但是在 VB6 中,你有函数Form.Show([Modal], [OwnerForm]),其中OwnerForm意味着type,而不是hWnd

申请表的类型在其界面中不可用。我找不到使用 WinAPI 的解决方案。

2)第二个问题(我认为原因是一样的)是,当我显示插件模式对话框时,然后单击“查看桌面”(或 Win+M),然后我将返回应用程序(单击图标在面板中),它只播放“哔”声,什么也不做。(解决方案只是杀死应用程序)。同样,32 位版本工作正常。

感谢您的回答并为我的英语道歉。是的,我知道VB6现在不支持了,插件只处于维护模式,基于C#的新版本的开发正在进行中。在完成之前,VB6 必须工作。


编辑:

在 Spy++ 中,在 32 位应用程序和 64 位应用程序中运行时窗口属性的差异:

32 位与 64 位 App 下的插件窗口样式差异:

32 位与 64 位应用程序下的插件窗口父/所有者差异:

0 投票
1 回答
1779 浏览

c++ - 通过代理\存根的 C++ COM 进程外编组数据

我正在尝试在一些 exe 文件和客户端中创建进程外 com 服务器,它将通过proxy\stub机制访问功能。我有我的 .idl 文件:

我使用 midl 编译器 _p.c、_i.c 文件生成,使用 .def 创建代理\存根 dll:

然后我使用 注册了这个 dll regsrv32,在 win 注册表中我有这个: 在此处输入图像描述

在我的服务器中,我创建了工厂:

它等待客户呼叫。在客户端,我使用 CreateInstance 调用我的工厂:

并且客户端收到 null iface 并且结果是E_UNEXPECTED,但是在工厂中它成功创建并且我从 Factory:: 返回 S_OK CreateInstance()。我不明白 PS 机制是否使用我的 .dll?也许我忘记了一些步骤?为什么我的对象不能通过进程边界?

编辑: 我试图替换客户端代码,现在是:

当我试图调用 Test(1) 时,它会抛出一个错误,这是纯虚函数。在 CreateInstance 的工厂中,我收到了 Unkonown 接口的要求。

0 投票
0 回答
847 浏览

c++ - 现有 exe 中的 ATL COM 进程外服务器

我已经有我的应用程序的现有代码。我想创建一个 COM 服务器,它将在该进程中工作。而这个应用程序进程就像一个 COM 服务器。可以用ATL实现吗?也许有人知道实现的例子?

0 投票
0 回答
91 浏览

c++ - 错误的编组

我开发了一个进程外服务器并尝试编组输入参数,但它失败了。我的 .idl 文件是:

我的服务器代码:

我的客户代码:

我调试了这个客户端调用它发送正确的值。但是服务器收到这个:

在此处输入图像描述

我创建了一个代理\存根库,用 regsvr 注册它,并在客户端和服务器代码中包含 _i.c 和 _h.h 文件,一切都很好。

调用解锁功能后的客户端向我显示此错误:

运行时检查失败 #0 - ESP 的值未在函数调用中正确保存。这通常是调用使用一种调用约定声明的函数和使用另一种调用约定声明的函数指针的结果。

0 投票
1 回答
333 浏览

php - 在 Azure 上使用 PHP 从进程外 COM 组件调用方法

我编写了一个简单的 PHP 脚本,它为进程外(即 exe 文件)COM 组件实例化 COM 对象,并使用它来调用组件公开的 COM 方法。这个 COM 方法非常简单地将作为第一个参数传递的数字翻了四倍,在第二个参数中返回结果(通过引用传递)。下面显示的脚本在我的 WampServer 2.0 (Apache 2.2.11 / PHP 5.3.1) 上的本地开发机器上成功运行。COM 组件是使用 Delphi 构建的 Win32 可执行文件。

注意:据我了解,只能通过引用使用 VARIANT 类型的 COM 方法来传递参数,因为整数和字符串等常见数据类型不起作用(请参阅http://www.php.net/manual/ zh/ref.com.php#45038)。

然后,我创建并部署了一个带有启动脚本的 Azure Web 角色(云服务),该脚本成功注册了 COM 组件,即相应的注册表项出现在注册表中。为了进一步确认可以与 COM 组件交互,我使用 RDP 连接到云服务实例并安装了 Microsoft Access Runtime 2010,因为我有一个 Access 应用程序,它提供了一个 GUI 来测试 COM 组件的方法。我能够运行这个应用程序并成功地与 COM 组件交互,使用它向CalculateWithVariants方法传递一个整数并返回预期的四倍结果。因此,我已经确定 COM 组件已安装并且可以在 Azure 云服务实例上进行交互。

接下来我将上面的 PHP 脚本包含在 Web Role 中,并将其部署在 Azure 上。不幸的是,从浏览器调用脚本会导致 HTTP 错误 500(内部服务器错误),我正在努力找出原因。如果我注释掉所有引用的行$oleapp,我仍然会得到同样的错误。如果我另外注释掉实例化变体对象的行,则不会发生错误。如果我恢复实例化 COM 对象的行和它下面的行,我不会收到错误消息,但唯一回显的文本来自 COM 对象创建行之前的行,即对Version方法的调用失败。因此,它似乎正在努力创建变体对象和创建 COM 对象。

我对如何解决这个问题有点困惑。因此,如果有人对前进的道路有任何指示,我将不胜感激。

更新 1

我决定在 Azure 平台上尝试不同的行动方案...

  • 使用 Windows Server 2008 R2 操作系统创建 Azure虚拟机
  • 在 VM 中安装WampServer 2.2E (Apache 2.2.22 / PHP 5.3.13 / MySQL 5.5.24) 作为测试这种方法是否可行的快速简便的方法
  • 将上述 PHP 脚本复制到 WampServer “www 目录”
  • 启动 WampServer
  • 从 WampServer 菜单中选择“Put Online”选项(通过左键单击 Windows 任务栏通知区域中的 WampServer 图标访问)
  • 为 VM 防火墙创建“入站规则”以允许连接到端口 80

...谢天谢地,脚本运行成功!

理想情况下,我仍然希望将此作为 Azure 云服务运行,因为我不需要在完整的 VM 中维护 PHP 安装。

更新 2

我尝试重新启动云服务,然后远程连接到云服务的实例并查看应用程序事件查看器。我看到 WMI 在启动期间记录了 1 个错误:

然后我运行了几次上述脚本并重新检查了应用程序事件查看器,但没有记录任何内容。

我还检查了 IIS 日志和Azurelog和文件,但无济于事。startup-tasks-logstartup-tasks-error-log

0 投票
0 回答
263 浏览

process - 什么是 WinRT 远程处理?

我正在阅读有关 Windows Phone 8 中 IPC 的内容,并且遇到了 Peter Torr 关于使用命名事件来协调前台应用程序和后台代理的文章。在文章的底部,他提到WinRT remoting了在前台和后台进程之间进行 IPC 的先进技术。

那么是什么WinRT remoting?它与某种方式有关out of process COM server吗?

0 投票
2 回答
399 浏览

c++ - WM_PAINT 和未完成的 COM 调用(ATL OOP 服务器“死锁”)

我们开发了一个 STA ATL COM OOP 服务器,几乎一切正常。我们面临一个问题:当 COM 客户端通过 Windows 消息在内部获取任何 COM 调用的结果时,可以在等待 COM 调用的应答时处理 WM_PAINT 消息(或我猜的任何其他消息)。这本身可能是一个问题,但最大的问题是,在之前的 COM 调用完成之前,对服务器的所有调用都会失败(HRESULT=0x80010005),这是一个相当大的问题,因为它在我们的应用程序中经常发生。我们无法从绘图中删除 COM 调用。

我已经对此进行了大量研究,但找不到任何关于它的内容(除了这篇2006 年的文章说明了这个问题以及一些无法在我们的案例中应用的解决方案),但我看到的不仅是 WM_PAINT危险的是,我们在任何 Windows 事件(消息)中执行的对服务器的任何调用都可能导致相同的问题。

所以基本上我们可以有不同的解决方案,但不知道要使用哪些 COM 方法或如何使用: 1- 一个等待直到最后一个 COM 调用被处理并返回值的方法 2- 一个知道在服务器和处理 COM 答案的方法(全部从客户端调用) 3- 知道我们是否可以在客户端中实现 IMessageFilter 类以及如何处理它和处理调用等。

谢谢!

0 投票
0 回答
499 浏览

c++ - CoCreateInstance 从 COM 服务返回 E_NOINTERFACE(服务重启修复它)

有时,我实现的 COM 服务会进入我的 C++ 客户端应用程序由于E_NOINTERFACE错误而无法创建 COM 对象的状态。客户端应用程序是我经常运行的一次性运行(非持久性).exe。

一开始,COM 服务大部分时间都可以正常工作,但突然之间CoCreateInstance()会开始返回E_NOINTERFACE。更令人困惑的是,我编写的 VBScript 继续成功运行并毫无问题地创建 COM 对象。

如果我重新启动 COM 服务,一切都会恢复正常,我的 C++ 应用程序将再次开始工作。

下面是我运行的 C++ 和 VBScript 片段。

C++

VBScript

0 投票
0 回答
347 浏览

com - 如何以登录用户身份运行 DCOM 服务器?

我有以下情况:我的应用程序,一个服务,使用 CoInitialize 和 CreateInstance 实例化一个 DCOM 服务器(exe)以获取它的接口指针,它在 XP 上运行良好,但由于该服务器创建了一个 GUI,所以它不能运行Windows 7,因为服务(会话 0)无权访问用户的屏幕。

所以,我的问题是如何更改我的代码以作为登录用户启动 COM 服务器?

我正在考虑使用 CreateInstance 我可以使用 CreateProcessAsUser 作为登录用户启动 DCOM 服务器,但我不知道如何从创建的进程中获取接口指针。你有什么主意吗?谢谢!

0 投票
1 回答
638 浏览

vb.net - 引用另一个具有 COM 可见 TRUE 的 VB.NET exe

我想模仿 VB6-Active-X-Exe 的行为。

为此,我创建了一个新项目并将其设置设置为“COM Visible=True”。

我现在可以将此 .exe 添加到我的主应用程序中,我可以调用它,调用该 .exe 中的函数等。

但是,我认为这并没有真正脱离过程。

因此,我想对此类 .exe 的行为进行更多调查。但是我没有找到任何官方文档。

有人可以告诉我在哪里可以找到更多信息吗?

谢谢!