作者EdisonX (卡卡獸)
看板C_and_CPP
標題[問題] IPC between 32-bit / 64-bit
時間Thu Sep 17 02:18:15 2015
開發平台(Platform): (Ex: VC++, GCC, Linux, ...)
vs2010 - mfc
額外使用到的函數庫(Library Used): (Ex: OpenGL, ...)
no
問題(Question):
IPC 考慮到 32/64 問題時,問題幾乎都指向同一個地方 : 資料型態截斷問題
(如 LPVOID , size_t , HANDLE),故有點苦惱在考慮Performance 之後該怎取捨。
以下為我所知道 Windows 下 IPC 方法,後面也備註考慮跨 32/64 平台時可能
遇到的問題,我這裡的 IPC 比較像是 Client.exe 單向 Server.exe 要一大筆
陣列資料回來 ( 暫時考慮 10~20 MB ),(要回來後 "可能" 會有後續處理) ,
這動作會頻繁,所以必須考慮通訊時之 Performance issue 。
(1) WM_COPYDATA
(1.1) 響應函式有一參數是 Pointer, 導致不相容。
(1.2) COPYDATASTRUCT 裡面含指標,導致大小不同不相容。
(2) ClipBoard
(2.1) ClipBoard 看起來是沒問題的,待實作。
(2.2) ClipBoard 在資料量大時效能會低落 (像小畫家就會了)
(2.3) 這點想額外再問,如果是傳 raw data 時可以做,
那如果是 CF_BITMAP 這類資料會有問題嗎??
(3) File Mapping (Share Memory)
(3.1) HANDLE , LPVOID 跨平台問題
(4) COM
(4.1) 包這個嫌麻煩,暫時略過。若這是最好的方案,那也跑不掉。
(5) winsock
(5.1) 這點大概是最穩的方法,但要經過網路,速度有限。
(6) Mail Slot
(6.1) HANDLE 跨平台問題
(7) SendMessage
(7.1) 這點其實是我的問題,我想做像是
SendMessage(hWnd , WM_USER + 1 , pBuf , iBufSize, 0);
的東西,有點像是 WM_GETTEXT 的功能,Client 提供 Buffer
後,Server 就把資料塞進去,發現似乎沒法達成,請問這種
概念是否有辦法實現?
----
named pipe , DDE 還沒實作過 , 想請教有這部份開發經驗的網友,請問
過去是採用怎樣的機制達到 32-bit / 64-bit IPC ?
另 "曾" 想過, 是否只要確保 64-bit 端之 AP ,產生之 HANDLE , Pointer
前 32 bits 為 0,上述的 HANDLE, LPVOID 問題便可順利解決截斷問題?若是
的話,請問有什麼方法可以達成這需求 ? 在全域開靜態陣列達得到嗎(不知道
是不是有保證)?
以上,問題有些多,有先翻過閱過 MSDN 一些文章,
可討論的地方還是覺得不少,希望有意見便不吝提出。
最後謝謝各位的耐心閱讀與不吝指教,感激不盡。
--
「自從我學了 C# , 人都變聰明 , 考試都考一百分」
「自從我學了 VB , 皮膚都變好 , 人也變漂亮了 」
「自從我學了 Java , 明顯變壯 , 個子也變高了 」
「自從我學了 C++ , 內分泌失調 , 頭都禿了... 」
< Kuso 星爺語錄 >
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 123.195.169.158
※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1442427499.A.8C3.html
推 Dforce: 我有用named pipe 有點像是IOCP架構的感覺 09/17 09:25
→ EdisonX: 感謝, 不過我發現 Pointer 的傳遞似乎不是我想像那樣,感 09/17 22:03
→ EdisonX: 覺像是有處理過 , 所以 64b/32b 竟然可用 COPYDATA 完成 09/17 22:03
推 troylee: protobuf? 09/18 01:09
→ EdisonX: protobuf 是 protocal buffer? 09/18 21:37
→ EdisonX: 話說我試了mailsolt還蠻快的 重點也跨過去了,謝謝各 09/18 21:38
→ EdisonX: 位。 09/18 21:38