Tag: idispatch

查找ActiveX组件的所有属性

我试着环顾四周,但由于COM / ActiveX的世界似乎非常令人困惑,因此无法用自己的答案说服自己。 基本上我想知道的是,鉴于GUID,有没有办法知道ActiveX控件公开的所有接口,属性和方法? 我在某个地方读到你只需询问是否有特定的财产。 但是在知道房产之前我该如何询问房产? 我猜IDispatch做了类似的事情,但我无法弄清楚如何使用它。 如果这是有效的,一个小片段,最好是在C#中,可以帮助我更好地理解。 谢谢

使用C#中的参数打包IDispatch调用(使用DISPPARAMS)

我正在使用Invoke对支持IDispatch的旧COM对象进行后期绑定。 这似乎是必要的,因为.NET的Type.GetMethod Type.InvokeMember似乎不适用于这些对象。 以下代码适用于从对象获取属性,调用者将属性名称作为字符串传递,以获取具有后期绑定的属性值。 该类在其构造函数中获取一个对象,并将this.idisp(和this.lcid)设置为该对象的接口指针(Critiques welcome!) public object InvokeGet(string propertyName) { int id = GetDispID(propertyName); IntPtr[] pArgErr = default(IntPtr[]); object pVarResult; System.Runtime.InteropServices.ComTypes.DISPPARAMS pDispParams = default(System.Runtime.InteropServices.ComTypes.DISPPARAMS); System.Runtime.InteropServices.ComTypes.EXCEPINFO pExcepInfo = default(System.Runtime.InteropServices.ComTypes.EXCEPINFO); Guid guid = new Guid(); int result = this.idisp.Invoke(id, ref guid, (uint)this.lcid, (ushort)System.Runtime.InteropServices.ComTypes.INVOKEKIND.INVOKE_PROPERTYGET, ref pDispParams, out pVarResult, ref pExcepInfo, pArgErr); if (result != 0) { throw […]

在c#中实现IDispatch

我正在编写一些测试代码来模拟非托管代码,调用后期绑定COM对象的c#实现。 我有一个声明为IDispatch类型的接口,如下所示。 [Guid(“2D570F11-4BD8-40e7-BF14-38772063AAF0”)] [InterfaceType(ComInterfaceType.InterfaceIsDual)] public interface TestInterface { int Test(); } [ClassInterface(ClassInterfaceType.AutoDual)] public class TestImpl : TestInterface { … } 当我使用下面的代码调用IDispatch的GetIDsOfNames函数时 .. //code provided by Hans Passant Object so = Activator.CreateInstance(Type.GetTypeFromProgID(“ProgID.Test”)); string[] rgsNames = new string[1]; int[] rgDispId = new int[1]; rgsNames[0] = “Test”; //the next line throws an exception IDispatch disp = (IDispatch)so; IDispatch定义为: […]

我可以选择C ++ DLL来调用C#DLL吗?

我有一个C ++ DLL需要在C#类库中调用一个函数(传递一个值,返回一个值)。 我唯一的选择是给C#DLL一个COM接口,并使用IDispatch从C ++调用它? 这是最好的方法吗?

C#.NET是否支持IDispatch后期绑定?

问题 我的问题是: C#nativly支持后期绑定IDispatch吗? 假装我正在尝试自动化Office,同时兼容客户安装的任何版本。 在.NET世界中,如果您使用Office 2000进行开发,那么从现在到结束,每个开发人员和每个客户都需要拥有Office 2000。 在.NET之前的世界中,我们使用COM与Office应用程序进行通信。 例如: 1)使用版本独立的ProgID “Excel.Application” 解析为: clsid = {00024500-0000-0000-C000-000000000046} 然后使用COM,我们要求将其中一个类实例化为一个对象: IUnknown unk; CoCreateInstance( clsid, null, CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER, IUnknown, out unk); 现在我们即将参加比赛 – 能够在我的应用程序中使用Excel。 当然,如果你真的想要使用该对象,你必须调用一些方法来调用方法。 我们可以获得各种接口声明,并将其翻译成我们的语言。 这项技术很好,因为我们得到了 早期绑定 代码洞察 编译类型语法检查 一些示例代码可能是: Application xl = (IExcelApplication)unk; ExcelWorkbook workbook = xl.Workbooks.Add(template, lcid); Worksheet worksheet = workbook.ActiveSheet; 但是使用接口有一个缺点:我们必须得到各种接口声明,转换成我们的语言。 我们坚持使用基于方法的调用,必须指定所有参数,例如: ExcelWorkbook workbook = […]