问题标签 [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 投票
2 回答
699 浏览

c++ - 如何确定进程外 COM 服务器支持的线程模型?

问题

  • 如何找到预定义的进程外(基于 EXE)服务器支持的线程模型

  • 使用oleview吗?

  • 或者任何其他有效的方法?

笔记:

  • 尝试连接到上述服务器以接收事件通知
0 投票
1 回答
2022 浏览

c# - C#ActiveX exe?

我需要一个进程外 C# COM 组件来托管一个 32 位 VB6 COM 对象。我似乎无法弄清楚如何在 C# 中执行此操作。我能想到的最接近的类似物是 activex exe,但 C# 似乎无法做到这一点。由于客户端限制,我无法使用 com+ 或 dllhost.exe。有没有人有任何想法?

0 投票
2 回答
152 浏览

windows - 有没有办法减少与 out-proc COM 调用相关的开销?

我们的程序使用一个 out-proc COM 服务器并在其接口上进行数千次调用。这需要非常非常长的时间——比如大约 50k 呼叫需要一分钟。COM 组件供应商说调用本身非常快,问题在于与进程外调用相关的开销。

在这种情况下,有什么可以调整以减少开销的吗?

0 投票
1 回答
276 浏览

c++ - Vista 和进程外 COM 服务器

我在尝试找出 Vista 上的用户权限和安全设置时遇到了麻烦。情况是这样的:

我有一个 32 位 C++ 应用程序,它充当进程外(==独立 exe)COM 服务器。我有几个使用此服务器的 .Net、FoxPro、X++ 和 C/AL 客户端应用程序。它们都在 WindowsXP 上工作。它们通常在 Windows Vista 上工作(32/64 似乎没有什么区别)。然而,Vista 上的行为非常不稳定。它通常是这样的:
1)从客户端实例化COM对象(从而启动服务器)->成功
2)将前几个命令发送到服务器->成功
3)崩溃,异常说明客户端COM对象未绑定?!怎么回事?!我们刚刚成功地将这个对象用于第 2 步!

如果我在客户端程序上“以管理员身份启动”,它总是可以正常可靠地工作。但是,仅以管理员身份登录并通过双击启动客户端将失败。两者有什么区别?

客户端和服务器在同一台机器上本地运行。这是在虚拟机上全新安装 Vista Ultimate 32 位。

我完全不知所措。有什么建议么?

0 投票
1 回答
2099 浏览

com - 如何使用没有 tlb 文件的进程外 COM 服务器

它是关于 Window COM 组件的。

  • Server.exe:32 位进程外 COM 服务器
  • CLSID_Application:Server.exe 中 COM 对象的 GUID
  • Client.exe:一个 64 位客户端应用程序,它以无注册方式使用 Server.exe。

众所周知,exe 不能用作无注册表的 COM 组件,为了模仿这种行为,我通过提供确切路径自己启动 Server.exe 进程:

  • CreateProcess("Server.exe")
  • IClassFactory* pFactory = CoGetClassObject(CLSID_Application)
  • pFactory->CreateInstance(ppAppObject);

如果我注册了 Server.tlb,它就可以工作,但是在取消注册 Server.tlb 之后,它只是无法创建 ppAppObject,即使我将清单嵌入到 Server.exe 和 Client.exe 中:

你对此有什么想法吗?

编辑:事实证明,如果我为接口指定 tlbid 并将清单嵌入到两个 exe 中,它确实有效

0 投票
2 回答
815 浏览

windows - 编组一个编组接口是否给我一个代理或原始接口的编组器?

这是一个具体的例子:

我通过调用创建一个IWeBrowser2接口wb.CoCreateInstance(CLSID_InternetExplorer, 0, CLSCTX_SERVER);。这为我提供了一个从我的进程到任何正在运行的 iexplore.exe 进程恰好在我的线程 A中包含此浏览器选项卡的编组接口。

现在我使用IGlobalInterfaceTable为这个接口获取一个 cookie,将它传递给我的线程 B并从那里请求封送接口。

问题:我是在我的线程 A 中获得代理的代理,还是直接获得 IE 进程中的实例?

对我来说,我将获得实例的直接代理并引用它,这似乎是明智的,
但是

如果我结束我的线程 A,我在那里创建的 cookie 将变得无效,并且我无法再检索(和关闭)指向我创建的 Web 浏览器的接口指针。除非该线程中有一个 thunk 在线程退出时被销毁,否则这是没有意义的。

编辑:哦,两个线程都是 STA。

0 投票
1 回答
1076 浏览

java - 使用 Java/JaCoB 让 32 位 COM 客户端与进程外 64 位服务器通信

这个问题表明 32 位 COM 客户端可以与 64 位 COM 服务器通信(反之亦然),前提是服务器处于进程外。我正在尝试使用 Java Com Bridge (JaCoB) 库实现一个客户端,以这种方式与第三方进程外服务器通信,根据这个问题应该是可能的。如果我匹配进程架构(32 位到 32 位或 64 位到 64 位),我正在使用的测试代码会成功,但任何交叉组合都会失败,并出现此异常:

有任何想法吗?


更新

调试异常后,我相当确定底层 COM 错误是DISP_E_BADCALLEE。经过一些网络挖掘后,我发现一个可能的原因是方法签名无效,所以这里有更多细节。COM 服务器是 MATLAB,我正在尝试调用ExecuteandQuit方法。以下是他们的 COM 类型签名(来自 OLEView):

