DLL A中基类有静态数组变量 A中派生类 和 DLL B中派生类把自己添加到数组中 DLL B中的数组是拷贝一份的 怎样合成一份?

ssbelle 2014-03-25 08:49:27
不好意思 我都不知道怎么在标题里描述清楚 还是请大家看详细内容:

我有三个DLL
DLL A定义了一个Factory 即一个标准库的map 把类的Create函数和类名绑定在一起
DLL B定义了一个基类 基类中包含一个静态的Factory变量 在DLL B中也有一些派生类 这些类的类名和Create函数添加到静态变量中
DLL C也定义了一些派生类 把这些类的类名和Create函数也添加到了基类的Factory变量里

但是在应用程序里生成DLL C中定义的派生类时 通过Factory来创建是失败的 因为Factory的map里只有DLL B的相关派生类数据 我跟进去看了一下 发现DLL B中和DLL C中各生成了一个Factory的变量 而且它们是独立的 我现在需要的是 不管几个DLL 凡是从基类派生出来的类 都是放在同一个Factory静态变量里边 而不是每个DLL会有独立的变量

谢谢大家
...全文
598 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
schlafenhamster 2014-03-30
  • 打赏
  • 举报
回复
你要是菱形 继承, 就要用 virtual public
ssbelle 2014-03-30
  • 打赏
  • 举报
回复
引用 13 楼 ssbelle 的回复:
[quote=引用 12 楼 schlafenhamster 的回复:] 是不是要 virtual public ?
能说详细一些吗 谢谢[/quote] 查了一下 好像不是这个原因。。。。。
ssbelle 2014-03-30
  • 打赏
  • 举报
回复
引用 12 楼 schlafenhamster 的回复:
是不是要 virtual public ?
能说详细一些吗 谢谢
schlafenhamster 2014-03-29
  • 打赏
  • 举报
回复
是不是要 virtual public ?
ssbelle 2014-03-28
  • 打赏
  • 举报
回复
顶起 请大家看一下 谢谢
ssbelle 2014-03-27
  • 打赏
  • 举报
回复
引用 8 楼 VisualEleven 的回复:
Win32 DLL 映射到调用进程的地址空间中。默认情况下,每个使用 DLL 的进程都有自己的所有 DLL 全局变量和静态变量的实例。如果 DLL 需要与它的由其他应用程序加载的其他实例共享数据,则可使用下列方法之一: 使用 data_seg ()创建命名数据节。 使用内存映射文件。 http://blog.csdn.net/uvbs/article/details/1691993
所有的DLL都是在一个应用程序里调用 这样算是在一个进程里边的吧?
ssbelle 2014-03-27
  • 打赏
  • 举报
回复
引用 7 楼 oyljerry 的回复:
[quote=引用 5 楼 ssbelle 的回复:] 从网上查阅的资料来看 在同一个进程里边 应该只有一份静态变量 为什么我这里变成了两份。。。?
Variables that are declared as global in a DLL source code file are treated as global variables by the compiler and linker, but each process that loads a given DLL gets its own copy of that DLL's global variables. The scope of static variables is limited to the block in which the static variables are declared. As a result, each process has its own instance of the DLL global and static variables by default. http://msdn.microsoft.com/en-us/library/windows/desktop/ms682594%28v=vs.85%29.aspx[/quote] 你好 我所有的DLL都是在一个exe里边调用的 这样应该只有一个进程 不存在多个进程的情况啊?
Eleven 2014-03-27
  • 打赏
  • 举报
回复
Win32 DLL 映射到调用进程的地址空间中。默认情况下,每个使用 DLL 的进程都有自己的所有 DLL 全局变量和静态变量的实例。如果 DLL 需要与它的由其他应用程序加载的其他实例共享数据,则可使用下列方法之一: 使用 data_seg ()创建命名数据节。 使用内存映射文件。 http://blog.csdn.net/uvbs/article/details/1691993
oyljerry 2014-03-27
  • 打赏
  • 举报
