问题标签 [ole-automation]

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 回答
134 浏览

c# - C# COM 服务器从 GetIDsOfNames 返回 E_POINTER

我试图在 C# 中创建一个 COM 服务器来公开一个 OLE 自动化对象。我想手动实现 IDispatch 接口,因为我需要对成员进行一些动态查找。当我调用我的自定义GetIDsOfNames时,C# 方法运行,然后客户端错误E_POINTER。但让我们从头开始

经过数小时的阅读和大量的反复试验,我设法拼凑出一些我认为应该可行的东西。我有一个非常简单的界面

这可以返回另一个 COM 对象。第一个 COM 对象使用默认的 C# IDispatch 实现并且工作正常。这EchoObject是具有自定义 IDispatch 实现的那个,因为它不是 C# SDK 的一部分,让我们看看我是如何定义它的

我在 IEchoObject 接口的定义中使用了定义的 IDispatch 接口。

然后,此接口的实现必须实现 ICustomQueryInterface 以允许 IDispatch 强制转换发生。

我当然已经实现了 IDispatch 的其他方法,但我不相信它们对我遇到的问题很重要。请注意,GetIDsOfNames 打印到控制台。

我可以创建初始SimpleObject就好了。我也可以调用testNest它的方法并获取EchoObject实例。但是,在查找该testman方法的 ID 时EchoObject,客户端从 win32 获取E_POINTER(无效指针)而不是结果。

我已经使用 Excel、VBScript 和自定义 C++ COM 客户端对其进行了测试。都得到一个Invalid Pointer错误,C++ 客户端显示它来自GetIDsOfNames. 奇怪的是,C# 方法运行,它愉快地将行打印到控制台,返回,然后 C++ COM 客户端得到一个错误。

如果禁用我所有的自定义 IDispatch 而是使用默认的 C# 实现(调用 testint 方法而不是 testman)它可以正常工作。我怀疑我的编组可能在某个地方出错,但我已经盯着它看了好几个小时,我看不出问题所在。

编辑:我做了另一个测试。如果我将 GetIDsOfNames 的返回类型从 int 更改为 void 它可以工作。那里发生了什么事?根据MSDN,返回类型是 HRESULT(一个 32 位有符号整数),但是当我返回时,我得到一个错误。

0 投票
1 回答
425 浏览

excel - 在 VBA 中将 32 位 OleAut 调用转换为 64 位

我在将此 API 调用转换为来自 VBA 的 64 位可访问调用时遇到了一些问题。

API 声明

客户端代码


我尝试更改LongLongPtrin,DispCallFunc但每次更改 API 并运行宏时,Excel 都会冻结。

0 投票
1 回答
140 浏览

sql-server - 如何从 FILESTREAM 中检索文件?

我已经在我的机器上安装了 SQL Server Express,并启用并配置了 FILESTREAM 以从 SQL Server 存储和检索 pdf。我已经成功地将文件作为 BLOB 上传到我的表中,但我很难检索它们。我的方法是使用一个临时目录来创建文件,以便我可以打开它们。我有以下代码:

我已经配置了 ole 自动化

我的表 BusinessFiles 中有以下记录:

下一段代码显然将从文件流创建文件。

此代码运行,我收到命令已成功完成消息。但是我的文件夹 C:\Users\user\Desktop 中没有任何内容。有什么我想念的吗?谢谢;

我已经验证了文件路径是正确的,并且所有的设置都很好。

0 投票
0 回答
428 浏览

sql-server - sp_OACreate 执行上的“设置后无法更改线程模式”

我有以下存储过程:

此过程由另一个存储过程调用,而该存储过程又由报告 (SSRS) 调用。

非常随机(它比失败更有效),我收到以下错误: 设置后无法更改线程模式

我可以缩小问题范围并确认错误正在sp_OACreate执行中,但我无法在网上找到有关此错误的有用帮助。

0 投票
0 回答
230 浏览

sql-server - 从 SQL Server 获取 SOAP Web 服务 gzip 编码响应

我正在尝试使用 OLE 自动化存储过程从 SQL Server 调用 SOAP Web 服务,但我遇到了 Content-Encoding gzip 响应问题。

当使用 SOAP UI 测试方法时,它就像一个魅力。

Soap UI 显示类似 xml 的响应。Http 日志显示响应是 gzip 编码的

当我从 SQL Server 拨打电话时,我收到了这样的意外响应

来自 SQL Server 的 XML 响应

状态返回正常 200。

GetAllResponseHeaders不包含“内容编码:gzip”,Soap UI 包含!我包括了显示在 SOAP UI 上的所有请求标头。

这是我的代码(为了便于阅读,我省略了错误处理)

有什么帮助来完成这项工作吗?

0 投票
0 回答
38 浏览

excel - 为什么 Application.Run 是 Excel 库的成员,而 CallByName 通常适用于所有 VBA?

Excel.Application.Run两者VBA.Interaction.CallByName似乎都在做类似的事情;即使用字符串名称调用方法。据我了解,启用此功能是因为 VBA 是一种自动化语言,并IDispatch用于其许多对象和内部工作。

这与Excel当时(或确实PowerPoint.Application.Run)有什么关系?为什么调用标准模块和类模块的成员如此不同?

0 投票
1 回答
88 浏览

c# - 动态 COM 对象在 C# 中被要求提供未知接口 {B86A98CC-DCC0-3205-8777-7911A07DAAAF}

在 C# 中通过变量访问的基于IDispatch的已检测 COM 对象的QueryInterface()日志显示(除其他外)未知的 IID 。谷歌、GitHub 和 microsoft.com 出现了 zilch。有谁知道这个接口可能是什么,如果是的话,有人会用它做什么?dynamic{B86A98CC-DCC0-3205-8777-7911A07DAAAF}

