找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 946|回复: 7

【VB6】使用CreateMutex的一个坑爹之处

[复制链接]
发表于 2022-5-9 17:40:11 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有账号?立即注册→加入我们

×
创建互斥体非常简单,网上的C代码一般都是CreateMutex(NULL,0,"name")。比如这位大聪明写的代码:
.png

但如果把这行代码翻译到VB6里,准保能气得你拍桌子,因为你会发现,GetLastError()永远是0。正确的方法是不能偷懒,要填充SECURITY_ATTRIBUTES。
游客,如果您要查看本帖隐藏内容请回复

本帖被以下淘专辑推荐:

回复

使用道具 举报

发表于 2022-5-11 09:51:02 | 显示全部楼层
楼主大能,感谢感谢
回复 赞! 靠!

使用道具 举报

发表于 2022-5-11 20:10:48 | 显示全部楼层
所以在这个地方,使用互斥体仅仅是为了实现“App_PrevInstance()”这个功能?咦……

我一直拿这玩意儿做多线程、多进程交互的一个东西,当锁用,你却拿它来做“App_PrevInstance()”

编程真奇妙啊

点评

要说的话,用原子锁+进程共享变量来实现App_PrevInsance更好,每启动一次进程原子+1,只有自己得到1的时候,就说明是第一个打开的。  发表于 2022-5-26 23:16
对,因为VB自带的那个,有时候不好使。  发表于 2022-5-11 21:16
回复 赞! 靠!

使用道具 举报

发表于 2022-6-17 01:35:27 | 显示全部楼层
我记得没错的话VB6调用GetLastError为0,那是因为Declare内部会有别的代码调用,会导致LastError被覆盖问题,所以每次调用Declare的API的时候VB6都会提前调用GetLastError保存到Err.LastDllError上,所以正确的做法是:
一、用Err.LastDllError代替GetLastError。
二、用tlb声明API(包括GetLastError本身)
回复 赞! 靠!

使用道具 举报

发表于 2024-1-22 17:51:06 | 显示全部楼层
难怪老马的多线程例子,怪怪的,原来是这个原因
回复 赞! 靠!

使用道具 举报

发表于 2024-6-1 16:26:26 | 显示全部楼层
看看
回复

使用道具 举报

本版积分规则

QQ|Archiver|小黑屋|技术宅的结界 ( 滇ICP备16008837号 )|网站地图

GMT+8, 2024-6-14 07:55 , Processed in 0.039314 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表