易语言自带的许可证,应该是CriticalSection,(临界区)或(关键段),这是一个用户对象,不能实现跨进程加锁
跨进程加锁,就需要内核对象
sn_CreateMutex (0, 0, “独一无二的名字”)
创建一个命名互斥体,如果后续用同一个名字创建,会返回同一个
内核对象,不属于任何进程,不像用户对象,进程销毁了,关联的用户对象(窗口)就一定会销毁
每个内核对象内部有一个计数,归零的时候才会销毁,(打开就+1,关闭就-1)
每个内核对象,还有一个状态标识:信号量
ReleaseMutex,可以让一个Mutex,从无信号,变成有信号,(这个好像,有点反人类……字面意思反的)
WaitForSingleObject,可以等待一个对象,直到对象有信号才返回,同时会把这个对象,从有信号变成没有信号,这样其他线程就等不到了,直到ReleaseMutex
还可以通过下面的代码来禁止多开:
.版本 2
.支持库 spec
.程序集 窗口程序集_启动窗口
.程序集变量 hMtx, 整数型
.子程序 __启动窗口_创建完毕
hMtx = sn_CreateMutex (0, 0, “独一无二的名字”)
.如果 (sn_WaitForSingleObject (hMtx, 0) ≠ 0)
信息框 (“禁止多开”, 0, , )
结束 ()
.否则
调试输出 (“允许运行”)
.如果结束