FWIW,对象是这样实例化的:

然后接口查询日志立即被转储。在LINQPad中,我得到了这个:

C# 单元测试用例(VS2015,Framework 4.5.2)中的相同代码给出了类似的结果:

32 位和 64 位模式之间没有明显区别(当然,除了显示指针的宽度)。

该对象本身是从 Delphi 的TAutoObject派生的,它解释了它如何响应IProvideClassInfo查询。但是,对于其他不支持该接口的对象,无论是响应 0 还是响应 1,初始接口查询顺序基本相同IDispatch::GetTypeInfoCount()

但是,每个成员访问不仅会导致对未知接口的查询,IDispatch还会导致对未知接口的两次查询:

这是从一长串像这样重复的行中剪下来的;无法判断未知查询是在相应的 IDispatch 调用之前、将其括起来还是在其之后。

对 Charlieface 评论的精确回应:成员可以通过一长串 printf 语句访问,如下所示:

如果我在将每个成员访问的结果传递给其真实数据类型之前将其转换为真实数据类型,则未知接口的双重查询将完全消失Console.WriteLine()

未知查询似乎是 CLR 的事情,而不是 LINQPad 的事情,因为它也出现在 VS2015 中。

有谁知道,哪个接口{B86A98CC-DCC0-3205-8777-7911A07DAAAF}代表,以及可以用来做什么?

0 投票
0 回答
33 浏览

sql-server - 处理 248 条消息后来自 SQL Server 的 HTTP 请求关闭连接

我有一个存储过程,它引发与 Web 服务的连接并将结果加载回表中。http 请求的输入 BODY 位于 IP_BODY 列中。我使用另一个存储过程,它为表中的所有值循环 web 服务存储过程。

我注意到在处理了 248 条消息后,我的 SQL 服务器无法与 Web 服务建立 HTTP 连接。是否存在限制正在处理的消息数量的此类限制?

0 投票
1 回答
90 浏览

java - 无法通过 java 连接到 PowerDesigner

我需要自动化通过 java 连接到 PowerDesigner 以从存储库中提取模型的过程。我已经使用 OLE 自动化 JavaProxy 文档来配置该过程。

尝试运行时,我收到此错误:

线程“主”java.lang.NoSuchMethodError 中的异常:org.eclipse.swt.internal.ole.win32.COM.CoCreateInstance(Lorg/eclipse/swt/internal/ole/win32/GUID;IILorg/eclipse/swt/internal/ ole/win32/GUID;[I)I 在 com.sybase.stf.powerdesigner.PdCommon.Application.start(Application.java:57) 在 com.sybase.stf.powerdesigner.PdCommon.Application.(Application.java:31) ) 在 com.sybase.stf.powerdesigner.PdCommon.Application.getInstance(Application.java:42) 在 OOM.src.createOOM.CreateOOM.CreateAndDisplayOOM(CreateOOM.java:37) 在 OOM.src.createOOM.CreateOOM.main(创建OOM.java:28)

版本:

  • 电源设计器 - 16.5.5.0
  • 日食 4.18

支持罐子:

  • pdj2com_16.5.5.jar
  • org.eclipse.swt.win32.win32.x86_64_3.115.100.v20201202-1103.jar

上述问题已解决 谢谢!

现在,我在与以下问题再次连接时遇到了麻烦。

org.eclipse.swt.SWTException:无法执行操作。结果 = -2137456383 (com.sybase.stf.powerdesigner.com.COMException: COM 失败 [HRESULT: 0x80990101]) 在 org.eclipse.swt.ole.win32.OLE.error(OLE.java:345) 在 com.sybase .stf.powerdesigner.com.COMException.raiseOnFail(COMException.java:83) 在 com.sybase.stf.powerdesigner.com.IDispatchEx.raisingInvoke(IDispatchEx.java:231) 在 com.sybase.stf.powerdesigner.PdCommon.IApplication .CreateModel(IApplication.java:84) 在OOM.src.createOOM.CreateOOM.createOOM(CreateOOM.java:68) 在OOM.src.createOOM.CreateOOM.CreateAndDisplayOOM(CreateOOM.java:42) 在OOM.src.createOOM。 CreateOOM.main(CreateOOM.java:28) 原因:com.sybase.stf.powerdesigner.com.COMException: COM 失败 [HRESULT: 0x80990101] at com.sybase.stf.powerdesigner.com.COMException.raiseOnFail(COMException.java :88) ...

我无法在网上找到任何解决方案。请帮我解决这个问题。提前致谢。

0 投票
1 回答
43 浏览

c# - oleaut32.dll 在调试器中返回负的 hresult,但在不同的应用程序中甚至在我构建的应用程序中都是正确的结果

我的 Windows 窗体应用程序需要找到 SolidEdge.Application 的活动实例,为此我从https://github.com/SolidEdgeCommunity/SolidEdgeSpy复制了所有必需的代码。它使用自定义类 MarshalEx 和 NativeMethods,以及类似 CLSIDFromString 的函数。就像 SolidEdgeSpy 示例代码一样,我的代码会找到正确的 CLSID。下面的函数产生不同的结果,但我不知道为什么:

在调试器中它返回一个负值(hResult)-2147221021,但是在构建我的应用程序之后它工作正常并且我的应用程序能够“连接”到应用程序。它在过去有效,但由于某种原因不再有效。有谁知道发生了什么(即我做错了什么)?

Roman 的 RotView(感谢@Hans Passant)列出了我的应用程序,其中名称与 CLSID 匹配。RotView 工具