我有一个C ++ windows应用程序,它由几个DLL组成。
我想要某种类型的池,我将从中获取对象,但是以某种方式来说这个池
将在所有DLL中提供
所以我把它放在一个“公共”的dll中,任何人都可以访问并在头文件中定义它,如下所示:
static Pool globalPool;
我确实可以从每个dll访问,但是这个池创建了很多次 我认为它发生在我的每个DLL和每个文件中,包括带有定义的头文件。
我该怎么做呢? 谢谢:))
答案 0 :(得分:2)
对象的static
声明使对象成为编译单元的本地对象。
通过使用static
,您将在包含标题的每个编译单元中创建一个globalPool
对象(变量)。
但是,做你想做的事情的方法不仅仅是删除static
。
而是定义一个提供对池的访问权限的函数(例如对它的引用),并从池DLL中导出该函数或一组函数。
或更好 - 更多更好 - 忘记这个想法。这通常是个糟糕的主意。但是,如果你真的想这样做,并且看不到任何替代方案,那么上面是如何做到的。
如果你这样做,也许可以考虑线程安全。
或许要注意,动态加载Windows DLL并不适用于编译器对线程局部变量的支持。
干杯&第h。,
答案 1 :(得分:1)
在头文件中,您需要
extern Pool globalPool;
然后在Common dll中的.cpp文件中,您需要
Pool globalPool;
extern声明将把它放在包含模块的命名空间中,链接器会将它解析为公共dll中的对象。
答案 2 :(得分:0)
你需要一个看起来像这样的头文件:
// Common.h
#pragma once
#ifdef COMMON_BUILD
// When building Common.dll, want to export the definition of Pool
#define COMMON_EXPORT __declspec(dllexport)
#else
// When using Common.dll, want to import the definition of Pool
#define COMMON_EXPORT __declspec(dllimport)
#endif
// Declarations of shared globals
struct COMMON_EXPORT Pool {
static int data1;
static int data2;
};
(有关dllimport
和dllexport
内容的详情,请参阅http://msdn.microsoft.com/en-us/library/3y1sfaz2.aspx和http://msdn.microsoft.com/en-us/library/81h27t8c.aspx)
然后在你的DLL构建中,你需要一个像这样的源文件:
// Common.cpp
#define COMMON_BUILD
#include "Common.h"
int Pool::data1 = 0;
int Pool::data2 = 0;
然后,使用它的所有DLL和EXE都应"#include Common.h"
并与Common DLL链接,然后它们可以使用Pool::data1
等。