You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在DLL函数间共享变量?WriteConsole_Hook无法识别结构体true值问题

问题根因排查
  • 进程隔离导致全局变量副本独立(90%以上概率是该问题)

    你定义的ffmpeg_struct是DLL的全局变量,DLL被加载到不同进程时,每个进程会持有独立的全局变量内存副本,数据完全不互通。
    CreateProcessW_Hook的执行上下文是调用CreateProcess创建ffmpeg的父进程,你设置的ffmpeg_console = true仅存在于父进程的DLL副本中。而WriteConsole_HookHook的是ffmpeg子进程的API,子进程加载的DLL里的ffmpeg_struct是初始默认的false值,自然判断不生效。

  • 编译器优化导致变量值未同步
    全局变量没有加volatile修饰也无同步锁保护时,多线程场景下编译器可能会把变量值缓存到寄存器,WriteConsole_Hook读取到的是寄存器中存储的旧值。你可以把结构体成员定义修改为volatile bool ffmpeg_console;临时验证是否是该问题。
  • 执行时序问题
    即使你加了Sleep(100),仍然有可能出现ffmpeg子进程启动后快速触发WriteConsole调用,早于父进程中ffmpeg_console = true的赋值操作执行。
  • 变量链接属性错误
    如果你把ffmpeg_struct的定义放在头文件中,多个cpp文件引用该头文件时会生成多个独立的变量副本,需要把定义放在cpp文件中,头文件仅保留extern声明。
修复方案

如果确认是进程隔离导致的问题,两种常用修复方案:

  1. 改用共享内存存储ffmpeg_console标记,父子进程都可以读写该共享内存同步状态
  2. 直接在子进程加载的DLL的DllMain入口中判断当前进程名是否为ffmpeg.exe,匹配后直接给当前进程的ffmpeg_struct.ffmpeg_console赋值,无需走父进程状态传递,实现更简单。

内容的提问来源于stack exchange,提问作者user14761342

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 23:36:03