2010-11-03 71 views
1

我有一個由多個DLL組成的C++ Windows應用程序。 我想從某種類型的池中獲取對象,但通過這種池 在所有DLL中都可用。
因此,我把它放在一個「Common」dll中,這個人可以訪問它,並在頭文件中定義它,如下所示:
static Pool globalPool;整個應用程序的變量

我確實可以訪問每個dll,但是這個池創建了許多次。
我認爲它發生在我的每個DLL和每個包含帶定義的頭文件的文件中。

我該如何正確地做到這一點? 謝謝:)

+0

休閒全球已經eeeevil。我不想爲此發明一個新詞,所以忘了它,好嗎? :) – delnan 2010-11-03 20:09:54

+5

@delnan。每當有人問一個很難回答的聰明問題時,人們開始說「忘掉它」。是的,如果這是一種不好的風格,這是一種不好的風格,應該指出,但只有你有更好的選擇建議。如果巧妙地使用globals並不是邪惡的 – 2010-11-03 20:12:05

+0

@deInan - 幾乎聽起來像ASP.NET中的Session對象,af * @ cking噩夢...... – brumScouse 2010-11-03 20:14:30

回答

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; 
}; 

(欲瞭解更多有關dllimportdllexport東西,看到http://msdn.microsoft.com/en-us/library/3y1sfaz2.aspxhttp://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"並且與公共DLL鏈接,然後他們可以使用Pool::data1等等。

+0

編譯指示不是標準的C++,其效果是實現定義的。因此其他答案更好。 – 2010-11-03 20:31:31

+0

使用C++爲Windows製作DLL本質上是平臺特有的活動。我想你會發現,如果沒有很多奇怪的編譯器和鏈接器設置,其他答案並不會真正起作用。 – 2010-11-03 21:15:44

+0

好的,我做到了。常見的DLL編譯和鏈接很好,但由於某種原因,使用它的DLL無法找到「池」的方法,並給出了鏈接錯誤... – Idov 2010-11-04 17:55:04

1

在頭文件,你需要

extern Pool globalPool; 

然後在共同的DLL .cpp文件,你需要

Pool globalPool; 

的extern聲明將會把它的命名空間包括模塊,鏈接器將它解析爲通用dll中的對象。

2

A static對象的聲明使對象成爲編譯單元的本地對象。

通過使用static,您將在包含標題的每個編譯單元中創建一個globalPool對象(變量)。

但是做你想做的事情的方法不是去除static

取而代之,定義一個函數提供對池的訪問(例如對其的引用),並從池DLL中導出該函數或一組函數。

或更好 - 更好 - 忘記這個想法。這是一個普遍不好的主意。但是,如果你真的想這樣做,並且看不到任何選擇,那麼上面是如何去做的。

如果你這樣做,也許考慮線程安全。

也許可以意識到Windows DLL的動態加載不能很好地支持線程局部變量的編譯器。

乾杯&心連心,