C# 实现IUnknown接口(2)

IUnKnown接口定义

[ComImport(), InterfaceType(ComInterfaceType.InterfaceIsIUnknown),Guid("00000000-0000-0000-C000-000000000046")]public interface IUnknown{[PreserveSig]int QueryInterface(ref Guid riid, out IntPtr ppvObject);[PreserveSig]uint AddRef();[PreserveSig]uint Release();}
Class1定义
class Class1 : IUnknown{public int QueryInterface(ref Guid riid, out IntPtr ppvObject){throw new Exception("The method or operation is not implemented.");}public uint AddRef(){throw new Exception("The method or operation is not implemented.");}public uint Release({throw new Exception("The method or operation is not implemented.");}}



或者

class Class1 : IUnknown{int IUnknown.QueryInterface(ref Guid riid, out IntPtr ppvObject){throw new Exception("The method or operation is not implemented.");}uint IUnknown.AddRef(){throw new Exception("The method or operation is not implemented.");}uint IUnknown.Release(){throw new Exception("The method or operation is not implemented.");}}
主程序
IUnknown Class1 = new Class1();在创建的时候,并不会调用AddRef()

.Net下不是这么玩的。
.Net已经有了垃圾回收机制,不需要使用COM的引用计数。
当一个类被.Net的发表为COM对象,.Net会自动帮你实现IUnknown,并帮你管理引用计数。

 
  1. [assembly: ComVisible(true)] //<--

  2. [InterfaceType( ComInterfaceType.InterfaceIsIUnknown)] //不写也可以,会默认为dual

  3. interface A

