【自荐开源】Catime — 仅 800KB、纯 C 编写的超轻量计时工具,4k Star + GIF 动图托盘显示,提升你的时间管理效率!

看了你的源代码,这个单实例 HandleSingleInstance 里有些地方我还是没看懂,为什么要用 WaitForSingleObject 去等待一个已经存在的互斥体,超时后还换个名字自己再创建一个? 这是作者有什么特别的设计意图吗?下面是我连续启动软件多次后稳定下来的截图,明确说明这样设计是存在漏洞的。

1770967885454_%E5%B0%8FQ%E6%88%AA%E5%9B%BE-20260213142033

if (GetLastError() == ERROR_ALREADY_EXISTS) {
    WaitForSingleObject(hMutex, 3000);
    
    wchar_t uniqueMutexName[128];
    _snwprintf_s(uniqueMutexName, 128, L"CatimeMutex_%lu", GetTickCount());
    *outMutex = CreateMutex(NULL, TRUE, uniqueMutexName);
    
    return TRUE;
}

作者可能是担心 CatimeMutex 这个名字不够独特,万一别的软件也用了这个名字,会导致自己的程序被误判为重复实例,所以才设计了一套“名字不够独特就换一个”的兜底逻辑。但这个担忧其实没有必要,用 CreateMutex 做单实例是业界通用做法,加上作者名或产品名前缀 (如 vladelaina_CatimeMutex )就足以避免冲突,不需要在运行时动态改名。

而这里的问题在于:互斥体存在的意义是阻止第二个实例运行,但你的做法是等不到就换个名字继续创建,相当于自己把锁拆了。建议删掉 WaitForSingleObjectuniqueMutexName 这一整段,互斥体存在就直接返回 FALSE,让进程退出,不需要任何兜底,如果想在启动第二个实例的时候提醒用户,可以激活当前正在运行实例的窗口并弹出一个提示,这样就最好了。

祝你的软件越做越好!希望以上的建议能够给你一点启发。

2 个赞

佬新年快乐呀~
新版本发布后面发现一堆bug,今年的bug明年再修,哈哈哈哈哈哈
PPSU@(G0JBRTA2AUU31CZM

1 个赞

新年快乐 :tada:

1 个赞

佬看看这个,就是我自己的电脑好像复现不了,不确定这个修改是否有效

1 个赞

哈哈哈哈哈哈哈,猜猜为啥弄成32位的 :wink:

1 个赞

距离上一个版本发布已经过去三个月了,这段时间在捣鼓新项目((っ °Д °;)っ不捣鼓就要饿死了,),新项目也快发布了,到时候一块把catime新版本也给发一下

1 个赞

刚下 动画是空的,网友们分享些好玩的GIF

1 个赞

试用了下就常驻了,祝楼主的软件越做越好!

试试这个,哈哈哈哈哈哈