我有一個由多個DLL組成的C++ Windows應用程序。 我想從某種類型的池中獲取對象,但通過這種池 在所有DLL中都可用。
因此,我把它放在一個「Common」dll中,這個人可以訪問它,並在頭文件中定義它,如下所示:
static Pool globalPool;整個應用程序的變量
我確實可以訪問每個dll,但是這個池創建了許多次。
我認爲它發生在我的每個DLL和每個包含帶定義的頭文件的文件中。
我該如何正確地做到這一點? 謝謝:)
我有一個由多個DLL組成的C++ Windows應用程序。 我想從某種類型的池中獲取對象,但通過這種池 在所有DLL中都可用。
因此,我把它放在一個「Common」dll中,這個人可以訪問它,並在頭文件中定義它,如下所示:
static Pool globalPool;整個應用程序的變量
我確實可以訪問每個dll,但是這個池創建了許多次。
我認爲它發生在我的每個DLL和每個包含帶定義的頭文件的文件中。
我該如何正確地做到這一點? 謝謝:)
你會想要一個頭文件看起來是這樣的:
// 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"
並且與公共DLL鏈接,然後他們可以使用Pool::data1
等等。
編譯指示不是標準的C++,其效果是實現定義的。因此其他答案更好。 – 2010-11-03 20:31:31
使用C++爲Windows製作DLL本質上是平臺特有的活動。我想你會發現,如果沒有很多奇怪的編譯器和鏈接器設置,其他答案並不會真正起作用。 – 2010-11-03 21:15:44
好的,我做到了。常見的DLL編譯和鏈接很好,但由於某種原因,使用它的DLL無法找到「池」的方法,並給出了鏈接錯誤... – Idov 2010-11-04 17:55:04
在頭文件,你需要
extern Pool globalPool;
然後在共同的DLL .cpp文件,你需要
Pool globalPool;
的extern聲明將會把它的命名空間包括模塊,鏈接器將它解析爲通用dll中的對象。
A static
對象的聲明使對象成爲編譯單元的本地對象。
通過使用static
,您將在包含標題的每個編譯單元中創建一個globalPool
對象(變量)。
但是做你想做的事情的方法不是去除static
。
取而代之,定義一個函數提供對池的訪問(例如對其的引用),並從池DLL中導出該函數或一組函數。
或更好 - 多更好 - 忘記這個想法。這是一個普遍不好的主意。但是,如果你真的想這樣做,並且看不到任何選擇,那麼上面是如何去做的。
如果你這樣做,也許考慮線程安全。
也許可以意識到Windows DLL的動態加載不能很好地支持線程局部變量的編譯器。
乾杯&心連心,
休閒全球已經eeeevil。我不想爲此發明一個新詞,所以忘了它,好嗎? :) – delnan 2010-11-03 20:09:54
@delnan。每當有人問一個很難回答的聰明問題時,人們開始說「忘掉它」。是的,如果這是一種不好的風格,這是一種不好的風格,應該指出,但只有你有更好的選擇建議。如果巧妙地使用globals並不是邪惡的 – 2010-11-03 20:12:05
@deInan - 幾乎聽起來像ASP.NET中的Session對象,af * @ cking噩夢...... – brumScouse 2010-11-03 20:14:30