问题标签 [com-interop]

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

windows - 是否值得在 QueryInterface() 实现中检查空指针?

向 IUnknown::QueryInterface() 传递了一个 void** 参数,该参数表示将检索到的接口放置在哪里的地址。

QueryInterface() 的实现应该检查这个指针是否为空(然后立即返回 E_POINTER)还是只写在那里?

我见过很多与 COM 相关的代码,几乎所有地方都没有进行检查。假设有人当然可以将空指针作为这个参数传递,但真的需要这样的检查吗?

0 投票
1 回答
7642 浏览

windows - 什么时候返回 E_POINTER,什么时候返回 E_INVALIDARG?

COM 接口方法可以返回各种HRESULT值来表示传递的无效参数值。我什么时候回来E_POINTER,什么时候回来E_INVALIDARG

据我了解,如果方法在封装集合中接收索引并且超出范围,即E_INVALIDARG. 如果一个方法接收到一个Interface**指针,该指针用于存储指向新创建的对象的指针,即E_POINTER.

但是,如果它接收到一个WCHAR*带有文件名作为“in”参数的缓冲区并且它WCHAR*为空怎么办?这是E_POINTER还是E_INVALIDARG

或者一个方法接收一个指向某个结构的指针,并期望通过该指针填充该结构,并且该指针为空 - 这是E_POINTER还是E_INVALIDARG

何时返回E_POINTER以及E_INVALIDARG何时检查指针类型参数的规则是什么?

0 投票
4 回答
19680 浏览

.net - 如何获取 COM 对象的类型

我在 Visual Studio 中引用了一个 COM 库,因此它自动为我创建了相应的互操作程序集。我想GetType()对这些 com 对象做一个,但它们总是返回System.__ComObject. 不过,查询它们的接口是可行的:

但我真正想要的是返回 com 对象的实际类型:

有谁知道如何做我想做的事?

0 投票
1 回答
3872 浏览

c# - 需要 ClassInterfaceType.None 吗?

  1. 没有从 MSDN得到以下信息:

    ClassInterfaceType.None

    表示没有为该类生成类接口。如果没有显式实现接口,则类只能通过IDispatch 接口提供后期绑定访问。这是 的推荐设置ClassInterfaceAttribute。UsingClassInterfaceType.None是通过类显式实现的接口公开功能的唯一方法。

  2. [ComVisible(true)]COM可见性是必须的吗?

0 投票
1 回答
1885 浏览

.net - 列出 SSIS 平面文件连接中的列

我正在尝试从将数据库表导出到平面文件的 SSIS 包中生成列“开始/长度”规范文档。Columns在从处理平面文件连接的 ConnectionManager 对象中获取属性时,我遇到了一些难题。我能够获得该Columns属性,但我无法对它做任何事情,因为我无法确定将其转换为的任何类型。如果我将它转换为 DTSProperty,我会在对象上获得非常少的有用属性。如果我将属性设为object,我只能确定它是System.__ComObject.

如何将 Columns 属性检索为一个有用的对象,希望是一个可以迭代的集合?

示例代码:

0 投票
2 回答
103 浏览

windows - 是否可以禁止将我的进程内组件放入 COM+?

我有一个 ATL C++ in-proc COM 组件。该组件不供外部使用 - 我只需要在我们的应用程序中使用它。

有时,用户将它放入 COM+ 中,这会导致各种奇怪的错误——“访问被拒绝”等,我不想听到这些。最好的方法是做一些禁止将组件放入 COM+ 的事情,以便它只能用作进程内服务器。有没有办法做到这一点?

0 投票
1 回答
503 浏览

.net - 无法从 COM 互操作中使用 AppDomain

我有一段 .NET 代码,由于各种原因(可靠性、部署)必须在单独的 AppDomain 中运行。我创建了一个从 MBR 派生的代理对象,它将调用委托给真实的东西,因此它不会加载到当前的 AppDomain 中。我通过通常的 CreateInstanceAndUnwrap 创建代理。

