如何在C#中处理COM中定义的通知
C++写法:
STDMETHODCALLTYPE Advise(
/* [in] */ IUnknown *pUnkSink,
/* [out] */ DWORD *pdwCookie) = 0
C#写法:
我想用接口 IAdviseSink来实现同样的功能?
-------------------------------------------------------------------------------------
附今天才写的C#代码:
Guid CLSID_TCSUser = new Guid("4B39D001-6F7B-11d5-8CA0-00A0245AE65C");
Guid[] iids = { new Guid("4B39D002-6F7B-11d5-8CA0-00A0245AE65C"), new Guid("4B39D005-6F7B-11d5-8CA0-00A0245AE65C") };
MULTI_QI[] amqi = ole32Ex.CoCreateInstanceEx(CLSID_TCSUser,
ClsCtx.All, "127.0.0.1", iids, RpcAuthent.None, RpcAuthor.Default, "", RpcLevel.Connect, RpcImpers.Default, "", "", "",true);
if (amqi != null)
{
//获取COM对象tt
object tt = Marshal.GetObjectForIUnknown(amqi[0].pItf);
ITCSUser iICSUser = (ITCSUser)(tt);
IConnectionPointContainer cpc ;
//获取连接点对象
IntPtr ppv;
iid_cpc = new Guid("B196B284-BAB4-101A-B69C-00AA00341D07");
Marshal.QueryInterface(amqi[0].pItf, ref iid_cpc, out ppv);
cpc = (IConnectionPointContainer)(Marshal.GetObjectForIUnknown( ppv));
IConnectionPoint cpt;
//需要处理的DCOM中定义的事件
Guid TCSUserEvents = new Guid("4B39D004-6F7B-11d5-8CA0-00A0245AE65C");
cpc.FindConnectionPoint(ref TCSUserEvents, out cpt);
eventhandler = new EventHandle();
int cookie = 0;
//写道这里就进行不下去了。
cpt.Advise((object)eventhandler, out cookie);
最后一句在C++中是下面这样写的:
// Advise ITCSUserEvents
IConnectionPointContainer* pCPC = NULL;
hr = m_pUser-> QueryInterface(IID_IConnectionPointContainer, (void**)&pCPC);
_ASSERT(SUCCEEDED(hr));
hr = pCPC-> FindConnectionPoint(__uuidof(ITCSUserEvents), &m_pITCSUserCP);
_ASSERT(SUCCEEDED(hr));
pCPC-> Release();
m_iUserEventsCookie = 0;
hr = m_pITCSUserCP-> Advise(static_cast <ITCSUserEvents*> (this), &m_iUserEventsCookie );
相关文章
- RabbitMQ 优点和缺点- 消息可靠性:RabbitMQ 提供了持久化功能和消息确认机制,确保消息在各种情况下都能可靠地存储和处理。 灵活的路由:通过多种交换机类型和绑定规则,RabbitMQ 能够灵活地路由消息到指定的队列。 支持多种消息协议:实现了 AMQP 等(MQTT、STOMP)标准化、开放的消息队列协议,使其能够与多种语言编写的应用程序进行通信。 插件化扩展:RabbitMQ 提供了丰富的插件系统,可以通过插件扩展功能,如死信队列、压缩、追踪等。 高可用性:支持集群模式和镜像队列,确保服务的可用性 易用性和可管理性:提供了丰富的 API 和管理工具,以及多种客户端库和框架支持,易于集成和使用。 多语言支持:RabbitMQ 支持多种编程语言的客户端,包括 Java、Python、Ruby、C#、Node.js 等,方便开发人员集成到各种应用中。 高性能:在处理大量并发消息时表现出色。 广泛的社区支持:拥有庞大的开发者社区和丰富的文档资源。 劣势: 性能和吞吐量较低:相比于 Apache Kafka 等面向大数据流处理的消息队列系统,RabbitMQ 的吞吐量较低,不适合处理海量的实时数据流。RabbitMQ 的设计更注重消息的可靠性和灵活性,而非极高的吞吐性能。
- C#程序设计 设计一个Windows应用程序,在该程序中定义一个学生类和班级类,以处理每个学生的学号、姓名、语文、数学、和英语3门课的期末考试成绩
- Java 数据结构-特点: 代表一个队列,通常按照先进先出(FIFO)的顺序操作元素。 实现类: LinkedList, PriorityQueue, ArrayDeque。 堆(Heap) 堆(Heap)优先队列的基础,可以实现最大堆和最小堆。 PriorityQueue<Integer minHeap = new PriorityQueue<>; PriorityQueue<Integer maxHeap = new PriorityQueue<>(Collections.reverseOrder); 树(Trees) Java 提供了 TreeNode 类型,可以用于构建二叉树等数据结构。 class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; } } 图(Graphs) 图的表示通常需要自定义数据结构或使用图库,Java 没有内建的图类。 以上介绍的只是 Java 中一些常见的数据结构,实际上还有很多其他的数据结构和算法可以根据具体问题选择使用。 其他一些说明 以下这些类是传统遗留的,在 Java2 中引入了一种新的框架-集合框架(Collection),我们后面再讨论。 枚举(Enumeration) 枚举(Enumeration)接口虽然它本身不属于数据结构,但它在其他数据结构的范畴里应用很广。 枚举(The Enumeration)接口定义了一种从数据结构中取回连续元素的方式。 例如,枚举定义了一个叫nextElement 的方法,该方法用来得到一个包含多元素的数据结构的下一个元素。 关于枚举接口的更多信息,请参见枚举(Enumeration)。 位集合(BitSet) 位集合类实现了一组可以单独设置和清除的位或标志。 该类在处理一组布尔值的时候非常有用,你只需要给每个值赋值一"位",然后对位进行适当的设置或清除,就可以对布尔值进行操作了。 关于该类的更多信息,请参见位集合(BitSet)。 向量(Vector) 向量(Vector)类和传统数组非常相似,但是Vector的大小能根据需要动态的变化。 和数组一样,Vector对象的元素也能通过索引访问。 使用Vector类最主要的好处就是在创建对象的时候不必给对象指定大小,它的大小会根据需要动态的变化。 关于该类的更多信息,请参见向量(Vector) 栈(Stack) 栈(Stack)实现了一个后进先出(LIFO)的数据结构。 你可以把栈理解为对象的垂直分布的栈,当你添加一个新元素时,就将新元素放在其他元素的顶部。 当你从栈中取元素的时候,就从栈顶取一个元素。换句话说,最后进栈的元素最先被取出。 关于该类的更多信息,请参见栈(Stack)。 字典(Dictionary) 字典(Dictionary) 类是一个抽象类,它定义了键映射到值的数据结构。 当你想要通过特定的键而不是整数索引来访问数据的时候,这时候应该使用 Dictionary。 由于 Dictionary 类是抽象类,所以它只提供了键映射到值的数据结构,而没有提供特定的实现。 关于该类的更多信息,请参见字典( Dictionary)。 Dictionary 类在较新的 Java 版本中已经被弃用(deprecated),推荐使用 Map 接口及其实现类,如 HashMap、TreeMap 等,来代替 Dictionary。
- 如何在自定义样式的XAML和C#中创建圆形按钮?
- c#自定义控件中的事件处理
- C#小白中的小白求助:C#如何实现自定义的windows消息的事件处理。
- c#自定义控件中事件的处理
- (C#,com)外部dll方法中的指针中的指针该如何处理?
- 如何在C#中自定义自己的异常
- 如何在C#中定义C++中的结构体?