如何在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声明。
修复方案
如果确认是进程隔离导致的问题,两种常用修复方案:
- 改用共享内存存储
ffmpeg_console标记,父子进程都可以读写该共享内存同步状态 - 直接在子进程加载的DLL的
DllMain入口中判断当前进程名是否为ffmpeg.exe,匹配后直接给当前进程的ffmpeg_struct.ffmpeg_console赋值,无需走父进程状态传递,实现更简单。
内容的提问来源于stack exchange,提问作者user14761342
相关产品推荐
相关产品推荐

