2012-08-10 181 views
0

如何跨DLL共享對象?跨模塊的共享內存對象

實施例:

DLLA通過方法A DLL甲加載收集數據(攔截來自過程A調用)。

DLLB由Pascal程序加載並希望使用DLLA收集的數據。

我創建了一個映射與DLLA像這樣:

GL_EXTERN bool __stdcall CreateSharedMemory() 
{ 
    if ((hMapFile = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, MapSize, SharedMemoryName.c_str())) == NULL) 
    { 
     return false; 
    } 

    if ((pData = MapViewOfFile(hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, MapSize)) == NULL) 
    { 
     CloseHandle(hMapFile); 
     return false; 
    } 
    return true; 
} 

而且DLLB只是打開它,並把它映射。

他們可以共享命令。所以DLL B可以給DLLA命令並檢索數據,但我似乎無法弄清楚如何在內存之間共享對象/類/向量。

我試過使用指針,但意識到這是無效的,並給訪問衝突錯誤。此外,它似乎分享整數很好,但它似乎不能分享花車:S我怎樣才能完成這些任務?

編輯:爲了傳達我做的:

int* Foo = static_cast<int*>(pData); where pData is the map pointer. 
//Then I do: 

Foo[0] = X; Foo[1] = Y; 

而且有進程讀取和相應的值寫入。

信息:

這是DLLA文件:http://pastebin.com/MFkqwxJehttp://pastebin.com/MDeWprkb

這是DLLB文件:http://pastebin.com/Uj3dijc4http://pastebin.com/vkDdPp7e

編輯:將範圍縮小到:http://pastebin.com/hNF6Cu2L的要求。

+0

看不到它不起作用。您是否已經將您的DLLB代碼與MSDN示例進行了比較? http://msdn.microsoft.com/en-us/library/windows/desktop/aa366551(v=vs.85).aspx – silvesthu 2012-08-10 00:33:50

+0

是的。唯一的區別是我不使用CopyMemory。 取而代之的是我: int * Foo = static_cast (pData);其中pData是地圖指針。 然後我這樣做: Foo [0] = X; Foo [1] = Y; 而我有進程B讀取Foo [0]和Foo [1],但是當涉及到指針和浮點數時,它不起作用:S – Brandon 2012-08-10 00:39:21

+0

映射代碼很好,我只是檢查它。正如Kirill Kobelev所說,你不能使用指針cuz那些被指向的內存沒有被映射。但浮動應該是好的。 – silvesthu 2012-08-10 00:50:40

回答

1

在共享內存區域中,您可以使用所有基本數據類型,如整數和浮點數。如果你在使用float的時候遇到了問題,這與內存的共享特性無關,比如float/double/long_double的C/Pascal之間的不同理解。你不能使用指針。不包括VMT並且沒有指針的結構也可以。可以使用從共享區域開始的偏移(直接或間接)模擬複雜的數據結構。

要進行同步(如事件),您可以使用命名對象。

您還可以在進程之間傳遞句柄。檢查DuplicateHandle功能。

繼續:

Data[3] = &ListOfModels[0]; 

這裏你把共享內存不屬於共享內存區域的地址。共享內存區域中的數據應該是完全獨立的,這意味着所有的數據都應該在該區域中。結構的定義應該是這樣的:

struct SaredData 
{ 
    int data_type; 
    int status; 
    union 
    { 
     struct 
     { 
      int  num_font_char_objects; 
      FontChar font_char_objects[MAX_FONT_CHARS_SUPPORTED]; 
     }; 
     ........... 
    }; 
}; 

而且你需要確保共享內存區域的大小足夠大來存儲所有傳遞的對象。 STL的任何容器都不太可能與共享內存一起工作。

您不能將您的Model結構放置到上面的聯合中,因爲它包含複雜的字段。

+0

你是什麼意思VMT?另外我還應該如何分享向量和結構/類? 有數組的類怎麼樣?如果它甚至有一個指針,它不能被共享? – Brandon 2012-08-10 00:52:10

+0

VMT是VirtualMethodsTable。任何虛函數都會在VMT中生成一個條目。最好的方法是爲共享區域單獨編寫一組結構,或者用一個進程中的偏移量替換指針,複製數據並在其他進程中重建指針。 – 2012-08-10 00:53:16

+0

嗯,我迷路了。我不明白:S 我試過了: pData =&ListOfFontChars [0]; < - 結構向量。我用我的結構編輯了第一篇文章。 – Brandon 2012-08-10 01:19:29