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

Windows DLL共享内存段无法被项目所有CPP文件访问?

问题原因及解决方案

核心问题:static关键字导致变量作用域隔离

你在共享数据段中声明wtsi时使用了static修饰符,这是问题的关键:

  • 在C++中,static修饰全局变量会将其作用域限制在**当前编译单元(.cpp文件)**内。
  • 由于Project.h被所有.cpp文件包含,每个.cpp(file1.cpp、file2.cpp)都会生成一个独立的wtsi实例——它们名字相同,但内存地址完全不同。
  • 因此file1.cpp中修改的是自己编译单元的wtsi,而file2.cpp读取的是自己编译单元里初始化为0的wtsi副本,自然输出不符合预期。

修复步骤

  1. 修改头文件声明:在Project.h中用extern声明共享变量,避免重复定义:
typedef struct
{
    HWND hWnd;
    WINDOWPLACEMENT wp;
}
WTSTARTINFO, LPWTSTARTINFO;

// 声明共享变量,告知所有编译单元该变量存在
extern WTSTARTINFO wtsi[5];
  1. 在单个.cpp文件中定义共享变量:选择任意一个.cpp(比如file1.cpp),将变量定义放入共享段,确保全局唯一:
#include "stdafx.h"

// 仅在一个编译单元中定义共享变量,并放入.shared段
#pragma data_seg(".shared")
WTSTARTINFO wtsi[5] = {0};
#pragma data_seg()
#pragma comment(linker, "/SECTION:.shared,RWS")
  1. 保留DEF文件配置(可选):你原来在DEF文件中的SECTIONS声明可以保留,和#pragma comment的作用一致,双重保障共享段的读写权限。

验证效果

修改后,file1.cpp和file2.cpp中的wtsi会指向同一个共享内存地址:

  • 调用file1的导出函数修改wtsi[0].hWnd后,file2的导出函数读取时会得到正确的0x00000016值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 01:50:10