关于动态链接库的问题?

时间:2022-01-12 22:19:13
假如甲写了个test.dll,乙也写了个test.dll.
2个dll中都有一个同名共享数据,如下
#pragma data_seg("segtest")
   int g_test = 0;
#pragma data_seg()

SETCTIONS
 segtest READ WRITE SHARED

请问,系统调用这两个DLL时,会冲突吗?

15 个解决方案

#1


两个dll其他部分不同

#2


我认为不会

#3


不会造成冲突,因为两个dll本身的内存空间就不一样。

#4



我有三个三角了
鼓励一下自己
:)

#5


应该不会。

#6


应该映射进不同的虚拟地址,不会冲突,(最好自己试验一下)

#7


嗯,等我实践了告诉大家:)

#8


只有一个副本,是存在冲突的危险。它经常被用来判断加载次数等.

#9


如果在DLL中使用一般的全局变量,则存在多个副本。

使用
#pragma data_seg("segtest")
   int g_test = 0;
#pragma data_seg()

SETCTIONS
 segtest READ WRITE SHARED
的目的就是只维护一个副本.

#10


当第二个dll载入内存时,不会和第一个dll同样的地址空间,即使名字相同!所以共享数据段的地址都不同,应该不会冲突

#11


GZ

#12


gz

#13


该变量的内存地址:

address = ::GetModuleHandle(szModuleName) + virtualAddress;

#14


to:nightsuns(nightsuns) 

一个进程调用的2个DLL,szModuleName能相同吗?

你的意思是2个不同进程分别调用这2个DLL时,不会冲突,对吧

#15


不好意思,现在才说:
1。Q:假如甲写了个test.dll,乙也写了个test.dll.
   2个dll中都有一个同名共享数据,如下
   #pragma data_seg("segtest")
   int g_test = 0;
   #pragma data_seg()

   SETCTIONS
      segtest READ WRITE SHARED

  并且分别有函数changeData甲(),changeData乙(),来修改2个DLL中g_test的值.

  两个进程分别调用这两个DLL时,g_test,get_g_test甲(),changeData乙()会不会冲突?

   A:两个进程分别调用这两个DLL时,不会冲突

2。Q:当一个进程同时调用这两个DLL时(将2个DLL分别改名为testA.dll,testB.dll),会不会冲突?
   A:changeData甲(),changeData乙()修改的是各自的g_test,不会冲突

总结:无论如何,进程调用的不同DLL(包括仅名字不同的DLL,或仅所在目录不同的DLL)中的数据、函数是不会冲突的。

欢迎指点!

#1


两个dll其他部分不同

#2


我认为不会

#3


不会造成冲突,因为两个dll本身的内存空间就不一样。

#4



我有三个三角了
鼓励一下自己
:)

#5


应该不会。

#6


应该映射进不同的虚拟地址,不会冲突,(最好自己试验一下)

#7


嗯,等我实践了告诉大家:)

#8


只有一个副本,是存在冲突的危险。它经常被用来判断加载次数等.

#9


如果在DLL中使用一般的全局变量,则存在多个副本。

使用
#pragma data_seg("segtest")
   int g_test = 0;
#pragma data_seg()

SETCTIONS
 segtest READ WRITE SHARED
的目的就是只维护一个副本.

#10


当第二个dll载入内存时,不会和第一个dll同样的地址空间,即使名字相同!所以共享数据段的地址都不同,应该不会冲突

#11


GZ

#12


gz

#13


该变量的内存地址:

address = ::GetModuleHandle(szModuleName) + virtualAddress;

#14


to:nightsuns(nightsuns) 

一个进程调用的2个DLL,szModuleName能相同吗?

你的意思是2个不同进程分别调用这2个DLL时,不会冲突,对吧

#15


不好意思,现在才说:
1。Q:假如甲写了个test.dll,乙也写了个test.dll.
   2个dll中都有一个同名共享数据,如下
   #pragma data_seg("segtest")
   int g_test = 0;
   #pragma data_seg()

   SETCTIONS
      segtest READ WRITE SHARED

  并且分别有函数changeData甲(),changeData乙(),来修改2个DLL中g_test的值.

  两个进程分别调用这两个DLL时,g_test,get_g_test甲(),changeData乙()会不会冲突?

   A:两个进程分别调用这两个DLL时,不会冲突

2。Q:当一个进程同时调用这两个DLL时(将2个DLL分别改名为testA.dll,testB.dll),会不会冲突?
   A:changeData甲(),changeData乙()修改的是各自的g_test,不会冲突

总结:无论如何,进程调用的不同DLL(包括仅名字不同的DLL,或仅所在目录不同的DLL)中的数据、函数是不会冲突的。

欢迎指点!