Tag: com

DispID在接口之间必须是唯一的吗?

我使用COM与旧的VB6应用程序。 我更改了我的代码以在接口中使用DispID,因为它似乎比使用[ClassInterface(ClassInterfaceType.AutoDual)]更好。 但它是否允许从DispID(1)计数的每个接口开始,即使一个类使用两个接口? 这种方式稳定吗? 或者我错过了什么? [ComVisible(true)] [Guid(“9E1125A6-…”)] public interface IMyInterface1 { [DispId(1)] string Name1 { get; } } [ComVisible(true)] [Guid(“123425A6-…”)] public interface IMyInterface2 { [DispId(1)] string Name2 { get; } } [ComVisible(true)] [ClassInterface(ClassInterfaceType.None)] class MyClass : IMyInterface1, IMyInterface2 { public string Name1 { get { return “Name1”; } } public string Name2 { get { […]

为什么这个C#COM类可以从VBScript而不是JScript中使用?

考虑下面给出的C#中与自动化兼容的COM库。 它遵循一个共同的COM模式,即具有可见的工厂coclass FooFactory实现ICreateFoos,它创建一个IFoo类型的对象。 FooFactory是类型库中唯一的 coclass。 (工厂模式对COM特别有用,因为它不允许参数化构造函数)。 在下面的代码中,我发现我无法从jscript访问返回的IFoo接口, 除非我使FooImpl类变为ComVisible (通过取消注释注释行;这会导致它在类型库中显示为coclass)。 从VBscript访问它没有这样的问题 。 也就是说,我可以运行这个VBScript: set ff = CreateObject(“jstest.FooFactory”) set foo = ff.CreateFoo(0) foo.Foo 但这个function相同的 JScript失败,错误“C:\ temp \ jstest \ jstest.js(4,1)Microsoft JScript运行时错误:’foo’为null或不是对象”: var ff = new ActiveXObject(“jstest.FooFactory”); var foo = ff.CreateFoo(0) //WScript.Stdout.WriteLine(null==foo) foo.Foo(); 如果我取消注释该行,我可以看到null == foo为false。 为什么会这样? 这是一个错误吗? 请注意,我认为这是一个问题,是JScript和C#/ .net特定实现(可能是IDispatch)的组合,因为我有其他类似的COM服务器 – 用C ++实现 – 不会从JScript中出现这个问题。 如果我在下面的代码中取消注释注释行,使得FooImpl作为coclass可见,那么问题就会消失 – 但我特别不希望这样做,因为我不想暴露实现细节。 […]

从Javascript调用C#BHO方法(仍然无法正常工作)

我完全按照这个答案阅读并重读了所有谷歌的调查结果。 不幸的是,大部分都只是参考答案的复制和粘贴(包括“停止撞墙而去庆祝!”)的句子,这对我不起作用…所以经过半天的工作后,我真的要开始敲我的脑袋了…… 我的简单错误:javascript windows.myExtension对象是’undefined’所以在它上面调用Foo会引发错误。 请参阅下面的完整资源。 看起来属性集在javascript方面是不可见的。 更多信息: 我使用Debugger.Launch()语句来方便地调试我的扩展,并且命中断点,并且所有BHO扩展函数都被正确调用并运行。 注释的替代(使用property.SetProperty)也不起作用,具有相同的错误: 的console.log(window.myExtension); //写’undefined’,为什么? 使用VS 2010,Windows 7 x64,IE 9 请让我帮忙运行这个… Thx提前 简单的测试页面: console.log(window.myExtension); // Writes undefined why? It should be an object… var result = window.myExtension.Foo(“bar”); // Obviously throws and error if window.myExtension is undefined BrowserHelperObject.cs using System; using System.Diagnostics; using System.Runtime.InteropServices; using System.Runtime.InteropServices.Expando; using Microsoft.Win32; using SHDocVw; […]

有没有办法注册免费激活EXE COM组件

有没有办法激活COM组件,这是一个EXE COM应用程序,它还依赖于COM dll? 我想从.NET应用程序(VS 2005 / VS 2008)激活此COM组件。 调用的路径是C#application – >调用out-of-proc exe(这是通过COM)然后这个out-of-proc调用几个COM dll

COM服务器如何使用不同的ComInterfaceType枚举封送C#类库中的可空?

我听说Nullable是一个C#generics类,它不能与COM一起使用 – 就像任何其他generics类一样。 好吧,在我的C#类库中,我有: [InterfaceType(ComInterfaceType.InterfaceIsDual), Guid(“2FCEF713-CD2E-4ACB-A9CE-E57E7F51E72E”)] public interface ICOMClass { int? GetNullable(); } [ClassInterface(ClassInterfaceType.None)] [Guid(“57BBEC44-C6E6-4E14-989A-B6DB7CF6FBEB”)] public class COMClass : ICOMClass { public int? GetNullable() { int? hello = null; return hello; } } 令人惊讶的是 ,编译并且我能够在VBE中附加对我的COMClass库的引用。 我知道: VBA 不在对象浏览器的成员列表中列出.GetNullable() (即使显示隐藏的成员已勾选) VBA没有在智能下拉列表中列出.GetNullable() 但为什么: Dim c as new COMClass c.GetNullable 不抛出相当期望的Object doesn’t support this property or method ? […]

VBA中自定义COM类中的IntelliSense

有没有办法在VBA中自己构建的COM类中获取IntelliSense? 例如,在下面的示例中,我希望每当我按下点(或ctrl +空格以获得快捷方式)时都会显示“Number”: 我想,如果以某种方式解决了这个问题,我还会得到一些关于对象公共函数的信息: 那么,有什么建议? 建议1 :

我怎么知道`ThisWorkbook`是一本’工作簿’?

我正在使用VBIDE API,并且不能假设主机应用程序是Excel或任何Office应用程序。 所以我所知道的是我正在看一个VBComponent ,它的Type是vbext_ct_document 。 在VBE的即时窗格中,我可以获得此输出: ?TypeName(Application.VBE.ActiveVBProject.VBComponents(“Sheet1”)) VBComponent ?TypeName(Sheet1) Worksheet 但是Sheet1对象只存在于运行时环境中,所以如果我是C#加载项,我甚至都看不到它。 唯一可以接近我需要的东西是通过组件的Parent和Next属性: ?TypeName(Application.VBE.ActiveVBProject.VBComponents(“Sheet1”).Properties(“Parent”).Object) Workbook ?TypeName(Application.VBE.ActiveVBProject.VBComponents(“Sheet1”).Properties(“Next”).Object) Worksheet 这让我得到了我追求的类型名称……但错误的组件! 对于ThisWorkbook ,它是顶级文档对象,我将Application对象作为Parent : ?TypeName(Application.VBE.ActiveVBProject.VBComponents(“ThisWorkbook”).Properties(“Parent”).Object) Application 这种方法可能很有用,但前提是硬编码特定于主机的逻辑 ,该逻辑知道当主机应用程序是Excel时,哪个组件具有“应用程序”类型的“父”属性是一个Workbook实例…并且不能保证其他主机中的其他文档模块甚至会拥有“父”属性,所以我非常难过。 我几乎可以接受任何东西 – 从p / invoke调用和低级COM“reflection”魔术( ITypeInfo类型的魔法)到…到……我不知道 – 带有时髦指针的unsafe代码要求// here be dragons评论 – 欢迎任何可能最终成为工作解决方案的潜在客户。 AFAIK VBE加载项与主机位于同一进程中,因此某处有一个指向ThisWorkbook和Sheet1的指针以及VBA项目中的其他任何文档类型的VBComponent 。 ?ObjPtr(ThisWorkbook) 161150920 我想我只需要以某种方式抓住指针,我将成为我需要的地方。

.NET互操作来回复制数组数据,还是固定数组?

我有这个COM方法签名,在C#中声明: void Next(ref int pcch, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 0)] char[] pchText); 我称之为: int cch = 100; var buff = new char[cch]; com.Next(ref cch, buff); .NET互操作层是否首先将整个数组复制到临时的非托管内存缓冲区,然后将其复制回来? 或者数组是否自动固定并通过引用传递? 为了尝试,我在COM对象(C ++)中做到了这一点: *pcch = 1; pchText[0] = L’A’; pchText[1] = L’\x38F’; // ‘Ώ’ 当我在返回时检查C#中的buff[1]时,我确实得到’Ώ’ 。 但我不认为这是一个强有力的证据,certificatearrays固定,而不是来回复制。

传递VBA类的实时实例时,C#ITypeInfo.GetContainingTypeLib失败

所以我已经尝试在VBA类实例上调用ITypeInfo,虽然看起来很有希望但我想看看我是否可以获得对其包含项目的引用,类似于类型库。 我认为ITypeInfo.GetContainingTypeLib可能有用,但它抛出一个exception,表明VBA不会合作。 任何人都对VBA如何以不同于标准COM规范的方式做出任何想法? C#类库代码在这里。 注册COM interop并在AssemblyInfo.cs中设置COMVisible(true)以使其可从VBA访问。 下面给出的VBA客户端代码。 using System; using System.Runtime.InteropServices; using System.Runtime.InteropServices.ComTypes; namespace TypeLibraryInspector { [ComImport()] [Guid(“00020400-0000-0000-C000-000000000046”)] [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] public interface IDispatch { [PreserveSig] int GetTypeInfoCount(out int Count); [PreserveSig] int GetTypeInfo ( [MarshalAs(UnmanagedType.U4)] int iTInfo, [MarshalAs(UnmanagedType.U4)] int lcid, out System.Runtime.InteropServices.ComTypes.ITypeInfo typeInfo ); //void GetTypeInfo(int typeInfoIndex, int lcid, [MarshalAs(UnmanagedType.CustomMarshaler, // MarshalTypeRef = typeof(System.Runtime.InteropServices.CustomMarshalers.TypeToTypeInfoMarshaler))] out Type typeInfo); […]

如何提供正确定位.NET Dll作为COM提供程序的私有并排清单?

我正在研究一个免费的私有注册WinSxS的配置,它提供了简单的程序集清单文件,在部署和运行时将Delphi可执行文件(COM客户端)和.NET(C#)COM可见DLL组合在一起。 我已经研究了MSDN “与非托管代码互操作”中提供的文档,特别是关于“ COM Callable Wrapper ”和“ 如何:为无注册激活配置基于.NET Framework的COM组件 ”的部分。 经过一个多星期的研究,并且(重新)指导文档不足的周期,我决定在这里提出我的第一个问题。 计划的部署结构如下所示: ./install-root ├───ProgramSuite1 │ ├───bin │ │ DelphiNativeCOMClient1.exe │ │ DelphiNativeCOMClient1.exe.config │ │ DelphiNativeCOMClient2.exe │ │ DelphiNativeCOMClient2.exe.config │ | … │ │ │ └───data │ … ├───ProgramSuite2 │ ├───bin │ │ DelphiNativeCOMClient3.exe │ │ DelphiNativeCOMClient3.exe.config │ │ DelphiNativeCOMClient4.exe │ │ DelphiNativeCOMClient4.exe.config │ | … […]