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

iis-6 - ASPNET 进程外会话被神秘地重置

我正面临一个非常特殊的问题,即在没有任何明显原因的情况下重置会话。这是随机发生的,每几十或几百个请求一次。

我的 Web 应用程序在 Windows 2003、IIS 6.0、.NET 1.1 上运行。该应用程序有一个网页,该网页在其 Page_Load 事件期间填充了一堆 Session 变量。数据存储在 ASPNET 状态服务的进程外。

在 Page_load 事件退出并显示页面后,用户单击一个按钮,该按钮检索会话数据并对其进行一些处理。而这个 Button_click 就是问题发生的地方。在某些情况下,会话变量为 null,从而引发 nullRefException。

我们的跟踪显示 Button_click 事件期间的 sessionID 是一个全新的会话,其 ID 与 Page_Load 事件的会话不同。因此,应用程序无法检索在 Page_Load 期间存储的数据。我们的事件日志显示,有问题的请求的会话变量确实在 Page_load 事件期间填充,并且响应发送没有问题,这通常会保留数据。

我们已经排除了会话超时;尽管超时仍会导致相同的 nullRefException,但 Page_load 中的相同会话 ID 将用于检索不存在的数据。在这种情况下,sessionID 与原始的不同。

我们不会以任何方式弄乱 ASPNET cookie,我们不会使用 session.abandon,也不会无意中从会话中删除项目。

我的问题是:哪些服务器端因素可能导致持卡人的会话被这样重置?应用程序事件日志不包含任何有用的信息。

此外,是否有任何客户端(例如 cookie 篡改)可以强制 IIS 在页面的后续回发时分配新会话?

提前谢谢了。

0 投票
1 回答
817 浏览

c++ - 进程外 COM 单例

我正在处理一个单线程库(不是线程安全的),我想将它包装在一个 COM 进程外对象中以解决其线程不安全问题。我需要一种行为,其中每个新 COM 对象都在其自己的进程中实例化 - 某种形式的进程外单例。

自从我处理核心 COM 以来已经有一段时间了,所以我不确定如何处理这个问题,或者如果没有一些技巧,这是否可能完全可行。

0 投票
3 回答
1009 浏览

c# - 从同一台机器上的其他进程访问 outproc COM 服务器中的 c# 对象

我试图从另一个进程访问 C# 对象,而不是它们通过 COM 所在的进程。C# 对象向 COM 公开。

问题是,当我在这些对象上调用方法时,这些调用是在本地执行的,而不是在我希望这些调用的副作用发生的 outproc COM 服务器上。

更准确地说,这是我在尝试访问驻留在 outproc COM 服务器中的对象的过程中所做的:

然后我将结果转换为 C# 类的适当接口 ( IMyInterface),当我调用该接口的方法时,它们会像我期望的那样在 outproc COM 服务器上远程执行。

当我使用该接口检索其他 C# 对象(我使用IMyInterface.GetOtherObject()返回的方法IOtherObjectInterface)时,问题就开始了。

当我调用 on 时IOtherObjectInterface,它们在本地执行,而不是在 outproc COM 服务器上执行,因此它们的副作用会丢失(例如,如果我调用 SetValue 方法,则值不会到达 outproc 服务器并丢失)。

此外,当我在运行时查看调试器时,我看到远程调用工作的System._ComObject接口类型是远程调用不起作用的接口类型是实际类型(IOtherObjectInterface)。

我试图复制关于方式IMyInterface(远程调用工作的那个)暴露给COM IOtherObjectInterface(远程调用不起作用的那个)的所有内容(所有属性和其他实现的接口),但没有运气。

必须做什么才能使我进行的调用IOtherObjectInterface通过 RPC 在 outproc 服务器中执行,而不是在对任何人都没有用处的本地进程(发出调用的进程)中执行?

编辑

