【发布时间】:2010-12-20 08:42:52
【问题描述】:
我有一段 C++ 代码,它使用 TVM_GETITEM 窗口消息读出树项的文本(包含在普通的 Common Controls Tree View 中)。接收消息的树视图位于不同的进程中,因此我为窗口消息的一个参数指向的结构使用了一点共享内存。我必须做这项工作,因为远程进程不在我的控制之下(我正在编写一个类似于 Spy++ 的应用程序)。
这在原则上效果很好,但如果目标进程有很大不同,则会失败:
如果目标进程的代码是用定义的 UNICODE 构建的,但我自己的代码没有,这两个进程对TVITEM structure 中字符串成员的结构会有不同的想法。我已经使用IsWindowUnicode 调用解决了这个问题,然后显式发送
TVM_GETITEMA或TVM_GETITEMW(必要时重新编码结果)。如果调用进程是在 32 位模式下构建的,而目标进程是 64 位(或相反),则 TVITEM structure 结构的布局(和大小)是不同的,因为指针具有不同的大小。
我目前正在尝试找到解决第二个问题的好方法。这个特定的用例(获取树项文本)只是一个示例,我的代码正在发送的其他窗口消息也存在同样的问题。目前,我正在考虑两种方法:
- 构建我的代码两次,然后根据目标进程执行的操作执行 32 位或 64 位代码。这需要对我们的构建和打包系统进行一些更改,并且需要将特定于体系结构的代码分解到一个专用进程中(现在它在一个 DLL 中)。完成后,它应该可以正常工作。
- 在运行时检测目标进程的图像格式,然后使用自定义结构而不是明确使用 32 位或 64 位宽指针的 TVITEM structure 结构。这需要编写代码来检测远程进程的体系结构(我希望我可以通过在远程进程上调用GetModuleFileName 然后使用Image Help Library 分析PE 头)和硬编码两个结构(一个具有32 位指针,一个64位的)。此外,我必须确保共享内存地址在 32 位地址空间中(以便我自己的代码始终可以访问它,即使它是在 32 位模式下编译的)。
还有其他人必须解决类似的问题吗?有更简单的解决方案吗?
【问题讨论】:
标签: c++ windows winapi sendmessage