问题标签 [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.
windows - 是否值得在 QueryInterface() 实现中检查空指针?
向 IUnknown::QueryInterface() 传递了一个 void** 参数,该参数表示将检索到的接口放置在哪里的地址。
QueryInterface() 的实现应该检查这个指针是否为空(然后立即返回 E_POINTER)还是只写在那里?
我见过很多与 COM 相关的代码,几乎所有地方都没有进行检查。假设有人当然可以将空指针作为这个参数传递,但真的需要这样的检查吗?
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
何时检查指针类型参数的规则是什么?
.net - 如何获取 COM 对象的类型
我在 Visual Studio 中引用了一个 COM 库,因此它自动为我创建了相应的互操作程序集。我想GetType()
对这些 com 对象做一个,但它们总是返回System.__ComObject
. 不过,查询它们的接口是可行的:
但我真正想要的是返回 com 对象的实际类型:
有谁知道如何做我想做的事?
c# - 需要 ClassInterfaceType.None 吗?
没有从 MSDN得到以下信息:
ClassInterfaceType.None
表示没有为该类生成类接口。如果没有显式实现接口,则类只能通过
IDispatch
接口提供后期绑定访问。这是 的推荐设置ClassInterfaceAttribute
。UsingClassInterfaceType.None
是通过类显式实现的接口公开功能的唯一方法。[ComVisible(true)]
COM可见性是必须的吗?
.net - 列出 SSIS 平面文件连接中的列
我正在尝试从将数据库表导出到平面文件的 SSIS 包中生成列“开始/长度”规范文档。Columns
在从处理平面文件连接的 ConnectionManager 对象中获取属性时,我遇到了一些难题。我能够获得该Columns
属性,但我无法对它做任何事情,因为我无法确定将其转换为的任何类型。如果我将它转换为 DTSProperty,我会在对象上获得非常少的有用属性。如果我将属性设为object
,我只能确定它是System.__ComObject
.
如何将 Columns 属性检索为一个有用的对象,希望是一个可以迭代的集合?
示例代码:
windows - 是否可以禁止将我的进程内组件放入 COM+?
我有一个 ATL C++ in-proc COM 组件。该组件不供外部使用 - 我只需要在我们的应用程序中使用它。
有时,用户将它放入 COM+ 中,这会导致各种奇怪的错误——“访问被拒绝”等,我不想听到这些。最好的方法是做一些禁止将组件放入 COM+ 的事情,以便它只能用作进程内服务器。有没有办法做到这一点?
.net - 无法从 COM 互操作中使用 AppDomain
我有一段 .NET 代码,由于各种原因(可靠性、部署)必须在单独的 AppDomain 中运行。我创建了一个从 MBR 派生的代理对象,它将调用委托给真实的东西,因此它不会加载到当前的 AppDomain 中。我通过通常的 CreateInstanceAndUnwrap 创建代理。
当我从 .NET 客户端使用它时,这很有效,但是当从 COM 客户端加载时,转换失败。我无法从透明代理进行投射。我验证了所需的类型是在所需的 AppDomain 上创建的,并且 Unwrap 成功,只是强制转换失败。有趣的是,当两个 AppDomain 具有相同的基目录时,它确实有效,这表明程序集绑定失败。但是 Fusion 日志查看器没有提到任何问题。
.net - 从托管进程中切断 .NET COM 互操作程序集
当 ActiveXObject 托管在 Windows 桌面/边栏小工具中时,该 ActiveXObject 会被缓存,并且它的 DLL 文件被锁定(意味着它不能移动、删除或重命名)。问题是这样的;当小工具随后关闭时,DLL 仍被 Windows 边栏锁定,无法删除。这会导致一个重大问题,即无法在先前版本的小工具之上安装新版本的小工具,它在删除它的过程中失败,没有任何错误消息。
这对用户不是很友好,所以我正在寻找一种在小工具的卸载事件期间以某种方式“切断”与 ActiveX 控件的联系的方法。我希望有人能告诉我这是否可行,如果可以,请给我一些关于如何实现它的想法。
仅供参考,Windows 边栏小工具实际上只是 Internet Explorer 服务器窗口,因此假设 IE 表现出相同的行为可能是安全的。
编辑: Unlocker似乎做了很多我需要做的事情,那么我怎样才能在 .NET 中以编程方式实现同样的事情呢?
.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# 中定义接口。
.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。
顺便提一句。该程序集已签名,并且没有任何其他自定义构建程序集作为依赖项(只是系统内容)。
有没有人经历过类似的事情?