当我从 .NET 客户端使用它时,这很有效,但是当从 COM 客户端加载时,转换失败。我无法从透明代理进行投射。我验证了所需的类型是在所需的 AppDomain 上创建的,并且 Unwrap 成功,只是强制转换失败。有趣的是,当两个 AppDomain 具有相同的基目录时,它确实有效,这表明程序集绑定失败。但是 Fusion 日志查看器没有提到任何问题。

这里这里有两个有点相似的问题,但它们没有提供答案。任何想法出了什么问题,或者我该如何进一步调试它?

0 投票
2 回答
661 浏览

.net - 从托管进程中切断 .NET COM 互操作程序集

当 ActiveXObject 托管在 Windows 桌面/边栏小工具中时,该 ActiveXObject 会被缓存,并且它的 DLL 文件被锁定(意味着它不能移动、删除或重命名)。问题是这样的;当小工具随后关闭时,DLL 仍被 Windows 边栏锁定,无法删除。这会导致一个重大问题,即无法在先前版本的小工具之上安装新版本的小工具,它在删除它的过程中失败,没有任何错误消息。

这对用户不是很友好,所以我正在寻找一种在小工具的卸载事件期间以某种方式“切断”与 ActiveX 控件的联系的方法。我希望有人能告诉我这是否可行,如果可以,请给我一些关于如何实现它的想法。

仅供参考,Windows 边栏小工具实际上只是 Internet Explorer 服务器窗口,因此假设 IE 表现出相同的行为可能是安全的。

编辑: Unlocker似乎做了很多我需要做的事情,那么我怎样才能在 .NET 中以编程方式实现同​​样的事情呢?

0 投票
1 回答
1722 浏览

.net - 如何为 COM 使用创建 propput IDL 方法 .NET 接口

我在 Excel/VBA 中使用 .NET/ComVisible 程序集时遇到问题。我在 .NET 中将几个参数定义为“对象”,因此它们将在 VBA 中转换为 Variant,因为 VBA 中的可选参数需要使用 Variant 类型。

问题是当我尝试在 Excel/VBA 中使用该对象时,我收到“运行时错误'424':需要对象”。我认为我在 C# 界面中缺少属性,该属性将添加一个“ propput ”方法而不是“ propputref ”方法,该方法将允许变量中的值,但我在互联网上没有找到任何答案,只是类似的问题。我看到了 System.Reflection.BindingFlags,但这似乎只适用于编译时和运行时代码,不适用于接口定义。

底层数据类型是双精度的,我需要它为空或通过 COM/VBA 的双精度。我对字符串参数没有问题,只是变体/双精度。

这是C#接口:

这是 C# 对象:

这是VBA的用法:

这是来自 OleView 的类型库 IDL:

似乎唯一的解决方案是手动生成 IDL,然后将其导入 .NET,就像在这个线程中使用 VB.NET 和 VB6一样。那是唯一的解决方案吗?这篇关于The Essentials for Using COM in Managed Code的文章也非常好,但没有涵盖在 .NET/C# 中定义接口。

0 投票
3 回答
5234 浏览

.net - 无法在经典 ASP/VBScript 页面中实例化 .Net COM 对象(错误 ASP 0177)

我使用 .Net 3.5 在 C# 中编写了一个启用 COM 互操作的类库。该对象旨在为经典的 ASP 页面提供一些实用功能。我编写了一个 test.asp 页面,它实例化了所需的对象并调用了它的方法。在我的机器上工作正常。

在另一台机器(Windows Server 2003 - 标准版)上,即使程序集已正确注册 regasm,它也无法工作。我检查了 regedit 并且 afaik 看起来没问题。

我得到的错误是“ASP 0177”(错误代码)、“8000ffff;Server.CreateObject-Fehler”(错误描述),它转换为 Server.CreateObject-Error。

顺便提一句。该程序集已签名,并且没有任何其他自定义构建程序集作为依赖项(只是系统内容)。

有没有人经历过类似的事情?