c – 通过SendMessage进行IPC时,如何处理32位/ 64位不匹配?
我有一段C代码,它使用
TVM_GETITEM窗口消息读出树项目的文本(包含在普通的
Common Controls Tree View中).接收消息的树视图处于不同的进程中,因此我使用一点共享内存作为窗口消息的一个参数所指向的结构.我必须做这项工作,因为远程进程不在我的控制之下(我正在编写一个类似于Spy的应用程序).
这在原则上很有效,但如果目标过程大不相同,则会失败: >如果目标进程的代码是使用UNICODE定义但我自己的代码没有构建的,那么这两个进程将对TVITEM structure中字符串成员的结构有不同的看法.我已经使用IsWindowUnicode调用解决了这个问题然后明确地解决了这个问题.发送TVM_GETITEMA或TVM_GETITEMW(必要时重新编码结果). 我目前正在努力寻找解决第二个问题的好方法.这个特定的用例(获取树项文本)只是一个例子,我的代码发送的其他窗口消息也存在同样的问题.现在,我正在考虑两种方法: >构建我的代码两次,然后执行32位或64位代码,具体取决于目标进程的作用.这需要对我们的构建和打包系统进行一些更改,并且需要将特定于体系结构的代码分解为专用进程(现在它在DLL中).一旦完成,它应该很好地工作. 还有其他人必须解决类似的问题吗?有更简单的解决方案? 解决方法
我最终在运行时检查远程进程是32位还是64位,然后在发送消息之前将正确的结构写入共享内存.
例如,即使存在32位< - >,也可以使用TVM_GETITEM消息.消息的调用者和接收者之间的64位混合: /* This template is basically a copy of the TVITEM struct except that * all fields which return a pointer have a variable type. This allows * creating different types for different pointer sizes. */ template <typename AddrType> struct TVITEM_3264 { UINT mask; AddrType hItem; UINT state; UINT stateMask; AddrType pszText; int cchTextMax; int iImage; int iSelectedImage; int cChildren; AddrType lParam; }; typedef TVITEM_3264<UINT32> TVITEM32; typedef TVITEM_3264<UINT64> TVITEM64; // .... later,I can then use the above template like this: LPARAM _itemInfo; DWORD pid; ::GetWindowThreadProcessId( treeViewWindow,&pid ); if ( is64BitProcess( pid ) ) { TVITEM64 itemInfo; ZeroMemory( &itemInfo,sizeof( itemInfo ) ); itemInfo.mask = TVIF_HANDLE | TVIF_TEXT; itemInfo.hItem = (UINT64)m_item; itemInfo.pszText = (UINT64)(LPTSTR)sharedMem->getSharedMemory( sizeof(itemInfo) ); itemInfo.cchTextMax = MaxTextLength; _itemInfo = (LPARAM)sharedMem->write( &itemInfo,sizeof(itemInfo) ); } else { TVITEM32 itemInfo; ZeroMemory( &itemInfo,sizeof( itemInfo ) ); itemInfo.mask = TVIF_HANDLE | TVIF_TEXT; itemInfo.hItem = (UINT32)m_item; itemInfo.pszText = (UINT32)(LPTSTR)sharedMem->getSharedMemory( sizeof(itemInfo) ); itemInfo.cchTextMax = MaxTextLength; _itemInfo = (LPARAM)sharedMem->write( &itemInfo,sizeof(itemInfo) ); } sharedMem-> getSharedMemory函数是一个小辅助函数,用于获取指向共享内存区域的指针;可选的函数参数指定偏移值.重要的是共享内存区域应始终位于32位地址空间中(这样即使是32位远程进程也可以访问它). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |