qzuser123ss 发表于 前天 16:45

关于dll自动卸载的问题

我现在遇到了一个问题,我给别人写了一个插件,这个插件是dll文件。


dll被加载后会被调用,调用后会在dll内部启动一个线程,这个线程指向的函数是一个死循环,现在出现的问题就是他们的系统关闭后由于dll里面的循环没退出导致程序无法退出。我在dll里面怎么捕捉结束退出信号?能捕捉到这个信号我就可以停止循环变量了

GodAnubis 发表于 前天 17:11

启动有状态线程:噜阿噜

570152847 发表于 前天 17:46

试试在DLL_PROCESS_DETACH中设置退出信号, 在死循环中检测 跳出循环

urenai 发表于 前天 20:28

570152847 发表于 2025-12-10 17:46
试试在DLL_PROCESS_DETACH中设置退出信号, 在死循环中检测 跳出循环

你这个办法时唯一的。

唯二的办法就是 直接 终止进程

qzuser123ss 发表于 昨天 15:29

570152847 发表于 2025-12-10 17:46
试试在DLL_PROCESS_DETACH中设置退出信号, 在死循环中检测 跳出循环

火山编程怎么使用这个呢?我看这个好像是一个dll函数

qzuser123ss 发表于 昨天 15:36

qzuser123ss 发表于 2025-12-11 15:29
火山编程怎么使用这个呢?我看这个好像是一个dll函数

火山编程怎么使用这个呢?我看这个好像是一个dll函数

Xelloss0618 发表于 昨天 15:47

<火山程序 类型 = "通常" 版本 = 1 />

类 启动类 <公开 基础类 = 动态库程序类>
{
    变量 线程 <类型 = 线程类>

    方法 启动方法 <公开 类型 = 整数>
    {
      线程.启动 ()
      返回 (1)
    }

    方法 将被卸载 <公开 @虚拟方法 = 可覆盖>
    {
      线程.停止 ()
      父对象.将被卸载 ()// 调用基础类中的被覆盖虚拟方法
    }

    方法 线程类_线程运行 <接收事件 类型 = 整数>
    参数 来源对象 <类型 = 线程类>
    参数 标记值 <类型 = 整数>
    {
      如果 (来源对象 == 线程)
      {
            判断循环 (来源对象.是否需要退出 (1000) == 假)
            {
                // 循环执行代码

            }
      }
      返回 (0)
    }
}

qzuser123ss 发表于 昨天 15:48

Xelloss0618 发表于 2025-12-11 15:47


类 启动类


也就是我把这个类设为全局类,然后对方调用的方法里面启动这个线程,外部结束时这个类会收到被卸载的通知?

Xelloss0618 发表于 昨天 18:27

qzuser123ss 发表于 2025-12-11 15:48
也就是我把这个类设为全局类,然后对方调用的方法里面启动这个线程,外部结束时这个类会收到被卸载的通知 ...

主要看启动类里的“将被卸载”,DLL被卸载时会执行里面的方法,你在里面结束线程就行了。
结束线程的方法很多,我这里用线程类只是提供一个思路。
页: [1]
查看完整版本: 关于dll自动卸载的问题