(00XX系列)抽抽Windows宽字符的棉絮(附日志文件源码)
[size=medium] 爷最近和可爱的冬瓜私底下开始了一个游戏的非秘密非官方性的民间活动。虽然是非秘密性,但是爷不太想提,因为还没什么成果。所以说大家看到一些"非XX"的字眼,其实代表的意思就是"XX"。因为官方拥有对"非XX"的解释权。
反正就是缺少这么个日志模块,爷坚决的使用了unicode字符做为统一接口。折腾了若干麻烦,爷这里一一抽出。这个日志和江湖流传的日志一样,属于同基因产品,无异变也无混血。
先来介绍下都使用了哪些宽函数:
1.字符类型上使用[color=blue]wchar_t[/color]
2.格式和拷贝函数使用了[color=blue]_snwprintf[/color]和[color=blue]wcsncpy[/color].这里我又查了下是否有_wcsncpy之类的函数。发现还真有,但是多了个[color=blue]locale_t locale[/color] 参数。感觉很奇怪,似乎是一个长度。我觉得这种拷贝类的只要提供一个dst的长度就足够简洁了。
3.文件打开上使用了[color=blue]_wfopen_s(/.../, L"a,ccs=UTF-8");[/color]表示建立一个UTF-8的编码。我尝试过UNICODE。但是是4个字节,无法对ANSI一些编码进行自适应。
4.文件写入的函数不变。因为写入都只是二进制流,只要控制好写入的大小就行。[color=blue]fwrite[/color]的第三个单元大小参数设置为2。
5.变参的参数格式化使用[color=blue]vswprintf[/color]。这里要批下[color=blue]vswprintf[/color],如果是格式的内容大小大于给定的长度,居然返回-1!导致在写入文件的时候还要判断正负数,非常的不便
6.微软提供的[color=blue]_s[/color]安全函数。如果超出长度,程序直接终止。这有点无奈,对于一些应用程序来说,既然我已经给定了长度,超出的截断掉就好,用不着把整个程序结束掉。但是如果一些溢出代码长度恰好在指定范围内,但是行为超出,也只能稍微的加以生化毁灭。但是既然是微软平台的问题,强烈建议[color=blue]_s[/color]的安全性不以独立的函数调用,直接融合进去。所以对一些用户输入的东西,还是尽量用[color=blue]_s[/color]的东西。而这个日志模块的记录完全是由程序员和一些程序内部信息控制,完全隔离了用户的输入。
最后是用了一个宏技巧。在写入日志的时候,不用每次都手动的输入__FILE__之类的信息参数。既然C标准支持宏的可变参,实现起来就容易多了:[/size]
//是否开启文件名、函数名、行数等写入信息#define SCRIPT_LOG_DETAIL
#define __WFILE__2(x) L ## x#define __WFILE__1(x) __WFILE__2(x)#define __WFILE__ __WFILE__1(__FILE__)
#define __WFUNCTION__2(x) L ## x#define __WFUNCTION__1(x) __WFUNCTION__2(x)#define __WFUNCTION__ __WFUNCTION__1(__FUNCTION__)
#define __WLINE__2(x) L ## x#define __WLINE__1(x) __WLINE__2(x)#define __WLINE__ __WLINE__1(__LINE__)
#ifdef SCRIPT_LOG_DETAIL#define SCRIPTLOG_TRACE_DETAIL(level) scriptlog_trace(level, L"<File>:%s\n<Function>:%s\n<Line>:%d\n", __WFILE__, __WFUNCTION__, __LINE__)#else#define SCRIPTLOG_TRACE_DETAIL #endif
#define LTRACE(level, format, ...) \ SCRIPTLOG_TRACE_DETAIL(level); \ scriptlog_trace(level, format##L"\n", __VA_ARGS__);
[size=medium]
最后一个好消息,如果需要可以直接向我索取。javaeye上需要注册3天(数据可能不准)以上才能下载。虽然方法不错,但是一般浏览到你信息的人基本都是有些急问题直接搜索的,你再给个3天,从精神上间接的杀死对方。建议改个30分钟就足够了。[/size]
(00XX系列)抽抽Windows宽字符的棉絮(附日志文件源码)相关推荐
- Windows CE/Moblie截屏工具及实现源码
Windows CE/Moblie截屏工具及实现源码 [img]http://dl2.iteye.com/upload/attachment/0084/6997/c72941f2-b86e-3683- ...
- html5机械双语源码,宽屏蓝色大气的云信CMS源码,中英文双语切换,外贸网站CMS源码,生成静态HTML...
宽屏蓝色大气的云信CMS源码,中英文双语切换,外贸网站CMS源码,生成静态HTML, |% B @$ a ?; M5 r7 R }4 t 8 F1 M$ F, ?) Q' c0 d V! _/ ...
- python提取发票信息发票识别_(附完整python源码)基于tensorflow、opencv的入门案例_发票识别二:字符分割...
(附完整python源码)基于tensorflow.opencv的入门案例_发票识别二:字符分割 发布时间:2018-05-14 20:16, 浏览次数:1201 , 标签: python tenso ...
- 源码系列第1弹 | 带你快速攻略Kafka源码之旅入门篇
大家过年好,我是 华仔, 又跟大家见面了. 从今天开始我将为大家奉上 Kafka 源码剖析系列文章,正式开启 「Kafka的源码之旅」,跟我一起来掌握 Kafka 源码核心架构设计思想吧. 今天这篇我 ...
- Windows上IDEA搭建最新Spark2.4.3源码阅读及调试的开发环境
相信很多同学都想通过阅读一些框架的源码,来提高自己的代码能力,但往往在第一步,搭建环境的时候就碰了壁. 本篇就来介绍下如何在Windows下,将最新版的Spark2.4.3编译,并导入到IDEA编译器 ...
- ElasticStack系列之十六 ElasticSearch5.x index/create 和 update 源码分析
开篇 在ElasticSearch 系列十四中提到的问题即 ElasticStack系列之十四 & ElasticSearch5.x bulk update 中重复 id 性能骤降,继续这个问 ...
- msdn windows server 按电源事件api_【tornado源码分析】I/O事件循环机制与多进程
tornado是一个异步非阻塞的web框架,由Facebook开源,源代码用的python语言.之前也用tornado做过几个项目,实习的时候公司也是用的tornado来做工业物联网的后端.空余时间研 ...
- 在Windows系统中构建还原ASP.NET Core 源码
大家好,这几天试着从Github上拉取AspNetCore的源码,尝试着通过Visual Studio 打开,但是并不尽人意.我们需要去构建我们拉去的源代码,这样才可以通过VisualStudio可还 ...
- Qt+mpv制作windows/linux 下的动态壁纸软件(含源码)
mpv是啥? mpv之前是mediaplayer,windwos之前好像都有预装这个,都来经过发展,现在是一个对跨平台开发很友好的播放器工具. Qt是啥? 制作桌面应用程序的开发语言及工具,基于C++ ...
最新文章
- js 将线性数据转为树形
- ubuntu mysql备份_Ubuntu下进行MYSQL自动备份
- 在Linux虚拟机中添加多个ip地址
- CSS清除默认样式,聪明人已经收藏了!
- Python3 爬虫实战 — 模拟登陆12306【点触验证码对抗】
- Vrep中将物体变得透明的方法
- Task类的简单介绍
- mysql binlog-row-image=minimal_十一:参数binlog_row_image(笔记)
- 从零开始学 Java - Spring AOP 拦截器的基本实现
- Deconvolutional Networks论文解读
- tomcat配置管理员帐号密码
- 如何使用FreeTextBox
- 仿微信设置字体大小控件
- 模型压缩——重参数化
- 剖析美国大片《西部世界》 嵌入式技术应用新高度
- 2020 中秋、国庆快乐!
- Seata Failed to get available servers: endpoint format should like ip:port 报错原因/解决方案汇总版(看完本文必解决问题)
- 动手创建docker镜像
- 【源码解读】BertLayer
- 4g网络什么时候淘汰_4G网络即将被淘汰?4G手机:我还没过时