  4. {

  5. //作为COM发表后,A已经继承IUnknown了。

  6. }

woshi_ziyu 2011-12-14IUnknown::AddRef method

Increments the reference count for an interface on an object. This method should be called for every new copy of a pointer to an interface on an object.

Syntax
ULONG AddRef();

Parameters
This method has no parameters.
Return value

The method returns the new reference count. This value is intended to be used only for test purposes.

Remarks
Objects use a reference counting mechanism to ensure that the lifetime of the object includes the lifetime of references to it. You use AddRef to stabilize a copy of an interface pointer. It can also be called when the life of a cloned pointer must extend beyond the lifetime of the original pointer. The cloned pointer must be released by calling IUnknown::Release.

The internal reference counter that AddRef maintains should be a 32-bit unsigned integer.

Notes to Callers
Call this method for every new copy of an interface pointer that you make. For example, if you are passing a copy of a pointer back from a method, you must call AddRef on that pointer. You must also call AddRef on a pointer before passing it as an in-out parameter to a method; the method will call IUnknown::Release before copying the out-value on top of it.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/644036.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

中仕教育:“三不限”事业编的含义

所谓“三不限”&#xff0c;是指在报考事业单位时&#xff0c;对考生的户籍、年龄、学历不作任何限制。所以全国各地的考生只要符合招聘条件&#xff0c;都可以报考。所以每一年的三不限岗位竞争压力都比较大&#xff0c;报考人数都有很多。 ‘三不限’岗位招考信息在哪里看?…

制作Forms表单收集信息

Forms表单收集信息 背景表单制作New FormForms添加元素分享链接 测试查看结果数据结果可视化结果 背景 今天公司老板计划团建旅游&#xff0c;然后呢想让我们投一下票&#xff0c;说让我做一个表单来统计一下公司员工的信息&#xff0c;&#xff08;前半句不要信啊&#xff09…

基于Apache httpd为windows11搭建代理服务器

文章目录 一.概述二.检查电脑系统类型三.下载安装Apache Httpd四.代理服务配置五.代理服务安装六.报错解决方法七.测试是否运行成功7.1 本机测试7.2 局域网代理测试 八.设置特定ip可访问&#xff08;阻止其他ip访问&#xff09;九.参考文档 一.概述 出于某些原因&#xff0c;我…

架构篇22:CAP理论-布鲁尔定理(Brewer‘s theorem)

文章目录 CAP 理论CAP 应用小结 CAP 定理&#xff08;CAP theorem&#xff09;又被称作布鲁尔定理&#xff08;Brewer’s theorem&#xff09;&#xff0c;是加州大学伯克利分校的计算机科学家埃里克布鲁尔&#xff08;Eric Brewer&#xff09;在 2000 年的 ACM PODC 上提出的一…

如何在飞书创建企业ChatGPT智能问答助手应用并实现公网远程访问(1)

文章目录 前言环境列表1.飞书设置2.克隆feishu-chatgpt项目3.配置config.yaml文件4.运行feishu-chatgpt项目5.安装cpolar内网穿透6.固定公网地址7.机器人权限配置8.创建版本9.创建测试企业10. 机器人测试 前言 在飞书中创建chatGPT机器人并且对话&#xff0c;在下面操作步骤中…

10个常考的前端手写题,你全都会吗?(下)

前言 &#x1f4eb; 大家好&#xff0c;我是南木元元&#xff0c;热爱技术和分享&#xff0c;欢迎大家交流&#xff0c;一起学习进步&#xff01; &#x1f345; 个人主页&#xff1a;南木元元 今天接着上篇再来分享一下10个常见的JavaScript手写功能。 目录 1.实现继承 ES5继…

11.前端--CSS-背景属性

1.背景颜色 样式名称&#xff1a; background-color 定义元素的背景颜色 使用方式: background-color:颜色值; 其他说明&#xff1a; 元素背景颜色默认值是 transparent&#xff08;透明&#xff09;      background-color:transparent; 代码演示&#xff1a; 背景色…

Lua简介和应用场景介绍

Lua 的介绍 起源&#xff1a;Lua 于 1993 年在巴西里约热内卢的天主教大学&#xff08;PUC-Rio&#xff09;由 Roberto Ierusalimschy、Waldemar Celes 和 Luiz Henrique de Figueiredo 开发。 设计目的&#xff1a;Lua 设计的主要目标是为了嵌入到其他应用程序中&#xff0c;…

Leetcode—39.组合总和【中等】

2023每日刷题&#xff08;七十六&#xff09; Leetcode—39.组合总和 算法思想 实现代码 class Solution { public:vector<vector<int>> combinationSum(vector<int>& candidates, int target) {vector<vector<int>> ans;vector<int>…

Docker 魔法解密:探索 UnionFS 与 OverlayFS

本文主要介绍了 Docker 的另一个核心技术&#xff1a;Union File System。主要包括对 overlayfs 的演示&#xff0c;以及分析 docker 是如何借助 ufs 实现容器 rootfs 的。 1. 概述 Union File System Union File System &#xff0c;简称 UnionFS 是一种为 Linux FreeBSD NetB…

Mybatis 踩坑合集

判等的时候integer的0不识别 解决方法&#xff1a; 改成string的把判空 ’ ’ 取消掉 大佬分析 在实体类中定义了get方法&#xff0c;updatebyid的时候会调用自己的get方法&#xff0c;要注意传参

linux部署nginx

linux部署nginx 参考链接&#xff1a;linux 系统下安装nginx 如何使用nginx访问另外一台windows服务器java服务 参考链接&#xff1a;如何使用nginx访问另外一台windows服务器java服务

2024年美赛数学建模思路 - 案例:退火算法

文章目录 1 退火算法原理1.1 物理背景1.2 背后的数学模型 2 退火算法实现2.1 算法流程2.2算法实现 建模资料 ## 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 退火算法原理 1.1 物理背景 在热力学上&a…

力扣206-反转链表

反转链表 题目链接 解题思路 反转链表&#xff0c;只需要将链表中的元素放入栈中&#xff0c;然后依次出栈&#xff0c;即可实现链表的反转 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(…

MySQL乐观锁与悲观锁

说明 遇见并发情况&#xff0c;需要保证数据的准确性&#xff0c;也就是与正确的预期一致&#xff0c;此时就会用到锁。 锁是在并发下控制程序的执行逻辑&#xff0c;以此来保证数据按照预期变动。 如果不加锁&#xff0c;并发情况下的可能数据不一致的情况&#xff0c;这是个…

Vue+OpenLayers7:html原生网页如何使用OpenLayers7地图

返回《Vue+OpenLayers7》专栏目录:Vue+OpenLayers7 前言 尽管现在大部分网页都是使用Vue或者React开发了,但是还是有不少开发者使用的是网页原生html进行开发,或者是老项目维护的需要,所以为了照顾使用html原生网页的同学们,本章简单讲解一下如何使用原始html网页情况下…

关于网络协议的笔记

简介&#xff1a; 协议&#xff0c; 网络协议的简称&#xff0c;网络协议是通信计算机双方必须共同遵从的一组约定。如怎么样建立连 接、怎么样互相识别等。只有遵守这个约定&#xff0c;计算机之间才能相互通信交流。它的 三要素是&#xff1a;语 法、语义、时序。 为了使数…

外网ssh远程连接服务器

文章目录 外网ssh远程连接服务器一、前言二、配置流程1. 在服务器上安装[cpolar](https://www.cpolar.com/)客户端2. 查看版本号&#xff0c;有正常显示版本号即为安装成功3. token认证4. 简单穿透测试5. 向系统添加服务6. 启动cpolar服务7. 查看服务状态8. 登录后台&#xff0…

常用shell脚本命令总结

可以将shell脚本 当做终端命令的集合&#xff0c;终端可以运行shell就可以 shell 脚本 声明(第一行加) #!/bin/bash 设置变量 FILE_PATH_BASE/home/gitlab-runner/apk_download/ 使用变量 "$FILE_PATH_BASE" 1、mv命令 文件移动 mv ./build/web/ ${FILE_PATH_BASE} …

innodb底层原理和MySQL日志机制

server层 1. 连接器 客户端连接数据库需要输入账号、密码。连接器进行校验账号密码以及权限。 2. 查询缓存 连接器连接以后&#xff0c;比如输入一个select语句&#xff0c;这时候第一步就会先根据sql语句作为key给查询缓存中查看这条sql有没有已经被查询过&#xff0c;如果…