动态链接DLL需要与它的调用者

问题描述:

共享全局变量我有一个静态库libStatic定义这样动态链接DLL需要与它的调用者

头文件libStatic/globals.h一个全局变量:

extern int globvar; 

代码文件libStatic/globals.cpp

int globvar = 42; 

的DLL libDynamic和可执行文件运行程序正在使用此全局变量。 Furtheron,libDynamic在运行时链接到亚军(通过LoadLibrary()GetProcAddress()和作品......)

我明白这将导致globvar创建两次,一次在亚军的堆和一次在libDynamic堆,这当然是非常不可取的。

这是否有很好的解决方法?我如何确保libDynamic转轮正在使用相同的globvar

+0

您是否必须使用全局变量?也许你可以想出一个更好的方法来传递这种状态? – wheaties 2010-05-12 14:14:10

+0

示例简化了很多不过分复杂的问题。实际上,它不仅仅是一个简单的int变量,而是一个复杂的单例对象。我正在寻找一种方法来确保单例在应用程序和动态库的组合范围内仅存在一次。 – fawick 2010-05-12 14:25:51

一个简单的方法是让.DLL指向可执行文件的全局变量。在加载之后,您会在该库内调用一个特殊函数(如SetGlobVar(int*))。这样,库将始终指向与.EXE相同的全局变量。

+1

我很害怕我会得到这个答案......虽然它是100%正确的,但我不喜欢这种需要,如果它存在,我更喜欢更优雅的方式。 – fawick 2010-05-12 17:12:02

+0

将全局变量移动到单独的模块(dll)中,该模块可以通过两者动态链接(NOT runtime linked!动态链接)。对于全局变量,使用[俏皮计数器模式](https://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Nifty_Counter)。这可能是你需要的矫枉过正,但这是basic_iostream库创建cout和它的朋友的方式。 – 2016-05-24 11:48:17