2009-07-29 41 views
1

我正在用一些全局數據創建一個C++ Win32 dll。有一個全局定義的std :: map,並且在dll中有導出的函數將數據寫入地圖(在獲取寫鎖之後)。通過導出的dll函數訪問dll中的全局數據

我的問題是,當我從DLL DllMain中調用寫函數時,它的工作原理沒有任何問題。但是,當我從另一個程序加載的dll和調用數據寫入全球地圖的功能,它給了我這個錯誤:

WindowsError: exception: access violation reading 0x00000008 

有什麼可約這樣做?從DllMain調用同樣的函數可以訪問dll中的全局數據,但是當從不同的進程調用時,它不能訪問全局數據。請指教。

我正在使用TDM-MinGW gcc 4.4.0編譯器。

編輯: 好吧,我想通了,問題是什麼,並感謝幫助球員,但問題是沒有用的構造問題,或者無法在全球空間的地圖,但在一個問題我使用的boost :: python。我已經測試過,但由於我是從python或其他東西中調用dll,所以urllib2模塊並沒有被加載到dll中。現在我必須看到如何解決它。

+0

這可能是一個好主意,寫出你的決議作爲答案並接受它,這樣的問題被記錄爲「回答」。要麼或接受最有用的現有答案。 – RBerteig 2009-07-31 06:59:19

回答

1

看起來你的代碼被調用時,std::map的構造函數還沒有運行。 Win32 DLL中全局非POD的生命週期非常複雜,我不確定MinGW如何專門處理它。但可能是因爲您編譯DLL的方式,您已將自己的函數(DllMain?)設置爲入口點,因此會覆蓋調用構造函數的CRT初始化例程。

+0

我讀了一個地方,dll中的所有全局對象在調用DllMain(DLL_PROCESS_ATTACH)之前被初始化。並且在調用DllMain(DLL_PROCESS_DETACH)之後調用它們的析構函數。所以我認爲它會工作,並假設這寫了太多的代碼。但是,如果這不起作用,創建一個全局指針並創建並銷燬DllMain中的地圖是否安全? – Sahas 2009-07-29 09:44:09

+0

我相當確信std :: map的構造函數被調用,因爲我在DllMain中插入數據到映射中,當Dll被加載時,但一旦加載,如果我從另一個進程調用該函數,它不起作用。 – Sahas 2009-07-29 10:20:13

0

您必須使用共享內存,因爲不同的進程具有單獨的地址空間。 我認爲你不會得到std :: map運行。我會建議使用MapViewOfFile,CreateFileMapping,OpenFileMapping,...和普通的舊數據。詢問Google/MSDN。

1

這種低內存地址的讀取錯誤通常意味着您試圖在某處訪問NULL指針。你能顯示你的實際代碼嗎?