有时候想快速写一段C++代码来验证某个功能,感觉使用VS就过于重量级了,关键是衣服自己洗比较洁癖,不喜欢看到有无用的工程项目。所以一直想有一个轻量级的编辑器可以快速编译验证。
于是衣服自己洗发现了CodeLite 和 CodeBlock这2个跨平台,相对轻量的工具。
使用过程中,发现CodeLite的命令行输出中中文显示乱码,一开始还以为自己是软件没有安装好,重新下载安装还是不行。后来经过一番搜索,网上观点认为是 G++ 的问题,需要额外添加编译选项。
选择工程项目,右键属性,切换到Compiler,在 C++ Compile Options 里添加一个选项 -fexec-charset=GBK; 即可。其实还可以把这个配置单独新增进去,以后就只用勾选就可以了。
特别需要说明,设置完成后,需要把项目清理重新编译,不然看不到效果,衣服自己洗在这里被坑了好几次了。
最近在使用爬虫抓取数据并保存到本地目录中,并且会时不时点进去看看,看着文件数量的不断增长,衣服自己洗得到了极大的满足感。由于数据量比较大,每次进入文件夹,资源管理器都会比较卡。
所以衣服自己洗就想有没有什么方式可以仅仅查看文件数量的变化。经过一番搜索,发现 PowerShell 脚本可以满足,并且还可以使用Net Framework的内容,真是为powershell点赞。
脚本内容如下:
[System.DateTime]::Now.ToString() + ” ” + [System.IO.Directory]::GetFiles(‘L:\tmp’).Count
C#对于窗体居中很简单,只需要简单设置一个属性就可以了,但是对于C++,还需要额外的写点代码。下面是衣服自己洗分享的代码,可以直接拷贝到项目中。
inline static BOOL CenterWindow(HWND hwndWindow,bool isDesktopParent = true)
{
HWND hwndParent;
RECT rectWindow, rectParent;
hwndParent = isDesktopParent ? GetDesktopWindow() : GetParent(hwndWindow);
//make the window relative to its parent
if (hwndParent != nullptr)
{
GetWindowRect(hwndWindow, &rectWindow);
GetWindowRect(hwndParent, &rectParent);
int nWidth = rectWindow.right – rectWindow.left;
int nHeight = rectWindow.bottom – rectWindow.top;
int nX = ((rectParent.right – rectParent.left) – nWidth) / 2 + rectParent.left;
int nY = ((rectParent.bottom – rectParent.top) – nHeight) / 2 + rectParent.top;
int nScreenWidth = GetSystemMetrics(SM_CXSCREEN);
int nScreenHeight = GetSystemMetrics(SM_CYSCREEN);
//make sure the window never moves outside of the screen
if (nX < 0) nX = 0;
if (nY < 0) nY = 0;
if (nX + nWidth > nScreenWidth) nX = nScreenWidth – nWidth;
if (nY + nHeight > nScreenHeight) nY = nScreenHeight – nHeight;
MoveWindow(hwndWindow, nX, nY, nWidth, nHeight, FALSE);
return TRUE;
}
return FALSE;
}
衣服自己洗使用jsoncpp来解析项目中使用的json字符串,后来发现一个问题就在于jsoncpp 不支持unicode编码的中文字符。
网上搜索了一下,一种比较弱侵入性的方法如下:
打开json_tool.h文件,找到 codePointToUTF8 方法,修改 else if (cp <= 0xFFFF) 代码段里的内容,添加额外的处理。
//添加中文unicode编码
if((cp >= 0x4E00 && cp <= 0x9FA5) || (cp >= 0xF900 && cp <= 0xFA2D))
{
wchar_t src[2] = { 0 };
char dest[5] = { 0 };
src[0] = static_cast<wchar_t>(cp);
std::string local = setlocale(LC_ALL, NULL);
setlocale(LC_ALL, “chs”);
wcstombs_s(NULL, dest, 5, src, 2);
result = dest;
setlocale(LC_ALL, local.c_str());
}
//下面 else 里代码为原始代码
else
{
result.resize(3);
result[2] = static_cast<char>(0x80 | (0x3f & cp));
result[1] = static_cast<char>(0x80 | (0x3f & (cp >> 6)));
result[0] = static_cast<char>(0xE0 | (0xf & (cp >> 12)));
}
然后重新编译即可。
最近工作中衣服自己洗有碰到一个调用dll的问题,错误代码是HRESULT: 0x80131515 。
后来发现是dll权限的问题,对于调用失败的dll,鼠标点击右键,属性。如果发现底部有“解除锁定”的复选框,勾选复选框,然后确定即可。
产生问题的原因是操作系统提高了安全性,二进制文件如果从网络上下载回来的话,就可能会有该标记,如果不解除直接调用的话,就会产生HRESULT: 0x80131515 错误。
衣服自己本来是想使用log4cxx\log4cpp\log4cplus这样的库来作为日志库的,但是无论那个都无法集成,一堆的问题,于是衣服自己洗一番搜索后,发现spdlog 是一个速度非常快的C++开源库,线程安全。
这个库有一个特点就是全部都是头文件,没有cpp文件,直接引用即可。
使用VS2015添加了include文件引用后,编译报错。
错误 C2589 “(”:“::”右边的非法标记
参考了一下,发现是和系统的命名冲突,解决方法也很简单。
打开 format.h 文件,找到 int compare(BasicStringRef other) const 方法,将 std::size_t size = std::min(size_, other.size_) 修改为 std::size_t size = (std::min)(size_, other.size_),然后重新编译即可。
最近几天发现网站数据没有变化,还以为是数据同步发生了错误,今天登录服务器,日志显示了大量的未能为数据库 ‘*’中得对象’*’分配空间,因文件组’PRIMARY’已满错误。
网上搜索发现是数据库文件的体积有限制导致,后来发现数据库原来是在虚拟主机运行的,运营商对数据库做了限制,而我迁移到自己的服务器上后直接附加的数据库,所以这个限制也一起带过来了。
解决方法也比较简单,选择数据库,右键属性, 在“文件”标签页里设置数据库为不受限制,确定即可。
在办公环境下,衣服自己洗使用了双显示屏以方便写代码,相信各位都懂的。
我想给我的大屏幕设置一个单独的桌面壁纸,想起来应该有软件可以实现这样的要求,今天这里给大家分享一个系统内置的简单方法。
首先,把需要设置为桌面背景的图片都放到一个文件夹里,
然后可以全选所有图片,在需要设置背景的那张图片上,点击右键,选择“设置为桌面背景”,这样不同的桌面背景就可以生效了。
在衣服自己洗的香蕉派上,有安装sox去播放音频文件,最近在使用play命令播放mp3文件时,提示错误信息为:
play FAIL formats: no handler for file extension ‘mp3’
原因在于mp3解码是有版权风险的,所以使用apt-get安装sox默认是不支持的,一种解决方法是编译带参数安装sox,我觉得很麻烦,于是找到第二种方法。
sudo apt-get install libsox-fmt-mp3
这样就可以使用 play 播放了。此外,还可以使用 libsox-fmt-all 来支持尽可能多的音频格式。
最近衣服自己洗在开发过程中遇到一个需求就是在不修改电源管理选项的情况下,阻止系统进入休眠状态。和我们的需求比较类似的是视频播放器,在播放视频的时候,即使用户没有操作电脑,也会阻止休眠。退出播放器后,系统又正常了。
实现起来不太复杂,我们可以利用系统的API函数:SetThreadExecutionState
这个函数只有一个参数,可以选择3个值,当然值可以组合使用
只使用Continus参数时,则是恢复系统休眠策略。
不使用Continus参数时,实现阻止系统休眠或显示器关闭一次。
组合使用Continus参数时,实现阻止系统休眠或显示器关闭至线程终止。
C#的示例代码如下:

看着很简单,对不对。当然,如果不需要阻止显示器的关闭,则可以不传递 Display 参数即可。