2009-09-24 37 views
1

我有關於在DLL中導出/導入全局變量的問題。我有一個包含一個全局變量,如靜態庫:儘管dllimport在兩個DLL中導出的數據符號

在標題:

#ifdef _ENGINE_EXPORTS 
extern __declspec(dllexport) Globals data; 
#else 
extern __declspec(dllimport) Globals data; 
#endif 

在源文件:

#ifdef _ENGINE_EXPORTS 
__declspec(dllexport) Globals data; 
#else 
__declspec(dllimport) Globals data; 
#endif 

這個全局變量是在DLL哪個環節出口針對這個靜態庫。我可以使用DLL導出查看器查看導出的符號。我的問題是我想在另一個DLL中使用這個全局變量,並且他們共享數據。現在,同樣的符號也被導出到DLL中(我也可以看到它),因此它們具有不同的地址。我希望在這個其他DLL中,全局變量與第一個DLL中的相同。

謝謝。

回答

0

在該項目中,一個DLL是在所有其他的根,所以我在這一個導出的符號,它似乎工作。

0

從你的描述我知道你有兩個不同的DLL,它們都輸出全局變量data
當一個DLL導出一個變量時,這個DLL分配內存給這個變量的內容,並在同一個進程中向其他SW部分提供(例如加載DLL的應用程序)以通過變量名來使用這個內存。因此,如果從兩個DLL中導出data這兩個DLL都分配內存,並且都在其上下文中提供變量名稱data(您可以將其想象爲具有相同名稱但名稱空間不同的兩個變量)。
你想要做的是,一個DLL導出data,另一個DLL導入這個變量。通過這個(dllimport),你可以聲明變量名,而不需要定義它(因此不需要分配內存)。
從你作爲static.hpp,static.cpp和static.lib問題,以便採取了這種靜態庫:
你有dll_1.cpp(對static.lib鏈接)

#define _ENGINE_EXPORTS (1) 
#include "static.h" 
__declspec(dllexport) int getAdrAsInt_1() 
{ 
    return (int)&data; 
} 

和dll_2.cpp(掛針對dll_1的「導入庫」,見here

// here without _ENGINE_EXPORTS to use dllimport instead of dllexport 
#include "static.h" 
__declspec(dllexport) int getAdrAsInt_2() 
{ 
    return (int)&data; 
} 

另一種方式來訪問從dll_2 dll_1數據將來自dll_2使用,GetProcAddress。但是那麼你需要LoadLibrary-0123的HMODULE加載dll_1。

順便說一句:據我瞭解你的情況「How do I share data in my DLL with an application or with other DLLs?」是不適用的,因爲它描述了一個完全不同的情況。

相關問題