回复
引用 5 楼 ssbelle 的回复:
从网上查阅的资料来看 在同一个进程里边 应该只有一份静态变量 为什么我这里变成了两份。。。?
Variables that are declared as global in a DLL source code file are treated as global variables by the compiler and linker, but each process that loads a given DLL gets its own copy of that DLL's global variables. The scope of static variables is limited to the block in which the static variables are declared. As a result, each process has its own instance of the DLL global and static variables by default. http://msdn.microsoft.com/en-us/library/windows/desktop/ms682594%28v=vs.85%29.aspx
ssbelle 2014-03-27
  • 打赏
  • 举报
回复
我又梳理了一下 可以认为这样 在DLL A中定义的基类 基类中定义了static的一个变量X 该变量类型是在DLL C中定义的 包含一个map 在DLL A中定义了一些该基类的派生类 这些派生类在生成时就在X中的map插入一个函数指针 在DLL B中定义了一个该基类的派生类 该派生类同样在生成时就在X中的map插入一个函数指针 在应用程序中加载时 会自动把所有派生类的指针都插入到map中 这个时候看到 DLL A中定义的派生类 指针插入到一个map里 DLL B中定义的派生类 指针插入到另一个map里 就相当于说 变量X生成了两份 而我希望是同一份 这样说能说清楚吗。。。?
ssbelle 2014-03-27
  • 打赏
  • 举报
回复
从网上查阅的资料来看 在同一个进程里边 应该只有一份静态变量 为什么我这里变成了两份。。。?
ssbelle 2014-03-27
  • 打赏
  • 举报
回复
引用 3 楼 oyljerry 的回复:
[quote=引用 2 楼 ssbelle 的回复:] 谢谢 我又仔细看了一下 DLL B只是定义了一个static的Factory类的指针 初始化的时候实例化 实例化是在DLL A中实现的 向Factory里添加map的item是调用的DLL A的相关函数 只是通过宏定义来实现的 不需要显示调用 DLL B和DLL C都有向map里insert 但是实际上DLL B和DLL C不是同一个实例 是各自独立的 如果不改变这种结构又能实现相应功能呢
把全局放共享数据段[/quote] ============================================== 我的变量是类成员变量 共享数据段编译不能通过 我的程序调用了DLL B和C DLL B和C 使用了DLL A中定义的类S S中定义了一个静态变量 这个变量只有在该程序的线程内调用 DLL B和C 加载DLL A的时候 对静态变量各生成了一份拷贝 静态变量是在DLL A的C++类中 从网上查阅的资料 做共享数据段都是全局变量 请问这种情况怎么办? 谢谢。
oyljerry 2014-03-25
  • 打赏
  • 举报
回复
引用 2 楼 ssbelle 的回复:
谢谢 我又仔细看了一下 DLL B只是定义了一个static的Factory类的指针 初始化的时候实例化 实例化是在DLL A中实现的 向Factory里添加map的item是调用的DLL A的相关函数 只是通过宏定义来实现的 不需要显示调用 DLL B和DLL C都有向map里insert 但是实际上DLL B和DLL C不是同一个实例 是各自独立的 如果不改变这种结构又能实现相应功能呢
把全局放共享数据段
ssbelle 2014-03-25
  • 打赏
  • 举报
回复
谢谢 我又仔细看了一下 DLL B只是定义了一个static的Factory类的指针 初始化的时候实例化 实例化是在DLL A中实现的 向Factory里添加map的item是调用的DLL A的相关函数 只是通过宏定义来实现的 不需要显示调用 DLL B和DLL C都有向map里insert 但是实际上DLL B和DLL C不是同一个实例 是各自独立的 如果不改变这种结构又能实现相应功能呢
oyljerry 2014-03-25
  • 打赏
  • 举报
回复
有DLL A来维护map和提供一个函数func,DLL B,C都调用func,来把需要的类添加到A中。这样就只有A有一份

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