首页 > 解决方案 > 在 64 位架构的内存中创建对话框模板

问题描述

对话框模板DialogBoxIndirect()也可以在内存中构建。MSDN 实际上有关于如何执行此操作的非常详细的说明(请参见此处)。

但是,从 64 位的角度来看,Microsoft 的示例代码中存在一些问题。这是一个被调用的函数lpwAlign(),它似乎接受一个指针并将其与 DWORD 边界对齐。该函数如下所示:

LPWORD lpwAlign(LPWORD lpIn)
{
    ULONG ul;

    ul = (ULONG)lpIn;
    ul ++;
    ul >>=1;
    ul <<=1;
    return (LPWORD)ul;
}

AFAICS,当在 64 位系统上编译时,这会将 64 位指针转换为 32 位整数,将该整数填充为 4 的倍数,然后将其作为 64 位指针返回。因此,一旦涉及高于 2^32 的指针值,这看起来就会崩溃。那么这段代码应该如何适应 64 位呢?

标签: winapi

解决方案


替换ULONGULONG_PTR以避免 32 位截断。

编辑:还要注意,在 MSDN 上发布并在 OP 中引用的示例代码实际上是错误的,因为它将指针对齐 WORD 边界,而不是 DWORD 边界。它应该看起来像这样:

LPWORD lpwAlign(LPWORD lpIn)
{
     ULONG_PTR ul;

     ul = (ULONG_PTR)lpIn;
     ul += 3;
     ul >>= 2;
     ul <<= 2;
     return (LPWORD)ul;
}

(取自这里


推荐阅读