分类目录归档:问题解决

使用VS2022编译7zip的控制台程序

7zip除了官方下载安装的图形界面工具之外,是有独立控制台程序的,在CPP\7zip\Bundles里面。这个控制台程序还分为全功能版(7zz)的和精简的(7zr),但官方那边能下载到的只有精简的,全功能的那个要自己编译。

在用VS2022编译全功能版的时候我遇到了问题。虽然官方提供了nmake用的编译脚本,但是它跑起来总是报错,而且报错的地方在Windows SDK里面、而不是7z自己的代码。报的错误是C2279,出现在mapi.h头文件里、诸如“这个typedef地方不能写throw标识符”这样的东西。

网上搜索之后能找到的相关的东西不太多,有一个说法是C++标准的问题,现在的Windows SDK需要配合新版本的C++标准(C++17之类)才能正常使用。看了一下7zip源码里nmake脚本加的参数,也确实没有指定标准。

本来想试试换个旧版的Windows SDK行不行,一看要下载那么多东西……烦了,就没试。最后我的做法是,打开CPP下的Build.mk,找到定义 CFLAGS 的那一行,加个 /std:c++17。文件是只读的,要去掉只读属性才能保存。再编译会变成另外的错误,报异常规范不匹配。最简单的去掉警告视为错误(搜索,去掉-WX)可以编译通过。

另外我发现它没加链接时代码生成这样的优化,暂时不知道为什么。试着开了一下,用7zz b看跑分,和不开看不出区别。

WordPress在后台的“设置——常规”里卡不出来

今天买了新域名之后,就打算把博客给移到新域名上。

服务器的虚拟主机配置很容易,只要修改一下 <VirtualHost> 标签,事情就解决了。但是对于WordPress来说,里面有一些包括页面的链接啊图片等媒体的链接啊,甚至文章里写死的链接,可能还是原来的。我就把整个博客的数据库dump出来,成为包含了大量SQL语句的文本,然后用编辑器的查找替换功能把原来旧域名的字符串替换成新域名的字符串,替换完了再导回去。

为了验证设置,我在博客后台的“设置——常规”里面看了一圈。因为这里包含了WordPress地址和站点地址两个选项。但是我却发现,这个页面加载十分慢,没显示完就卡住不动了。

继续阅读WordPress在后台的“设置——常规”里卡不出来

绿色守护治不了腾讯地图但阻止运行能

安卓手机上,我之前一直在用绿色守护来对付平时使用中不必要的后台程序。在屏幕关闭后几分钟,在绿色守护列表中的程序就会被自动关闭。这样它们就不能一直推送奇奇怪怪的消息给我,以及没有特别深刻体会的据说能够加速手机运行(因为后面跑的服务少了)。

但是在一次批量的程序升级之后,手机出现了奇怪的状况:时不时就振动一下,但是打开发现又没有短信或者通知或者电话。就是振一下、振一下。闹鬼似的。

继续阅读绿色守护治不了腾讯地图但阻止运行能

在*nix挂载Windows下的文件夹

最初是为了学习Unix程序设计的时候,能够更加方便地使用虚拟机:因为我将NetBSD系统安装在虚拟机中。这样的话虽然能够通过FTP等方式传文件,但总之不是那么方便。如果能直接在Windows下共享这个文件夹,然后虚拟机里面用mount挂载的话,就方便很多,文件啥的全就都在Windows下了,平时日常用的是Windows,所以对我来说是方便。

继续阅读在*nix挂载Windows下的文件夹

WindowsDDK里用std::wstring的问题

今天晚上尝试帮某网友制作一个伪春菜的插件,能够检查两次调用过程中剪贴板里面的东西有没有变化(用GetClipboardSequenceNumber函数)和获取剪贴板里的内容(EnumClipboardFormats和GetClipboardData)。这里都不是重点,重点是我用了 这一篇博客 里面提到的CSaori库来编写。这个库里面的字符是wchar_t类型,这很好,也用了std::basic_string<wchar_t>(其实就是std::wstring),这也很好。不好的地方在于,我为了减小最终DLL的体积、用Windows Driver Kit里面的编译器来编译程序使得动态链接到运行库的时候,报错了。

继续阅读WindowsDDK里用std::wstring的问题

MinGW-GCC不支持通配符,make大法好

之前在公司做某个自动测试工具的时候,考虑到程序的灵活性,用了LUA作流程控制(嗯……结果到最后还被技术总监批评了,说工具本来很简单的被搞得复杂了,开始有各种奇怪的依赖了,有欠考虑)。这就需要编译LUA,但是当时公司的VisualStudio可能是配置不正确或者其他什么原因,VS的命令提示符打不开,我也懒得去修,最后用了GCC。装的是TDM-GCC 64位版。

然后呢就遇上了一个比较麻烦的问题:这个版本的GCC不支持通配符。平时我自己用的都是32位版本,新买的电脑虽然装的是64位系统但是一个是没买多久、一个是还没开发过64位程序,所以没搞过64位编译器。现在要编译出来DLL可能要给64位的C#程序调用,所以需要64位的编译器。然后它不能 gcc -shared -olua.dll *.c:出错信息说找不到叫做*.c的文件。以前一直用的32位编译器,对于这样的命令行都能正常运行的……

继续阅读MinGW-GCC不支持通配符,make大法好

.net 2.0下往流输出文本多了抛异常

前天在群里聊天的时候,喵喵提到.net 2.0平台下,有个控制台程序运行时间久了,呃,要说有多久可能一个月那种程度吧,崩了。而且是崩在Console.Write里面。说上网找了以后说是.net平台自己有问题。

第二天有空的时候,我自己试验了一下,确实很坑,我开了个文本文件(FileStream),然后以它创建一个StreamWriter,之后往里面写了三四个G的数据,写一半的时候就直接抛出了异常,异常信息和喵喵描述的一致。

继续阅读.net 2.0下往流输出文本多了抛异常

curl_easy_perform卡着了

之前想做个挂stage1st论坛在线时间的工具,用C#写出来以后虽然用着也确实可以登录和浏览,但是用mono在vps的linux系统上跑,内存占了实在是有点多,想到vps本来内存就这么小,还跑了一大堆奇怪的服务,最后作罢。

但是果然想想还是不甘心,于是就又操起C++来弄,调用了CURL函数库来搞,这样windows和Linux下就都可以使用了。弄好以后也确实可以运行,于是就这么挂着。

为了详细知道这工具现在在干什么,所以我让它输出当前动作的信息。挂了几天之后,发现好像没有新的信息输出了。用gdb附加上去看调用栈,卡在curl_select里面了(和自己的代码的接口是curl_easy_perform)。这个时候的工具在输出信息的时候还不会附上当前的时间,所以也不太确定到底什么时候出的问题。于是我就改了一下代码,在输出的地方加上了时间,然后挂着。今天下午又发现它卡着了,看了时间,卡了2个多小时了。用gdb再附加上去,还是那个地方卡着。

继续阅读curl_easy_perform卡着了