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副本,自然输出不符合预期。
修复步骤
- 修改头文件声明:在
Project.h中用extern声明共享变量,避免重复定义:
typedef struct { HWND hWnd; WINDOWPLACEMENT wp; } WTSTARTINFO, LPWTSTARTINFO; // 声明共享变量,告知所有编译单元该变量存在 extern WTSTARTINFO wtsi[5];
- 在单个.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")
- 保留DEF文件配置(可选):你原来在DEF文件中的
SECTIONS声明可以保留,和#pragma comment的作用一致,双重保障共享段的读写权限。
验证效果
修改后,file1.cpp和file2.cpp中的wtsi会指向同一个共享内存地址:
- 调用file1的导出函数修改
wtsi[0].hWnd后,file2的导出函数读取时会得到正确的0x00000016值。
内容的提问来源于stack exchange,提问作者Vince_Fatica
相关产品推荐
相关产品推荐

