在64位体系结构的内存中创建对话框模板



DialogBoxIndirect()的对话框模板也可以在内存中构建。MSDN实际上有关于如何做到这一点的非常详细的说明(请参阅此处(。

然而,从64位的角度来看,微软的示例代码中存在一些问题。这是一个名为lpwAlign()的函数,它似乎取一个指针并将其与DWORD边界对齐。功能如下:

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

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

ULONG替换为ULONG_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;
}

(取自此(

相关内容

  • 没有找到相关文章

最新更新