问题标签 [running-object-table]

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 投票
3 回答
5978 浏览

c# - 访问运行对象表的问题

在我的程序中,我使用运行对象表 (ROT) 来确保我的程序只有一个实例正在运行。由于我从不幸离开公司的开发人员那里“继承”了该代码,因此我是解决问题的可怜人。代码运行良好,但我们有 3 个客户(共 39,000 名)将获得AccessDeniedException. 每个客户都以用户模式运行软件。

有什么建议可能是错的吗?

编辑:这是在 ROT 中注册对象的请求代码:

编辑2:

首先对所有调查人员来说是一个很大的借口,我们没有得到 AccessDeniedException 它是一个 System.UnauthorizedAccessException (HRESULT: 0x80070005 (E_ACCESSDENIED))。

其次,“调查员”Ken Brittain 的问题的答案:-SharePoint不在其中-我愿意向 ROT 请求正确的对象-另一个提示可能是 3 个问题中的 1 个(除了 39,000 个正常工作)正在运行WTS(Windows 终端服务器)上的应用程序

编辑3:

这是其中一个异常的堆栈跟踪:(我已经翻译了堆栈跟踪,因为它在德国机器上)

堆栈跟踪的其余部分在我们的代码中。在这种情况下,可标记的是在我们的 RunningObjectTableClientManager 的构造函数中引发了异常。这是该构造函数的代码:

0 投票
1 回答
956 浏览

c# - 如何以编程方式在运行对象表中注册 Word 实例?

这是一个可能的重复。找不到确切的,我记得很久以前经历过一个。

该工具需要能够检测是否从计算机的任何位置打开了任何 MS Word 文件。所以我们使用一个进程观察器,像这样:

现在不管是什么,这里是棘手的部分:我需要获取当前打开的 WINWORD 进程的单词自动化实例。所以我Marshal.GetActiveObject用来获取正在运行的实例。但是,只有当 word app 失去焦点时(如 msdn 所述),打开的 Word 应用程序才会在运行对象表中注册。如果我有流程,如何在 ROT 中手动注册 word application?下面的一些伪代码

注意:我可以通过一些繁重的 API 调用以编程方式将焦点从打开的单词窗口中移开,然后将其带回来,但这完全是一团糟。

有什么正规的注册方式吗?

0 投票
0 回答
1669 浏览

c# - 使用 C# 在 ROT 中创建对 COM 对象的强引用

我需要绑定到一个正在运行的 COM 实例(可能有很多我正在寻找的实例,所以我需要通过检查运行对象表来确定哪一个是正确的)使用 CoClassCreate 或new带有类的运算符是我没有选择。

我的代码几乎可以工作,只是它不是异常安全的。

如果像下面的代码中那样抛出异常,有没有办法避免在Revoke幕后发生的自动?一旦应用程序结束,COM 对象就会从 ROT 中删除,而注册它的应用程序仍在运行。我很确定 Release() 会被自动调用,因为它是最后一个引用 COM 的对象,所以 ROT 条目消失了。

我想以原子和异常安全的方式获得对 ROT 中对象的强引用。

我尝试将绰号与该方法结合使用的所有尝试BindToObject均未成功。.NET 4.0 中的实现有问题吗?第一次调用似乎有效,但后续调用都因 Argument 或 invalidCast 异常而失败,即使在使用 IUnknown 的 Guid 时也是如此。据我所知,这应该总是成功还是我忽略了什么?

这是迄今为止我能产生的最好的工作代码。我只是想念异常安全。该程序旨在自行运行并且是可中断的(可以随时抛出异常以中断胎面)。如果我不能彻底解决,留下这件未完成的事情肯定会给我带来一些麻烦。

附加说明:这可能发生在 OutProc 服务器仅将活动对象注册为弱引用时。我对此没有影响,我不是服务器端的作者......我需要绑定到正在运行的对象,而不会有对象可以从运行对象表中撤销的风险。

0 投票
1 回答
177 浏览

mfc - 如何在ROT中放置对象

我浏览了这个链接http://blogs.artinsoft.net/Mrojas/archive/2011/09/30/Running-Object-Table-and-NET.aspx 我想知道,我们能否将 MFC 对象放在 RunningObjectTable 中. 如果是,我们该怎么做。