从那以后我发现,如果我IOtherObjectInterface使用与它工作的对象相同的方法(oType.InvokeMember(“GetOtherObjForMyClassMethod”,....)检索它不起作用的对象()不起作用(我对对象进行的调用仍未转发到 outproc COM 服务器)。

所以问题出在类本身,而不是用于检索对象的方法。

我强烈怀疑这个问题在某种程度上与序列化有关,即使两个类(工作和不工作)似乎都以相同的方式实现序列化......

编辑2:

我没有得到的部分是这个“COM远程处理”工作的类(当我在COM服务器外部检索对象时获得System._ComObject的类)具有“可序列化”属性。我认为具有此属性的类型的默认值是按值封送。

0 投票
2 回答
605 浏览

com - 将 COM 接口添加到现有应用程序 (EXE)

我打算将 COM 接口添加到现有应用程序(顺便说一下,它是使用 Win32 用 C++ 编写的)。我有一些使用COM 对象的经验,所以我知道接口等基本 COM 概念,但这是我第一次真正实现组件。

最终,我希望能够使用 COM 接口通过 VB 等脚本自动化我的应用程序。我知道有两个步骤:

  1. 我的应用程序必须充当进程外服务器(即我必须使用 MIDL 并为代理 DLL 和存根 DLL 生成代码)。
  2. 拥有服务器后,我可以通过实现 IDispatch 接口来添加自动化功能。

由于带有 MIDL 的服务器在一个 EXE 中以及其他的东西已经有点陡峭,我想在继续 IDispatch 之前先掌握所有这些。

我正在阅读 Dale Rogerson 的《Inside COM》一书,并完成了关于 EXE 中服务器的章节(下一章将介绍自动化)。

“EXE 中的服务器”一章提供了实现服务器和客户端的示例代码。但是需要手动启动服务器。这让我很困惑。显然,当客户端进程使用我的应用程序(= 服务器)时,不需要这个额外的手动步骤。是否没有自动启动服务器的机制?或者是否需要自动化来实现这一目标?目前,不得不手动启动我的服务器(一旦我有一个)的前景让我怀疑我是否朝着正确的方向前进。

希望对此有更多了解的人可以看到我缺少哪些信息并为我指明正确的方向。

0 投票
3 回答
5213 浏览

com - 进程外 COM 服务器的注册表项

我正在实现我的第一个进程外 COM 服务器(我的第一个 COM 服务器,就此而言)。我已按照步骤编写 IDL 文件、为代理/存根 DLL 生成代码、编译 DLL 并注册它。

当我检查注册表项时,我有

  • 一个名为 的键HKEY_CLASSES_ROOT/Interface/<GUID>,其值是 (say)IMyApp
  • 一个名为 的键HKEY_CLASSES_ROOT/Interface/<GUID>/ProxyStubClsid32,其值为<GUID>,即与键名中的值相同

我不明白第二个键的值如何与键<GUID>名中的值相同,因为我目前的理解是

  • HKEY_CLASSES_ROOT/Interface/<GUID>, GUID 是一个接口ID
  • 不是ProxyStubClsid32接口ID,而是ID,指实现上述接口的组件
  • HKEY_CLASSES_ROOT/CLSID/<GUID>/InprocServer32(其中 GUID 是上面的ID)的值指向代理 DLL

那么,HKEY_CLASSES_ROOT/Interface/<GUID>/ProxyStubClsid32如果一个是接口 ID,另一个是类 ID,那么值如何保持相同的值 GUID?

编辑:我仍然希望得到这个答案。简而言之:既然组件和接口是两个不同的东西,那么相同的 ID 怎么能同时用于两者呢?

0 投票
2 回答
3760 浏览

winapi - 没有代理/存根 DLL 的进程外 COM 服务器?

我正在学习如何实现进程外 COM 服务器,并遇到了这篇代码项目文章,构建本地 COM 服务器和客户端:一步一步的示例

我可以构建它,它运行良好,但是代理/存根 DLL 在哪里?我所能看到的只是在构建过程中生成代理/存根代码的 IDL 文件。但是 DLL 是如何构建的,它在哪里呢?

0 投票
1 回答
291 浏览

windows - COM 服务器:调用接口方法时,ESP 未跨函数调用保存

我正在在 EXE 文件中实现 COM 服务器。准确地说,我正在向现有应用程序添加一个 COM 接口。最终目标是自动化应用程序。

第一个组件和一个接口(到目前为止只有一个方法)基本就位。我可以在 DLL 中构建一个进程内服务器并成功获取接口指针并调用该方法。这是第一步,因为我只是在学习。以后我不需要 DLL;它只是作为我的组件和界面基本没问题的概念证明。

然后我在 EXE 中构建了一个进程外服务器。我已经到了可以CoCreateInstance()从客户端调用的地步,EXE 启动,注册它的工厂,工厂创建组件的实例。CoCreateInstance返回 S_OK 并且客户端接收到一个不为 NULL 的接口指针。

当我调用接口的方法时会出现问题。

  • 首先,方法中的断点没有被命中(是的,在另一个进程中,不过我也在调试服务器。服务器中的其他断点被命中ok)。
  • 第二,客户报告Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call. This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention.

我绝对知道 COM 接口中的方法必须使用__stdcall,并且我已经检查了好几次它没有丢失。此外,组件(C++)的实现源自 MIDL 生成的接口。所以接口的头文件有正确的调用约定,如果组件的头文件没有,编译器会抱怨覆盖不同。

由于断点甚至没有被命中,我的直觉是本地过程调用存在根本性错误,就像未正确设置 vtbl 一样。有没有人建议什么可能导致观察到的行为?关于如何调试代理/存根代码的任何提示?

编辑:

作为对 WhozCraig 的回应,这里是 IDL 文件:

0 投票
1 回答
1606 浏览

com - COM out of process server 启动多个实例

你如何强制本地 COM 服务器在一个普通帐户下运行(本地系统会很好)?RunAs 文档似乎仅适用于 DCOM,并且不能在本地工作。

我面临的问题是我的 CoCreateInstance 是从在不同桌面上运行的进程调用的,并且在这种情况下,SCM 想要为每个桌面启动一个新服务器,我只想要一个实例 - 按照设计!

0 投票
1 回答
298 浏览

com - 向进程外 COM 服务器添加新接口和组件后注册表项的更改

我正在浏览一个代码,它有一个具有 COM 服务器的 exe(在 ATL 中实现的 COM 类)。它有一个定义了所有接口的 .idl 文件。现在注册 COM 服务器后,我浏览了注册表项,我可以找到以下内容。每个接口都有一个带有其 IID 并具有 ProxyStubClsid32 的条目。有一个由我提到的 COM 服务器实现的接口,它在键字段中具有 IID = ProxyStubClsid32 的值,并且每个其他接口接口条目在其 ProxyStubClsid32 字段中具有相同的 IID 条目。为什么会这样??

接下来,当我尝试向 exe 添加一个新接口和实现该接口的新 COM 组件并进行注册时,我可以在注册表中观察到现在这个新接口的 IID 条目及其 ProxyStubClsid32 是相同的。并且新添加的 IID 现在存在于所有其他接口的 ProxyStubClsid32 中。

什么进入 ProxyStubClsid32,这是如何决定的?

即使在添加我的新接口之后,我也希望以前的 IID 出现在 ProxyStubClsid32 中。我怎样才能做到这一点 ??

explorer.exe 也会缓存此注册表项,因为我正在实现加载组件的 shell 扩展,我认为它指的是旧条目,因此在该 exe 上查询新接口不起作用。一旦我重新启动 explorer.exe 一切正常。

任何人都可以对此发表评论。

对此的回答似乎对我的问题有一些提示:Registry keys for out-of-process COM server

提前致谢。

0 投票
1 回答
448 浏览

vb.net - VB.NET exe 在外部脚本 AppActivates 时在激活事件炸弹上与进程外 COM 对话

我编写了一个 VB.NET Windows 窗体应用程序,该应用程序在每次激活事件触发时从进程外 COM 对象请求一个字符串。我的表单有两个选项卡,所以每次我的窗口获得焦点时,我都需要以编程方式切换到正确的选项卡。工作正常,直到...

偶然地,有人运行了一个 vbscript(是的,脚本,不是 exe),其中包含:

该脚本始终使我的应用程序崩溃。通常非常糟糕,以至于异常对话框通常无法自行绘制。我必须从任务管理器中杀死它。有时异常是可读的。(我还通过使用 Visual Studio 附加到正在运行的 exe 来确认异常)。它是:“System.Runtime.InteropServices.COMException (0x8001010D):无法进行传出调用,因为应用程序正在调度输入同步调用。”

真正让我心烦的是,我的应用程序使用互斥锁进行多实例检测,如果现有实例正在运行,我自己的代码(编译)使用 VB.NET 自己的 AppActivate 关键字,这不会使我的应用程序崩溃。它按预期激活正在运行的实例并退出冗余实例。

这个问题似乎完全是由 cscript/wscript 的 AppActivate 触发的。我写了一个 3-liner .vbs 来确认这一点。它是可重复的。

有没有办法在我编译的应用程序中捕获或避免这种情况?