【问题标题】:Packing 64 bit pointer into 4 WORD's将 64 位指针打包成 4 个字
【发布时间】:2019-11-03 20:41:36
【问题描述】:

我需要将this 指针(64 位宽)打包到 4 个WORD 中,然后在代码的其他部分中我需要将这些单词提取(组装)回this指针。

代码如下所示:

std::vector<WORD> vec;
vec.push_back( this ); // how?

后面的代码;

pThis = vec.at(0); // how?

我确实看过 LOWORD/HIWORDLOWBYTE/HIBYTE 宏,但我仍然不知道该怎么做。

如果你问到底为什么会有人需要这个,原因如下: 我需要填写DLGITEMTEMPLATEEX 结构的创建数据,它以WORD 作为最后一个参数来指定大小,后面的数据是你放置数据的地方,我的数据是this 指针,因为我正在处理单词(std::vector&lt;WORD&gt;) 填充结构,最后一个数据是4个WORDS(64位)代表指针!

欢迎任何建议或示例代码。

【问题讨论】:

  • memcpy(&amp;vec[0], &amp;this, sizeof(this)); 然后memcpy(pThis, &amp;vec[0], sizeof(your_class*));。该链接仍然没有解释为什么要使用 4 WORDS(为什么是 4?)而不仅仅是指针。您可能只想使用struct my_struct { DLGITEMTEMPLATEEX template; your_class *pThis; },然后使用containerof(或只是投射指针)来获取pThis
  • @KamilCuk 您在pThis 之前缺少&amp;
  • 太好了,我试试这段代码,顺便说一句,DLGITEMTEMPLATEEX 是一个特殊的不存在的结构,我们需要将它填充到内存中。然后将指向内存的指针传递给期望DLGITEMTEMPLATE* 结构的函数。我使用向量来避免C style
  • 对话框通常是从资源文件中创建的。在极少数情况下,您需要动态生成 对话框(为什么?),请查看this。在任何情况下,对话框和应用程序的其余部分之间的接口都是通过消息和控件 ID 进行的。所以没有必要在对话框项结构中附加任何东西,因为它没有用。

标签: c++


【解决方案1】:

嗯,最好的方法是定义一个从DLGITEMTEMPLATEEX 派生的结构。这样,您可以避免手动进行转换。 虽然它可能不是从标准中定义的,但它可以在 Windows 上运行。这种代码如果是特定于平台的!

struct MyTemplate : DLGITEMTEMPLATEEX
{
    MyTemplate(MyPointerType *myVariable) 
        : extraCount(sizeof *this - sizeof(DLGITEMTEMPLATEEX))
        , myVariable(myVariable)
    { }

    MyPointerType *myVariable; // 64 if compiled for 64 bit target.
};

并且在使用数据时,您执行static_cast 以转换回该结构。

您可以添加一些 static_assert 和断言来验证它是否按预期工作。

【讨论】:

【解决方案2】:

您可以使用简单的位移将 64 位分成 16 位。

#include <stdio.h>

int main(){
    uint64_t bigword = 0xDEADBEEFADEADBED;
    uint16_t fourth = bigword ;
    uint16_t third = bigword >> 16;
    uint16_t second = bigword >> 32;
    uint16_t first = bigword >> 48;
    printf("%llx %x %x %x %x\n",bigword,fourth,third,second,first);
    return 0;
}

然后在将单词移回64位时反转过程。

【讨论】:

    猜你喜欢
    • 2014-03-07
    • 1970-01-01
    • 2012-10-11
    • 1970-01-01
    • 2013-01-11
    • 2012-07-16
    • 2011-01-31
    • 2016-08-01
    • 2016-04-11
    相关资源
    最近更新 更多