BSTR _stdcall Execute([in] BSTR Name);
无效 _stdcall 退出();

这是我的测试代码:

0 投票
1 回答
387 浏览

.net - 从 ATL exe 服务器 (COM) 调用 .NET GUI

我们有以下情况:

一个 ATL COM 服务器(进程外,EXE),它承载带有连接点的 COM 对象。这些对象“存在于”单个 (exe) 进程中,它们触发事件(使用 Fire_* 方法)以便其他进程(例如:不同进程中的 .NET GUI 应用程序,ATL EXE 服务器的“客户端”) ) 可以捕获这些事件并做出相应的反应。

目前,我们有一个 .NET 应用程序(Windows 窗体),它是 ATL 服务器的客户端。启动(双击)时,它会将一些委托(事件处理程序)附加到 ATL 服务器中托管的 COM 对象事件(连接点)。每次从 ATL 服务器触发事件​​时,.NET 客户端通常会在主窗口中显示一些信息或打开一个新窗口供用户交互。此解决方案基于以下文章: http: //www.codeproject.com/KB/COM/cominterop.aspx#ConnectionPoints(COM-.NET 事件处理)。

上述场景假定用户在触发事件之前实际上已经双击了 .NET 客户端 (exe),即 - 显式打开了 .NET 应用程序。如果 .NET 客户端未打开(实例化),则触发的事件“丢失” - 没有客户端处理它。

我们想要以下情况:

当从 ATL 服务器触发事件​​时,应立即出现(弹出)窗口供用户交互(例如:填写电子邮件文本框并按“确定”),而无需启动 .NET客户在一切之前明确。这样,用户将收到有关每个事件的通知,并可以交互地对其做出反应。

我们查看了将 .NET 客户端应用程序作为 ATL 服务器内的 dll 托管的选项,但我读过从 ATL EXE 显示 GUI 是一个很大的“不可以”(任何 GUI,而不仅仅是 .NET GUI WinForms 或 WPF)。

当服务器和客户端在两个不同的进程中运行(并且“客户端”尚未运行)时,这可能吗?有没有人遇到同样的问题?是否已解决(以及如何...)?

谢谢 ;-)

暗里

有解决方案吗?

0 投票
1 回答
198 浏览

c# - 我可以只用 C# 4.0 创建一个 COM 服务器吗?

可能重复:
在 C# 中实现“out of proc”COM 服务器需要做什么?

你好,

我对 COM 或 C++ 了解不多,所以也许这是一个愚蠢的问题:

在不使用 C++/ATL 包装程序的情况下,我是否可以制作一个可通过 COM 从传统 COM 客户端调用的进程外 C#/.net 4.0 应用程序?

谢谢

0 投票
1 回答
3154 浏览

windows - 来自同一用户帐户的 LocalServer32 EXE 的 COM 激活是否共享现有进程?

当客户端应用程序调用 c_com_ptr::CreateInstance (使用 ATL 包装器)时,我启动了一个 COM 服务器 LocalServer32 EXE。

在 Windows 7 上,当在同一用户帐户下运行的第二个客户端应用程序也调用 c_com_ptr::CreateInstance 时,将启动在同一用户帐户下运行的 EXE 的第二个副本。从前世我的印象是,第二个客户将共享第一个 EXE。

LocalServer32 进程是否共享?什么时候,什么时候不?谷歌搜索答案给我一个巨大的噪声信号比,我找不到答案。

我的 CLSID 注册表项的 LocalServer32 值给出了 EXE 路径、ProgID、可编程(空字符串)、TypeLib (GUID) 和 VersionIndependentProgId。我有一个 AppID 密钥。

不想将 EXE 作为服务运行,我不介意进程不共享。我只想知道规则,所以我知道会发生什么(在 Windows Server 2003 及更高版本上。)

编辑:在下面 Chris 的回答之后,我检查了我的服务器中的 CoRegisterClassObject 调用。我正在使用 ATL,并且我覆盖了 MyServer::RegisterClassObjects 以挂钩到 CAtlExeModuleT::RegisterClassObjects 的调用链,并看到 ATL 正在使用 CLSCTX_LOCAL_SERVER 和 REGCLS_MULTIPLEUSE。

将其更改为 CLSCTX_LOCAL_SERVER 和 REGCLS_SINGLEUSE 会导致启动更多进程,具体取决于客户端创建的 COM 对象的数量,如预期的那样。

尽管如此,回到 REGCLS_MULTIPLEUSE,每个 COM 客户端进程都有一个 COM 服务器进程,每个服务器进程都包含其客户端的所有 COM 对象,正如预期的那样,除了如果两个 COM 客户端在同一个用户帐户下运行,它们每个获得他们自己的服务器,这不是我理解的 REGCLS_MULTIPLEUSE。

不同之处在于客户端本身实际上是 Windows 服务吗?(它们是。)当作为用户帐户运行的 Windows 服务进程在 REGCLS_MULTIPLEUSE 下创建一个 COM 对象时,是否会进行不同的处理,从而导致观察到的行为?为什么我得到多个进程?(澄清一下,我希望我的 COM 服务器作为 Windows 服务运行,但使用它的客户端确实作为 Windows 服务运行。)

此外,将客户端作为本地系统或网络服务运行,REGCLS_MULTIPLEUSE 可以正常工作:只启动一个 COM 服务器 EXE 进程。当 COM 客户端是在用户帐户下运行的 Windows 服务时,将启动多个进程。