请在这里帮助我。

0 投票
0 回答
111 浏览

python - 使用 Iron Python 访问 OLE 注册数据库

我正在尝试使用 comtypes 模块提取活动对象:

但它抛出一个错误,说它至少需要一个参数。我认为它是 OLE 注册数据库密钥,但我不确定如何提取它。有没有办法查找当前注册的应用程序并查询它们的键/名称,以便我可以获得活动对象?

谢谢!

0 投票
1 回答
1761 浏览

c# - 将项目添加到 ROT(运行对象表)

我知道如何使用 *****.GetActiveObject(ProgId),但是问题是我使用此代码行的几个应用程序没有添加到 ROT,即使它们已经打开,我也会收到 HRESULT 错误. 但是,如果我单击另一个应用程序然后返回到原始应用程序,代码行就可以正常工作。

我之所以如此含糊不清,是因为这是我在 10 多个应用程序中遇到的问题。

我不发布代码的原因是因为我不相信这个问题是基于代码的,而是我认为这个问题是由于我缺乏理解造成的。

我遇到此问题的最重要的程序之一是“Microsoft Excel”。我想要做的就是能够在特定单元格启动用户。

我已经到处寻找关于如何在 Excel 中使用 *****.GetActiveObject(ProgId) 的体面解释,但是,似乎没有任何合理的答案。该程序可以用 c# 编写,但是,如果它在 Visual Basic 中更简单,那不是问题

0 投票
1 回答
5035 浏览

com - 我在哪里可以获得像 IROTVIEW 这样的运行对象表查看器?

曾几何时,Windows SDK(或者它是 Visual Studio)有一个名为 IROTVIEW 的工具,它枚举了正在运行的对象表 (ROT)

我现在在哪里可以得到这个工具?

0 投票
0 回答
255 浏览

c# - 将通用对象转换为 com 类的类型失败

我有一个注册到 ROT 的 COM 类,通过另一个应用程序我从 ROT 获取我的 com 类的实例并将其转换为它的类型,给出以下错误。

无法将类型为“System.__ComObject”的 COM 对象转换为接口类型“ROTViewer.IHandleVIParentInfo”。此操作失败,因为 IID 为“{C4B3F18E-FDF1-3F0C-A6DB-F03B302CAE9F}”的接口的 COM 组件上的 QueryInterface 调用因以下错误而失败:不支持此类接口(HRESULT 异常:0x80004002 (E_NOINTERFACE)) .

以下是我的 COM 类实现

以下是我将对象类型转换为我的 com 类类型的方法

在“viParenting = (IHandleVIParentInfo)rotEnumerator.Value;”行中出现错误

0 投票
1 回答
1288 浏览

c# - 有人有运行对象表查看器的 C# 源吗?

在这里回答我自己的问题。

运行对象表 (ROT) 是 Microsoft 组件对象模型 (COM) 人工制品,Excel 和 Word 文档可以在其中注册自己,以使机器上的任何其他应用程序都可以访问它们。因此,ROT 促进了对象嵌入和链接 (OLE) 以及进程间通信 (IPC)。

曾经有一个名为 ROTViewer.exe 的程序可以追溯到 Visual Basic 6 时代,它允许开发人员查看 ROT 的内容。令人惊讶的是,没有人在 StackOverflow (SO) 上发布与 ROTViewer 等效的 C# 列表。

有人有资源吗?

0 投票
1 回答
396 浏览

winapi - Running Object Table是如何实现弱引用的?

当您在运行对象表中注册带有零标志的 COM 对象(请求弱引用)时,ROT 将引用计数增加 1。从 ROT 获取对象的行为将引用计数再增加一。一旦该对象被释放,该对象将保持活动状态,并且引用计数至少为 1。它在 ROT 中的注册也不会在检索时被神奇地撤销。

怎么这么弱?这与强注册有何不同?

强注册遵循相同的模式——注册和检索都将引用计数增加一。

ROT返回给公寓内客户端的接口指针不是代理;ROT 无法知道我已经释放了检索到的接口指针。