系统平台
文章平均质量分 62
Peter(阿斯拉达)
关注系统界面开发技术,安全,语言特性,网络,图形,AI,硬件,并发,研发流程管理.
展开
-
[Windows]_[初级]_[GetVersionEx获取系统版本错误的原因]
1. 开发`WTL/ATL/Win32`程序时, 有时候需要获取系统版本号,以便判断用户在使用软件时的系统。在某一天突然发现获取的系统版本号是错的, 一直是版本号`6.2.x`,什么情况?原创 2024-08-05 21:10:51 · 439 阅读 · 0 评论 -
[C/C++]_[初级]_[在Windows和macOS平台上导出动态库的一些思考]
1. 最近看了`《COM本质论》`里关于如何设计基于抽象基类作为二进制接口,把编译器和链接器的实现隐藏在这个二进制接口中,从而使用该`DLL`时不需要重新编译。在编译出`C`接口时,发现接口名直接是函数名,比如`BindNativePort`,怎么不是`_BindNativePort`?原创 2024-05-31 17:23:47 · 421 阅读 · 0 评论 -
[Win32]_[初级]_[获取Windows本机的所有IP地址]
1. 开发`Win32`本地程序时,有时候需要本地启动一个`Socket`服务,监听客户端的访问。而其他机器的客户端访问肯定是需要知道这个机器的`IP`地址才能连接,那么如何获取服务器本机的`IPv4`地址呢?原创 2024-05-01 13:08:07 · 437 阅读 · 1 评论 -
[Windows]_[编译构建]_[使用CMake编译C++库注意事项]
1. 在开发本地程序时,`C++`库由于运行时库二进制不兼容的问题,不同版本`VS`编译出来的`C++`动态库是不能兼容的。遇到一个开源库,没有`configure`文件,没有`VS`的解决方案文件,怎么编译?原创 2023-11-11 11:56:08 · 223 阅读 · 0 评论 -
[批处理]_[初级]_[如何删除变量值里的双引号]
1. 在使用`Visual Studio`开发本地程序的时,需要在项目属性,`生成事件`->`生成后事件`里增加一些资源的打包,复制,删除等操作,那么就需要用到批处理来进行。而传递带空格的路径给外部的批处理文件时就需要双引号引用从而路径能作为一个整体。但是批处理传递参数的时候会把双引号当做值来传给`%1`参数,这就会造成在外部批处理文件里变量出现以下的重复双引号情况。怎么办?原创 2023-11-05 16:28:56 · 367 阅读 · 0 评论 -
[Windows]_[初级]_[创建目录和文件的名字注意事项]
# 场景1. 在开发`Windows`程序时,会出现目录生成了,但是函数无法在目录里创建文件,怎么回事?原创 2023-06-08 14:50:52 · 729 阅读 · 0 评论 -
[Linux]_[初级]_[用户相关命令]持续更新*
场景这里是关于操作用户账号的命令,这些命令在做一些管理,统计,定时等任务时有奇效。1. 使用某用户运行命令语法runuser - username -c [commands...]例子runuser - infoworld -c 'ls -l'原创 2022-03-31 20:36:54 · 380 阅读 · 0 评论 -
[Windows]_[C/C++]_[避免使用wsprintf函数]
常景在Windows开发时,由于std::string并没有格式化字符串的方法,因此我们只能使用sprintf。但是这个C标准库并不支持UNICODE字符串. 因此我们只能使用Windows提供的宽字节版本wsprintf。但是这个方法不能用,有什么问题?说明发现问题1,wsprintf[1]不支持对float类型的格式化,但是sprintf是支持的. 即便vs2017也不支持。比如以下显示百分比,精确到小数点后一位, 原本期望的值是50.0%. 但是wsprintf得到的值是f%。auto原创 2021-06-03 18:01:59 · 387 阅读 · 1 评论 -
[Windows]_[初级]_[使用7z命令行工具进行打包备份]
场景在开发程序或做一些自动化脚本时, 经常用压缩格式来进行打包文件夹为zip,或解压zip,rar,tar文件。如果压缩的是exe二进制文件,是不需要再进行压缩的,只需要存储即可,这样可以增加打包的速度。比如,在*nux系统可以通过tar命令打包持续集成的备份,可以过滤掉二进制安装包,只备份配置文件,这样备份大小就会小很多。而在Windows上可以使用开源免费的7-Zip软件的命令行工具做到同样的效果,怎么做?说明7z(7-Zip)支持很多常见的压缩格式创建和解压,其中开源压缩格式基本都支持创建原创 2021-03-29 17:37:37 · 1358 阅读 · 1 评论 -
[C/C++]_[初级]_[在Windows上导出C++类的动态库]
场景在Windows上使用VS开发C++类的导出dll时,如果我们的类包含了stl的模板成员变量,那么编译时会报以下警告. 如何解决?C4251: “Utils::path_”: class“std::basic_string<_Elem,_Traits,_Ax>”需要有 dll 接口由 class“Utils”的客户端使用1> with1> [1> _Elem=char,1>原创 2021-01-21 17:20:43 · 619 阅读 · 0 评论 -
[C/C++]_[Windows]_[Cygwin和MinGW的特点]
场景在开发Win32程序时,很多情况下我们都需要使用开源的第三方C/C++库,而第三方C/C++库一般都是基于gcc编译的,而这些库大多除了使用标准库之外还使用了系统(linux)的API,从而我们使用VS是基本编译不过的,怎么办?说明目前使用这种第三方库有三种办法:1.1 第一种是如果它没有vs构建文件的话,把源码导入vs,并且修改无法编译的函数为Windows的函数,或者实现这个找不到的函数功能。这个办法是最麻烦的,需要足够的耐心和试错。1.2 第二种是使用cygwin这个gnu的开源原创 2021-01-13 16:18:47 · 643 阅读 · 0 评论 -
[macOS]_[打开GBK-ANSI编码的中文字符文件乱码解决办法]
场景在中文Windows系统里使用VS开发时,它默认保存的.h,.cpp格式就是ANSI(GBK)编码, 这时如果我们做模块移植到macOS时,用TextEdit或者Xcode打开这个源码文件,如果源码里有中文字符,那么就会显示乱码。那么如何解决?图1:说明在macOS要正确显示中文字符,要么编辑器支持显示GBK编码的文件,要么把文件转码为UTF-8(macOS下的编辑器默认支持编码为UTF-8).在macOS下的TextEdit和Xcode都支持以指定编码打开文件或保存为指定编码文原创 2020-10-16 16:47:41 · 8810 阅读 · 1 评论 -
[Vbscript]_[初级]_[分组程序]
说明之前写了一个vbscript的分组程序,目的是给公司里的人员活动时随机分成N个组。活动随机分组小程序-VBS. 但是这个程序有BUG,也不能修改资源。这里做了新的版本修复。例子文件1:随机分组.vbs使用Windows的记事本打开,之后复制一下的文本到记事本,保存为随机分组.vbs, 注意后缀名必须是.vbs,存储时选择编码为ANSI, 这样弹出窗口的文字才不会显示乱码。' 随机分组 author: Sai' 新建一个ansi编码的txt文件, 名字为 姓名.txt,内容是每个姓名占原创 2020-09-20 22:05:10 · 701 阅读 · 0 评论 -
[macOS]_[Shell]_[获取App的签名证书有效期]
场景在进行 macOS开发时, 一般都需要对 app 进行签名,而我们发布产品后,测试如何查看app是否已经签名,证书是否正确,证书的有效期到哪天?我们右键app的Get Info并没有签名和证书信息。说明判断一个app是否签名可以通过codesign命令进行获取; 会输出签名的app信息,没有证书有效期和证书名称。codesign -dvvv /Applications/iTunes.appsign.sh获取一个app的签名证书,可以通过几条命令组合.以下内容另存位sign.sh之原创 2020-09-08 17:49:19 · 972 阅读 · 0 评论 -
[C/C++]_[初级]_[std::priority_queue的介绍]
场景有时候我们需要一个容器, 在插入时能按照指定的顺序排列, 从而在元素全部插入后, 或者删除某个元素时不需要重新对容器进行sort.std::vector 和 std::queue 不具备这种特性. std::map的key具备这种特性, 但是缺点就是不能进行复杂的比较. std::map的使用细节说明std::priority_queue 可以在进行插入数据时就进行比较...原创 2018-10-29 12:02:45 · 662 阅读 · 0 评论 -
[Python]_[初级]_[使用struct库对二进制文件进行读写]
场景1.要分析或生成一个二进制文件时, Python使用 struct库来转换或分析二进制数据. 当然使用C++或者Java来分析也可以, 但对于脚本语言Python来说, 编写数据和调试时间都没Python快. 所以Python其实是比较正确的选择.2.如果需要传输socket数据, 在定义好数据格式时自然也是使用stuct.pack和unpack来打包数据和分析数据.说明1...原创 2018-07-13 16:08:31 · 2674 阅读 · 0 评论 -
[C/C++]_[初级]_[关于使用C标准时间库对UTC和本地时间的转换]
场景Android,Java的Date是UTC时间, 我们在读取某些表的数值时往往得到的就是UTC秒数, 如何用C++转换为本地时间是一个常见的功能需求.还有就是UTC到本地时间的转换, 已知道一个字符串的UTC时间,如何转换为对应的本地时间. C标准时间库+扩展库具备这些关键转换.说明Coordinated Universal Time 世界统一时间, 世界标准时间. 或...原创 2018-07-08 18:55:23 · 4355 阅读 · 1 评论 -
[C/C++]_[初级]_[关于OutputIterator的简单介绍]
场景1.我们在使用算法库时, 免不了需要对集合进行排序, 复制, 移动等, 而对集合的元素进行操作就需要用到枚举(itereator).2.我们一般是对已存在的集合进行遍历, 删除, 但是如果需要复制一个集合A内的元素到一个集合B内时如何操作, 这时候枚举怎么使用? 用枚举能很方便进行多元素添加, 而不需要使用效率低下的 for 循环.说明1.Iterator可以理解为一种可以...原创 2018-04-19 15:40:44 · 1123 阅读 · 0 评论 -
[C/C++]_[初级]_[Windows上的字符串处理实用函数]
场景1.C/C++开发过程中, C字符串函数或者std::string是相当实用的了, 可以查询,截取,移除等, 但是一般都是移除指定的一个字符而不是字符串, 移除还是大小写敏感的. 当然也可以用正则表达式来移除或查询, 但是总也得3-4行代码吧.2.std::string 不但可以存储字符串, 还可以存储任意字节数据. 但是在查询,替换,移除字符串上也是和C差不多, 如果要在一段原创 2018-01-31 15:09:04 · 575 阅读 · 0 评论 -
[C/C++]_[初级]_[Windows上的文件路径处理函数]
场景1.C++开发过程中, 因为标准库缺乏文件路径的处理类, 所以一般都是自己去处理路径,文件名,所在目录等问题. 相当麻烦.2.如果是Java,有File; Object-c有NSString,都可以对路径进行处理, 比如获取扩展名, 也就是一行代码的问题.说明1.Windows Desktop编程里的Shell库里就有相关的路径处理函数, 可以说是对C++路径不足的补充,原创 2018-01-31 14:52:03 · 1793 阅读 · 0 评论 -
[C/C++]_[初级]_[正则表达式的反向引用]
场景1.正则表达式查询特定规则的字符串十分高效率, 有一些规则的字符串, 如果不用正则, 单是枚举+逻辑记录匹配的代码量就非常大.2.比如查找一个小写字符串里连续相同的字母, 之后把它替换为 Xn(大写字母和重复字母个数)的方式进行加密. 正好正则表达式有专门的反向引用来解决查找重复字符的问题.例子void TestBackreference(){ std::st原创 2018-01-16 17:22:20 · 692 阅读 · 0 评论 -
[C/C++标准库]_[初级]_[使用正则表达式过滤Windows文件名中的非法字符]
场景1.Windows和macOS的文件名有自己的命名规则, 特别是Windows的文件名限制了不允许使用的特殊字符. 在使用这些文件名新建文件时会创建失败.说明1.在前面的文章里在Windows上我使用了比较笨的方法: 过滤Windows.MacOSX文件名中的非法字符. 最近发现其实使用正则效率更高.例子#include <regex>#include <iostream>// "[/|?%原创 2017-11-22 21:48:22 · 3647 阅读 · 0 评论 -
[Object-C]_[C/C++]_[日期时间操作对比]
场景macOS 处理时间函数有自己的 NSDate, C 的库函数 time.h相比它就有点弱了, 不过麻雀虽小, 五脏俱全. 麻烦的是在处理一些 UTC,GMT之类的转换时需要自己动手.说明Object-C的 NSDate结合了NSDateFormatter来设置日期属性, 比如格式化,本地,时区等等.如果 C实现需要把本地转换为 UTC, 那么还需要对 time_t进行处理, 调用 lo原创 2017-10-26 17:56:37 · 4101 阅读 · 0 评论 -
[Object-C]_[C/C++]_[集合操作对比]
场景比如编辑联系人, 联系人需要加入某个分组, 这时候界面操作就需要复选框来选择加入某个分组, 但是有可能这个联系人之前已经加入了某个分组, 现在只是需要加入新的分组即可, 但是界面操作往往用户可能并不知道这个联系人已经加入过哪些分组, 所以他会把想加入的分组都勾选一边, 这样我们程序在提交时就需要过滤出未加入过的分组,也就是”相对补集”;再比如, 修改用户资料时, 我们需要勾选多个爱好兴趣,原创 2017-10-26 17:05:19 · 2153 阅读 · 0 评论 -
[C/C++标准库]_[初级]_[移除反转枚举reverse_iterator]
场景在一些业务逻辑中, 我们需要删除某个链表中的元素A, 并重新计算这个元素A后边的所有元素相对与前一个元素的值. 条件1是这个元素A必须删除, 因为这个元素A已经无效,有他存在必然影响了对整个链表的个数统计; 条件2是这个元素A后的所有元素本来是根据元素A的值进行相对计算的, 如今元素A被删除, 那么元素A后的元素值必要要重新计算.说明std::vector 经常被用来存储元素, 无奈我们发原创 2017-10-21 01:00:44 · 723 阅读 · 0 评论 -
[C/C++]_[macOS-Windows]_[原子操作2]
场景1.原子操作一般用在多线程执行的逻辑里, 比如统计业务个数 ++count, 或者下载文件个数,下载大小, 设置对象状态等. 如果不用原子操作, 那么可能在并发情况下, 原本的事务指令A会被事务指令2抢占而导致出现数据被覆盖.说明1.macOS下提供了 <libkern/OSAtomic.h> 来处理 C 方式的原子操作. 如果是object-c方式的原子属性可以使用关键字 atomic.2.C原创 2017-07-11 10:41:49 · 1209 阅读 · 0 评论 -
[MD5]_[Windows-macOS]_[计算文件的MD5]
场景1.MD5是比较简单的文件ID, 大部分情况在安全系数要求不高时可以用它来校验文件唯一性. 比如下载文件后进行 md5计算看文件是否完整.2.对字符串进行md5也是一样的.# 例子1.下边是使用系统自带的库或API来完成计算文件的md5, 第3方库 libgcrypt也可以做到, 就是编译比较麻烦.Windows#include <Wincrypt.h>std::string AssUtil:原创 2017-07-07 17:37:38 · 1466 阅读 · 0 评论 -
[Object-c]_[初级]_[数组NSArray过滤NSPredicate的简单介绍]
场景1.object-c的数组 NSArray 或 C++的 std::vector都支持查询特定条件的对象. NSArray内置了NSPredicate方式的查询, 可以说更加方便.说明1.object-c的 NSPredicate 缺点就是如果对要处理的属性值进行复杂换算再比较是做不到, 比如对属性 name 进行md5计算再比较, 不过这个时候一般都是用for进行迭代. NSPredicate原创 2017-07-07 17:19:04 · 1271 阅读 · 0 评论 -
[C/C++11]_[初级]_[使用正则表达式库进行分组查询]
场景1.正则表达式在查询替换字符串数据时效率很高, 可以节省很多不必要的查询代码. 特别是对字符串分组的查询, 可以说如果没有正则表达式,查询分组里的字符串需要写很多额外的代码,还不一定准确.2.查询并替换XML标签是比较常见的需求, 比如过滤掉HTML标签里的标签, 提取字符串内容等.例子1.这里举例了C++正则库的分组查询功能, 一个用于提取特定字符串, 一个用于替换字符串.// test-r原创 2017-05-15 14:07:32 · 2364 阅读 · 0 评论 -
[C/C++]_[初级]_[关于Gdiplus::Bitmap使用的注意事项]
场景1.我们一般使用 Gdiplus::Bitmap 来存储图像数据, 使用shared_ptr来对 Gdiplus::Bitmap 进行封装, 达到使用引用计数共享图像对象, 减少内存占用的目的.2.偶尔的时候如果 Gdiplus::Bitmap 使用不当释放时会出现崩溃错误, 什么原因呢? 说明1.原因是 Gdiplus::Bitmap* 不可以在 Gdiplus::GdiplusShutdow原创 2017-05-05 15:21:50 · 4177 阅读 · 0 评论 -
[C/C++]_[初级]_[关于std::string的compare陷阱]
场景1.std::string 我们经常用来存储字符串数据, 当然它也可以作为byte的存储器,存储任意字节.2.通常情况下我们使用 std::string 的 compare 方法比较字符串, 但这个方法比较奥字符串是不可靠的.说明1.compare 方法和 strcmp并不相同, 它比较的是 std::string size()大小里的所有字节.在size() 长度范围里, 如果有’\0’字符,原创 2017-05-05 06:24:37 · 7010 阅读 · 4 评论 -
[Zlib]_[初级]_[使用zlib库压缩目录]
场景 http://blog.csdn.net/infoworld压缩目录为zip不用多说了, 很多场景都会用到, 比如打包文件, 打包目录下载等. 说明zlib里的minizip并不可以直接使用来压缩文件夹, 但并不妨碍我们借鉴它的代码. 关键其实就在这个变量里savefilenameinzip, 它支持目录结构的名字. 所以只需要在调用 zipOpenNewFileInZip3_64 时,原创 2017-03-05 23:02:14 · 8846 阅读 · 2 评论 -
[sqlite3]_[初级]_[使用正则表达式REGEXP查询]
场景1.在一些数据库db文件中,随着版本更新可能会有不同的表名, 但是这些表名一般都符合某种规则, 所以适配不同版本的数据库表时, 最好的办法是动态获取表名.2.或者在查询Text数据里需要匹配某个email,某个数值, 都可以用正则表达式.说明1.REGEXP 操作符是sqlite3的一个调用regexp()函数的特殊语法. 默认情况下没有定义这个regexp()用户函数, 所以在使用REGEXP原创 2017-03-02 22:55:12 · 14671 阅读 · 1 评论 -
[Zlib]_[初级]_[使用zlib库压缩和解压字符串STL string]
场景1.一般在使用json传输数据时, 数据量特别大时,传输的过程就特别耗时, 因为带宽或者socket的缓存是有限制的, 数据量越大, 传输时间就越长. 网站一般使用gzip来压缩.说明1.zlib库可以实现gzip和zip方式的压缩, 这里只介绍zip方式的压缩, 一般写客户端程序已足够.2.修改了一下zpipe.c的实现, 其实就是把读文件改为读字符串, 写文件改为写字符串即可.例子// t原创 2017-02-14 16:51:54 · 4045 阅读 · 5 评论 -
[glog]_[C/C++]_[使用glog来记录日志]
glog 快速使用教程场景1.大部分程序由函数组成, 每个函数执行一段设计好的逻辑, 但是大部分的时候有可能出现意料之外的值, 这时候就很想知道这种意料以外的值是如何产生的, 这就需要一个函数调用和参数跟踪, 日志正好发挥作用.2.调试多线程程序时某些函数执行顺序可能出现期望之外的顺序,或者需要知道出问题时线程执行的顺序,而Debug程序并不能同时Debug多个线程的函数调用, 而且会影响线程的竞争原创 2016-12-31 20:51:39 · 6801 阅读 · 0 评论 -
[C/C++标准库]_[初级]_[std::deque和std::vector比较]
std::deque 特性双向队列,队列意味着存储方式不一样,deque不是连续存储的.允许在头尾快速插入或删除,对其他位置的引用对象无影响,不会有copy 发生.内部存储会根据需要自动扩展,扩展的代价比vector少很多,因为不会创建新的内存并复制引用.时间复杂度: 1) 随机访问. O(1) 2) 插入和移除头尾元素. O(1) 3) 插入和移除非头尾元素. O(n)std::v原创 2016-06-29 11:25:26 · 4020 阅读 · 0 评论 -
[C/C++11]_[初级]_[实用时间库chrono]
场景C++11开始提供了一个 实用时间库,相比C的time_t强多了,最明显的是可以精确到纳秒.vs2010还不支持这个库,所以比较可惜,对于新开发的项目,建议用2015可以使用最新特性.一般用这个库来转换时间或计算函数执行时间或者CPU指令周期.例子#include <iostream> #include <algorithm>#include <sstream>#include原创 2016-05-30 14:30:24 · 4373 阅读 · 0 评论 -
[C/C++标准库]_[初级]_[std::vector的多线程读写问题]
场景:1. 有时候需要使用vector 或 map作为多线程的共享变量, map是tree结构, 读和写方法都不是线程安全的, 即同时读写会有崩溃的现象.2. std::vector直观来说只用push_back和[] 下标访问操作应该没问题,push_back往后边加对象, 索引值只访问已经存储的变量(预先求size).注意, 这里不会删除vector元素.可惜,这种多线程操作还是会崩溃.原创 2015-08-07 18:49:06 · 10871 阅读 · 6 评论 -
[C/C++标准库]_[初级]_[使用fstream合并文本文件]
场景:1. 就是合并文本文件,并且从第2个文件起不要合并第一行.2. 问题: http://ask.csdn.net/questions/192151原创 2015-07-04 22:19:19 · 2628 阅读 · 0 评论 -
[C/C++标准库]_[初级]_[交集和补集]
1. 计算std::vector A和 std::vector B里的相同的元素, 用于保留不删除.2. 计算std::vector A和 std::vector B里各自的补集, 用于删除A的补集和添加B的补集,用在一些更新关联表的操作里. 比如联系人A所属分组B是一个集合BV, 把联系人A的所属分组修改为集合CV, 就需要删除两个集合BV,CV的CV补集和新增BV补集.3. C++标准库为我们提供了这些算法.原创 2015-07-03 15:38:05 · 3683 阅读 · 0 评论