如何跨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/MFkqwxJe和http://pastebin.com/MDeWprkb
這是DLLB文件:http://pastebin.com/Uj3dijc4和http://pastebin.com/vkDdPp7e
編輯:將範圍縮小到:http://pastebin.com/hNF6Cu2L的要求。
看不到它不起作用。您是否已經將您的DLLB代碼與MSDN示例進行了比較? http://msdn.microsoft.com/en-us/library/windows/desktop/aa366551(v=vs.85).aspx – silvesthu 2012-08-10 00:33:50
是的。唯一的區別是我不使用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
映射代碼很好,我只是檢查它。正如Kirill Kobelev所說,你不能使用指針cuz那些被指向的內存沒有被映射。但浮動應該是好的。 – silvesthu 2012-08-10 00:50:40