精华内容
下载资源
问答
  • Spring常用的三种注入方式

    万次阅读 多人点赞 2017-10-28 21:45:39
    Spring通过DI(依赖注入)实现IOC(控制反转),常用的注入方式主要有三种:构造方法注入,setter注入,基于注解的注入。构造方法注入先简单看一下测试项目的结构,用maven构建的,四个包:entity:存储实体,里面...

    Spring通过DI(依赖注入)实现IOC(控制反转),常用的注入方式主要有三种:构造方法注入,setter注入,基于注解的注入。

    构造方法注入

    先简单了解一下测试项目的结构,用maven构建的,四个包:

    • entity:存储实体,里面只有一个User类
    • dao:数据访问,一个接口,两个实现类
    • service:服务层,一个接口,一个实现类,实现类依赖于IUserDao
    • test:测试包

    在spring的配置文件中注册UserService,将UserDaoJdbc通过constructor-arg标签注入到UserService的某个有参数的构造方法

    <!-- 注册userService -->
    <bean id="userService" class="com.lyu.spring.service.impl.UserService">
    	<constructor-arg ref="userDaoJdbc"></constructor-arg>
    </bean>
    <!-- 注册jdbc实现的dao -->
    <bean id="userDaoJdbc" class="com.lyu.spring.dao.impl.UserDaoJdbc"></bean>
    

    如果只有一个有参数的构造方法并且参数类型与注入的bean的类型匹配,那就会注入到该构造方法中。

    public class UserService implements IUserService {
    
    	private IUserDao userDao;
    	
    	public UserService(IUserDao userDao) {
    		this.userDao = userDao;
    	}
    	
    	public void loginUser() {
    		userDao.loginUser();
    	}
    
    }
    
    @Test
    public void testDI() {
    	ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
    	// 获取bean对象
    	UserService userService = ac.getBean(UserService.class, "userService");
    	// 模拟用户登录
    	userService.loginUser();
    }
    

    测试打印结果:jdbc-登录成功

    注:模拟用户登录的loginUser方法其实只是打印了一条输出语句,jdbc实现的类输出的是:jdbc-登录成功,mybatis实现的类输出的是:mybatis-登录成功。

    问题一:如果有多个有参数的构造方法并且每个构造方法的参数列表里面都有要注入的属性,那userDaoJdbc会注入到哪里呢?

    public class UserService implements IUserService {
    
    	private IUserDao userDao;
    	private User user;
    	
    	public UserService(IUserDao userDao) {
    		System.out.println("这是有一个参数的构造方法");
    		this.userDao = userDao;
    	}
    	
    	public UserService(IUserDao userDao, User user) {
    		System.out.println("这是有两个参数的构造方法");
    		this.userDao = userDao;
    		this.user = user;
    	}
    	
    	public void loginUser() {
    		userDao.loginUser();
    	}
    
    }
    


    结果:会注入到只有一个参数的构造方法中,并且经过测试注入哪一个构造方法与构造方法的顺序无关

    这里写图片描述

    问题二:如果只有一个构造方法,但是有两个参数,一个是待注入的参数,另一个是其他类型的参数,那么这次注入可以成功吗?

    public class UserService implements IUserService {
    
    	private IUserDao userDao;
    	private User user;
    	
    	public UserService(IUserDao userDao, User user) {
    		this.userDao = userDao;
    		this.user = user;
    	}
    	
    	public void loginUser() {
    		userDao.loginUser();
    	}
    
    }
    

    结果:失败了,即使在costract-arg标签里面通过name属性指定要注入的参数名userDao也会失败.

    这里写图片描述

    问题三:如果我们想向有多个参数的构造方法中注入值该在配置文件中怎么写呢?

    public class UserService implements IUserService {
    
    	private IUserDao userDao;
    	private User user;
    	
    	public UserService(IUserDao userDao, User user) {
    		this.userDao = userDao;
    		this.user = user;
    	}
    	
    	public void loginUser() {
    		userDao.loginUser();
    	}
    
    }
    

    参考写法:通过name属性指定要注入的值,与构造方法参数列表参数的顺序无关。

    <!-- 注册userService -->
    <bean id="userService" class="com.lyu.spring.service.impl.UserService">
    	<constructor-arg name="userDao" ref="userDaoJdbc"></constructor-arg>
    	<constructor-arg name="user" ref="user"></constructor-arg>
    </bean>
    
    <!-- 注册实体User类,用于测试 -->
    <bean id="user" class="com.lyu.spring.entity.User"></bean>
    
    <!-- 注册jdbc实现的dao -->
    <bean id="userDaoJdbc" class="com.lyu.spring.dao.impl.UserDaoJdbc"></bean>
    

    问题四:如果有多个构造方法,每个构造方法只有参数的顺序不同,那通过构造方法注入多个参数会注入到哪一个呢?

    public class UserService implements IUserService {
    
    	private IUserDao userDao;
    	private User user;
    	
    	public UserService(IUserDao userDao, User user) {
    		System.out.println("这是第二个构造方法");
    		this.userDao = userDao;
    		this.user = user;
    	}
    	
    	public UserService(User user, IUserDao userDao) {
    		System.out.println("这是第一个构造方法");
    		this.userDao = userDao;
    		this.user = user;
    	}
    	
    	public void loginUser() {
    		userDao.loginUser();
    	}
    
    }
    

    结果:哪个构造方法在前就注入哪一个,这种情况下就与构造方法顺序有关。

    这里写图片描述

    setter注入

    配置文件如下:
    <!-- 注册userService -->
    <bean id="userService" class="com.lyu.spring.service.impl.UserService">
    	<!-- 写法一 -->
    	<!-- <property name="UserDao" ref="userDaoMyBatis"></property> -->
    	<!-- 写法二 -->
    	<property name="userDao" ref="userDaoMyBatis"></property>
    </bean>
    
    <!-- 注册mybatis实现的dao -->
    <bean id="userDaoMyBatis" class="com.lyu.spring.dao.impl.UserDaoMyBatis"></bean>
    

    注:上面这两种写法都可以,spring会将name值的每个单词首字母转换成大写,然后再在前面拼接上"set"构成一个方法名,然后去对应的类中查找该方法,通过反射调用,实现注入。

    切记:name属性值与类中的成员变量名以及set方法的参数名都无关,只与对应的set方法名有关,下面的这种写法是可以运行成功的

    public class UserService implements IUserService {
    
    	private IUserDao userDao1;
    	
    	public void setUserDao(IUserDao userDao1) {
    		this.userDao1 = userDao1;
    	}
    	
    	public void loginUser() {
    		userDao1.loginUser();
    	}
    
    }
    

    还有一点需要注意:如果通过set方法注入属性,那么spring会通过默认的空参构造方法来实例化对象,所以如果在类中写了一个带有参数的构造方法,一定要把空参数的构造方法写上,否则spring没有办法实例化对象,导致报错。
    这里写图片描述

    基于注解的注入

    在介绍注解注入的方式前,先简单了解bean的一个属性autowire,autowire主要有三个属性值:constructor,byName,byType。
    • constructor:通过构造方法进行自动注入,spring会匹配与构造方法参数类型一致的bean进行注入,如果有一个多参数的构造方法,一个只有一个参数的构造方法,在容器中查找到多个匹配多参数构造方法的bean,那么spring会优先将bean注入到多参数的构造方法中。

    • byName:被注入bean的id名必须与set方法后半截匹配,并且id名称的第一个单词首字母必须小写,这一点与手动set注入有点不同。

    • byType:查找所有的set方法,将符合符合参数类型的bean注入。


    下面进入正题:注解方式注册bean,注入依赖

    主要有四种注解可以注册bean,每种注解可以任意使用,只是语义上有所差异:

    1. @Component:可以用于注册所有bean
    2. @Repository:主要用于注册dao层的bean
    3. @Controller:主要用于注册控制层的bean
    4. @Service:主要用于注册服务层的bean

    描述依赖关系主要有两种:

    • @Resource:java的注解,默认以byName的方式去匹配与属性名相同的bean的id,如果没有找到就会以byType的方式查找,如果byType查找到多个的话,使用@Qualifier注解(spring注解)指定某个具体名称的bean。

      @Resource
      @Qualifier("userDaoMyBatis")
      private IUserDao userDao;
      
      public UserService(){
      	
      }
      
    • @Autowired:spring注解,默认是以byType的方式去匹配类型相同的bean,如果只匹配到一个,那么就直接注入该bean,无论要注入的 bean 的 name 是什么;如果匹配到多个,就会调用 DefaultListableBeanFactorydetermineAutowireCandidate 方法来决定具体注入哪个bean。determineAutowireCandidate 方法的内容如下:

      // candidateBeans 为上一步通过类型匹配到的多个bean,该 Map 中至少有两个元素。
      protected String determineAutowireCandidate(Map<String, Object> candidateBeans, DependencyDescriptor descriptor) {
          //  requiredType 为匹配到的接口的类型
         Class<?> requiredType = descriptor.getDependencyType();
         // 1. 先找 Bean 上有@Primary 注解的,有则直接返回
         String primaryCandidate = this.determinePrimaryCandidate(candidateBeans, requiredType);
         if (primaryCandidate != null) {
             return primaryCandidate;
         } else {
             // 2.再找 Bean 上有 @Order,@PriorityOrder 注解的,有则返回
             String priorityCandidate = this.determineHighestPriorityCandidate(candidateBeans, requiredType);
             if (priorityCandidate != null) {
                 return priorityCandidate;
             } else {
                 Iterator var6 = candidateBeans.entrySet().iterator();
      
                 String candidateBeanName;
                 Object beanInstance;
                 do {
                     if (!var6.hasNext()) {
                         return null;
                     }
      
                     // 3. 再找 bean 的名称匹配的
                     Entry<String, Object> entry = (Entry)var6.next();
                     candidateBeanName = (String)entry.getKey();
                     beanInstance = entry.getValue();
                 } while(!this.resolvableDependencies.values().contains(beanInstance) && !this.matchesBeanName(candidateBeanName, descriptor.getDependencyName()));
      
                 return candidateBeanName;
             }
         }
      }
      

      determineAutowireCandidate 方法的逻辑是:

      1. 先找 Bean 上有@Primary 注解的,有则直接返回 bean 的 name。
      2. 再找 Bean 上有 @Order,@PriorityOrder 注解的,有则返回 bean 的 name。
      3. 最后再以名称匹配(ByName)的方式去查找相匹配的 bean。

      可以简单的理解为先以 ByType 的方式去匹配,如果匹配到了多个再以 ByName 的方式去匹配,找到了对应的 bean 就去注入,没找到就抛出异常。

      还有一点要注意:如果使用了 @Qualifier 注解,那么当自动装配匹配到多个 bean 的时候就不会进入 determineAutowireCandidate 方法(亲测),而是直接查找与 @Qualifer 指定的 bean name 相同的 bean 去注入,找到了就直接注入,没有找到则抛出异常。

      tips:大家如果认真思考可能会发现 ByName 的注入方式和 @Qualifier 有点类似,都是在自动装配匹配到多个 bean 的时候,指定一个具体的 bean,那它们有什么不同呢?

      ByName 的方式需要遍历,@Qualifier 直接一次定位。在匹配到多个 bean 的情况下,使用 @Qualifier 来指明具体装配的 bean 效率会更高一下

      博主个人觉得:@Qualifer 注解出现的意义或许就是 Spring 为了解决 JDK 自带的 ByName 遍历匹配效率低下的问题。要不然也不会出现两个容易混淆的匹配方式。


    写在最后:虽然有这么多的注入方式,但是实际上开发的时候自己编写的类一般用注解的方式注册类,用@Autowired描述依赖进行注入,一般实现类也只有一种(jdbc or hibernate or mybatis),除非项目有大的变动,所以@Qualifier标签用的也较少;但是在使用其他组件的API的时候用的是通过xml配置文件来注册类,描述依赖,因为你不能去改人家源码嘛。


    另外,非常感谢 cdy1996 指出了我之前的错误(认为 ByName 是 @Autowired 默认的注入方式),欢迎大家指出我的错误和不足,但是,一定请带上代码。


    用于测试的项目的网盘链接如下:
    https://pan.baidu.com/s/1GrRlT5cLAI3SMu17TA6l6Q


    展开全文
  • Webstorm的一些常用快捷键

    万次阅读 多人点赞 2018-01-09 14:27:38
    下面是Webstorm的一些常用快捷键: 1. ctrl + shift + n: 打开工程中的文件,目的是打开当前工程下任意目录的文件。 2. ctrl + j: 输出模板 3. ctrl + b: 跳到变量申明处 4. ctrl + alt + T: 围绕包裹代码(包括zen...

    下面是Webstorm的一些常用快捷键:
    1. ctrl + shift + n: 打开工程中的文件,目的是打开当前工程下任意目录的文件。
    2. ctrl + j: 输出模板
    3. ctrl + b: 跳到变量申明处
    4. ctrl + alt + T: 围绕包裹代码(包括zencoding的Wrap with Abbreviation)
    5. ctrl + []: 匹配 {}[]
    6. ctrl + F12: 可以显示当前文件的结构
    7. ctrl + x: 剪切(删除)行,不选中,直接剪切整个行,如果选中部分内容则剪切选中的内容
    8. alt + left/right:标签切换
    9. ctrl + r: 替换
    10. ctrl + shift + up: 行移动
    11. shift + alt + up: 块移动(if(){},while(){}语句块的移动)
    12. ctrl + d: 行复制
    13. ctrl + shift + ]/[: 选中块代码
    14. ctrl + / : 单行注释
    15. ctrl + shift + / : 块注释
    16. ctrl + shift + i : 显示当前CSS选择器或者JS函数的详细信息
    17. ctrl + '-/+': 可以折叠项目中的任何代码块,它不是选中折叠,而是自动识别折叠。
    18. ctrl + '.': 折叠选中的代码的代码。
    ctrl+/ 单行注释
    ctrl+shift+/块注释
    ctrl+shift+ +/-展开/折叠
    ctrl+alt+L 格式化代码
    ctrl+shift+ up/down 上下移动句子
    Alt+回车 导入包,自动修正
    Ctrl+N 查找类
    Ctrl+Shift+N 查找文件
    Ctrl+Alt+L 格式化代码
    Ctrl+Alt+O 优化导入的类和包
    Alt+Insert 生成代码(如get,set方法,构造函数等)
    Ctrl+E或者Alt+Shift+C 最近更改的代码
    Ctrl+R 替换文本
    Ctrl+F 查找文本
    Ctrl+Shift+Space 自动补全代码
    Ctrl+空格 代码提示
    Ctrl+Alt+Space 类名或接口名提示
    Ctrl+P 方法参数提示
    Ctrl+Shift+Alt+N 查找类中的方法或变量
    Alt+Shift+C 对比最近修改的代码
    Shift+F6 重构-重命名
    Ctrl+Shift+先上键
    Ctrl+X 删除行
    Ctrl+D 复制行
    Ctrl+/ 或 Ctrl+Shift+/ 注释(// 或者/*...*/ )
    Ctrl+J 自动代码
    Ctrl+E 最近打开的文件
    Ctrl+H 显示类结构图
    Ctrl+Q 显示注释文档
    Alt+F1 查找代码所在位置
    Alt+1 快速打开或隐藏工程面板
    Ctrl+Alt+ left/right 返回至上次浏览的位置
    Alt+ left/right 切换代码视图
    Alt+ Up/Down 在方法间快速移动定位
    Ctrl+Shift+Up/Down 代码向上/下移动。
    F2 或Shift+F2 高亮错误或警告快速定位
    代码标签输入完成后,按Tab,生成代码。
    选中文本,按Ctrl+Shift+F7 ,高亮显示所有该文本,按Esc高亮消失。
    Ctrl+W 选中代码,连续按会有其他效果
    选中文本,按Alt+F3 ,逐个往下查找相同文本,并高亮显示。
    Ctrl+Up/Down 光标跳转到第一行或最后一行下
    Ctrl+B 快速打开光标处的类或方法

     

    展开全文
  • 【Linux】linux常用基本命令

    万次阅读 多人点赞 2013-03-22 13:54:04
    Linux中许多常用命令是必须掌握的,这里将我学linux入门时学的一些常用的基本命令分享给大家一下,希望可以帮助你们。

    Linux中许多常用命令是必须掌握的,这里将我学linux入门时学的一些常用的基本命令分享给大家一下,希望可以帮助你们。


    这个是我将鸟哥书上的进行了一下整理的,希望不要涉及到版权问题。


    1、显示日期的指令: date




    2、显示日历的指令:cal



    3、简单好用的计算器:bc



    怎么10/100会变成0呢?这是因为bc预设仅输出整数,如果要输出小数点下位数,那么就必须要执行 scale=number ,那个number就是小数点位数,例如:



    4、重要的几个热键[Tab],[ctrl]-c, [ctrl]-d 


    [Tab]按键---具有『命令补全』不『档案补齐』的功能


    [Ctrl]-c按键---让当前的程序『停掉』


    [Ctrl]-d按键---通常代表着:『键盘输入结束(End Of File, EOF 戒 End OfInput)』的意思;另外,他也可以用来取代exit


    5、man

    退出用q,

    man -f man



    6、数据同步写入磁盘: sync


    输入sync,那举在内存中尚未被更新的数据,就会被写入硬盘中;所以,这个挃令在系统关机戒重新启劢乀前, 径重要喔!最好多执行几次!



    7、惯用的关机指令:shutdown



    此外,需要注意的是,时间参数请务必加入指令中,否则shutdown会自动跳到 run-level 1 (就是单人维护的登入情况),这样就伤脑筋了!底下提供几个时间参数的例子吧:



    重启,关机: reboot, halt,poweroff



    8、切换执行等级: init


    Linux共有七种执行等级:


    --run level 0 :关机


    --run level 3 :纯文本模式


    --run level 5 :含有图形接口模式


    --run level 6 :重新启动


     

    使用init这个指令来切换各模式:


    如果你想要关机的话,除了上述的shutdown -h now以及poweroff之外,你也可以使用如下的指令来关机:  



    9、改变文件的所属群组:chgrp



    10、改变文件拥有者:chown


    他还可以顸便直接修改群组的名称



    11、改变文件的权限:chmod


    权限的设定方法有两种, 分别可以使用数字或者是符号来进行权限的变更。


    --数字类型改变档案权限:



     

    --符号类型改变档案权限:



    12、查看版本信息等



    13、变换目录:cd



    14、显示当前所在目录:pwd



    15、建立新目录:mkdir


     

    不建议常用-p这个选项,因为担心如果你打错字,那么目录名称就回变得乱七八糟的

     

    16、删除『空』的目录:rmdir



    17、档案与目录的显示:ls



    18、复制档案或目录:cp



    19、移除档案或目录:rm



    20、移动档案与目录,或更名:mv



    21、取得路径的文件名与目录名:basename,dirname



    22、由第一行开始显示档案内容:cat



    23、从最后一行开始显示:tac(可以看出 tac 是 cat 的倒着写)



    24、显示的时候,顺道输出行号:nl



    25、一页一页的显示档案内容:more



    26、与 more 类似,但是比 more 更好的是,他可以往前翻页:less



    27、只看头几行:head



    28、只看尾几行:tail



    29、以二进制的放置读取档案内容:od



    30、修改档案时间或新建档案:touch



    31、档案预设权限:umask



    32、配置文件档案隐藏属性:chattr



    33、显示档案隐藏属性:lsattr



    34、观察文件类型:file



    35、寻找【执行挡】:which



    36、寻找特定档案:whereis



    37、寻找特定档案:locate



    38、寻找特定档案:find



    39、压缩文件和读取压缩文件:gzip,zcat



    40、压缩文件和读取压缩文件:bzip2,bzcat



    41、压缩文件和读取压缩文件:tar



     

     

    好了,累死了,终于搞完了,希望能对的大家有所帮助。

     

     您的支持是对作者最大的鼓励!



     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     



     


    展开全文
  • VC++常用功能开发

    万次阅读 多人点赞 2020-09-28 11:27:24
    功能介绍:代码实现了获取任一磁盘的剩余空间,返回MB 和GB 第24章:VC++常用字符串转换(附源码) 功能介绍:代码实现了常用字符串转换操作功能 第25章:VC++软件授权加密与管控(附demo) 功能介绍:代码实现功能绑定...

    文章还在持续更新 ing......

    大胸弟:来都来了,点点关注,点点赞 ,点点收藏,Thanks,Thanks,Thanks!

    第1章:VC++ ini配置文件封装类源代码

    功能介绍:代码实现了读写整型、浮点型、字符串、16进制数据的功能

    第2章:VC++实现二维码(显示+保存图片)功能源代码

    功能介绍:采用LibQREncode  ,可以生成二维码,保存二维码图片(bmp/jpg/png) ,以及在窗口上显示二维码,

    二维码内容字符串 任意定义

    第3章:VC++ 调节系统音量(与任务栏音量同步)源代码

    功能介绍:能够获取与调节系统音量,与任务栏音量同步,软件更改了系统音量,任务栏音量也会同步变化!

    第4章:VC++写日志文件封装类源代码

    功能介绍:按天生成日志文件,也即一天生成一个日志,每条日志打印当前系统时间+文本内容,时间精确到毫秒.

    第5章:VC++创建多级目录源代码

    功能介绍:代码实现了一次创建多级目录 功能如:D:\test\abc\xyz

    第6章:VC++连接wifi功能(有密码)源代码

    功能介绍:代码实现了有wifi密码,然后连接上wifi的功能,主要采用的是命令行工具+profile的模式

    第7章:VC++调节笔记本屏幕亮度(附源码)

    功能介绍:代码实现了笔记本电脑屏幕亮度,与系统调节功能同步

    第8章:VC++利用笔记本自带摄像头扫二维码功能(附源码demo)

    功能介绍:代码实现了笔记本电脑自带设像头扫二维码的功能

    第9章:VC++多线程封装类(附源码)

    功能介绍:代码封装了 创建线程、挂起线程、恢复线程、 等待线程退出、设置优先级、停止线程等功能

    第10章:VC++多线程加锁封装(附源码)

    功能介绍:代码封装了 线程函数读、写 加锁功能,支持跨平台,绝对好用

    第11章:VC++实现FTP下载文件与目录功能(附源码)

    功能介绍:代码实现了下载FTP服务器指定目录所有文件的功能

    第12章:VC++上传文件到FTP服务器(附源码)

    功能介绍:代码实现了上传单个文件到FTP服务器指定目录的功能

    第13章:VC++检测耳机插拔功能(附源码)

    功能介绍:代码实现了动态检测耳机插入,拔出功能。

    第14章:VC++电脑锁屏(附源码)

    功能介绍:代码实现了电脑锁屏功能,但除了ctrl+del+alt win+l ,可以供参才与优化

    第15章:VC++ RTSP客户端(附源码)

    功能介绍:实现了rtsp客户端功能,附有调用demo,正常取流!

    第16章:VC++ RTSP服务端(附源码) 

    功能介绍:代码实现了rtsp服务端功能,而且对模块进行了封装,只需要简单的调用

    4个函数就可以,实现服务器的功能,主要是针对h264流的封包!

    第17章:VC++获取DLL导出函数列表(附源码)

    功能介绍:代码实现了获取DLL导出函数的所有函数名称列表

    第18章:VC++线程池demo(附源码)

    功能介绍:代码实现了线程池的功能,用的是CThreadPool哈,只支持windows下面呢!

    第19章:VC++设置默认音频设备(附源码)

    功能介绍:代码实现了设置默认音频输出设备(录制与播放)

    第20章:VC++获取文件最后修改时间(附源码)

    功能介绍:代码实现了获取文件最后的修改时间,返回CString 日期字符串

    第21章:VC++设置文件最后修改时间(附源码)

    功能介绍:代码实现了设置文件最后的修改时间

    第22章:VC++tcp网络通讯服务器+客户端(附源码)

    功能介绍:代码实现了TCP服务端功能,以及TCP客户端功能

    第23章:VC++获取磁盘剩余空间(附源码)

    功能介绍:代码实现了获取任一磁盘的剩余空间,返回MB 和GB

    第24章:VC++常用字符串转换(附源码)

    功能介绍:代码实现了常用字符串转换操作功能

    第25章:VC++软件授权加密与管控(附demo)

    功能介绍:代码实现功能绑定了电脑,换电脑不能使用,到期不能使用,到次数不能使用!

    第26章:VC++ 获取系统硬件相关信息(附源码 )

    功能介绍:代码实现了/获取CPU频率,单位: MHZ,获取制造商信息,

    获取硬盘序列号,获取CPU使用率,获取网络占用率,获取操作系统名称等功能 !

    第27章:VC++串口通讯(源代码)

    功能介绍:实现了串口打开,接收,发送等功能 ,还支持modbus串口通讯功能!

    第28章:VC++串口封装类(附源码)

    功能介绍:串口打开,接收,发送封装成了相当好用的类,代码量相当少!

    第29章:VC++隐藏任务栏(附源码)

    功能介绍:代码实现了隐藏任务栏,隐藏开始菜单(win10) !

    第30章:VC++获取系统序列号(SN)附源码

    功能介绍:代码实现了获取序列号,产品型号,产品名称,系统版本,SKU, 产品制造商等信息!

    第31章:VC++使用管道重定向进程输入输出(附源码)

    功能介绍:代码实现了调用控制台程序,并使用管道重定向解析控制台程序输出,实现与控制台程序内部交互!

    第32章:VC++ json11 使用(附demo源码)

    功能介绍:代码实现了调用json11库的例子,怎么创建json数据与解析json数据.

    第33章:vc查找进程并杀死指定进程(附源码)

    功能介绍:代码实现了代码实现了获取枚举系统所有进程,然后杀死你想要kill的进程

    第34章:VC++字符串IP地址转DWORD地址

    功能介绍:把字符串IP地址转DWORD地址 ,如转换成CIPAddressCtrl 添加的DWORD变量

    第35章: C++ huffman数据压缩算法实现(附源码)

    功能介绍:代码实现了huffman数据压缩解压算法

    第36章: VC++实现内存映射文件(附源码)

    功能介绍:代码实现了VC++实现内存映射文件的代码封装

    第37章: VC++实现系统托盘功能(附源码)

    功能介绍:代码实现了应用程序托盘功能的封装功能

    第38章: 3des加解密(+MD5) c++实现(附源码)

    功能介绍:代码实现了3DES+MD5加解密功能

    第39章: opencv根据摄像头名称打开摄像头(附源码)

    功能介绍:代码实现了opencv +VideoCapture+Dshow 根据摄像头名称或id 打开指定摄像头

    第40章: vc++自动断开wifi功能

    功能介绍:代码实现了自动断开wifi,并清除记住密码功能

    第41章: c++AES加密解密(附源码)

    功能介绍:代码实现了AES加解密功能,采用 ECB 模式

    第42章:VC++获取网络占用率(附源码)

    功能介绍:代码实现了获取指定网卡网络占用情况

    第43章:vc++获取桌面应用程序图标位置

    功能介绍:代码实现了获取windows桌面应用程序图标位置信息功能

    第44章:VC++http实现下载文件(附源码)

    功能介绍:代码实现了http下载文件功能,并封装成了类,并附调用demo

    第45章:VC操作注册表(附demo)

    功能介绍:代码实现了注册表 创建,读取,更改,删除 项的相关功能,已封装成类!

    第46章:VC++写日志文件增强版(多线程支持)

    功能介绍:按天生成日志文件,多线程版本!

    第47章:vc声音录制播放程序(附demo)

    功能介绍:录制.播放,音量调试,耳机录制播放功能,功能超多。。。

    第48章:VC++实现的软键盘功能(附源码)

    功能介绍:代码实现软键盘的界面与功能

    第49章:VC++域名转IP(网络直接连接域名)

    功能介绍:代码实现软域名转ip功能(也就是网址转ip)

    第50章:vc++datamatrix二维码识别

    功能介绍:代码实现datamatrix二维码识别与编码生成

    第51章:VC++农历与公历转换

    功能介绍:代码实现农历与公历的相互转换功能

    第52章:VC++实现文件加解密功能(附使用demo)

    功能介绍:代码实现对任意文本文件加解密功能

    第53章:VC++生成崩溃dump文件(附源码)

    功能介绍:代码实现生成core dump崩溃文件功能

    第54章:VC++字符串转16进制字符串(附源码)

    功能介绍:代码实现了普通任意字符串转成16进制字符串

    第55章:VC++应用程序添加防火墙白名单(附源码)

    功能介绍:代码实现了给应用程序添加防火墙信任功能,应用程序白名单,关闭防火墙等功能

     

    代码网盘共享如图:

     

     

    如果你有其它功能的需要,而恰恰我这里有(上面文章又没有提供),可以直接在博客下留言,Thanks!

     QQ群学习资料,电子书等

    代码分享:

    (每篇文章尾都附有源码与demo的百度分享链接,百分百可下载).

    vc学习交流群,订阅者可加入,分享更多源码干活,更多常用代码....

    分享一份常用功能的库代码:

    链接:https://pan.baidu.com/s/1MMf-frGsBvmOCGWd1nvvcg
    提取码:9ql4
    复制这段内容后打开百度网盘手机App,操作更方便哦

     大胸弟:文章都看完了,不点点关注,不点点赞 ,您是不是有点太不讲武德了!  

     

    展开全文

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,518,461
精华内容 607,384
关键字:

常用