从'BYTE *'到'ULONG'的指针截断

时间:2017-10-02 08:53:12

标签: c++ drivers

我试着为windows编写一个简单的过滤器驱动程序,当我想构建项目时,Visual Studio给了我以下警告:

警告C4311'类型转换':指针从'BYTE *'截断到'ULONG'

和错误: C2220警告被视为错误 - 未生成“对象”文件

这是我的代码:

BOOLEAN GetAllBufferFromChunkedFormat(STREAM_EDIT_PARAMETERS* params, BYTE** 
dataBuffer)
{
if (!CheckPointer(params) || !CheckPointer(dataBuffer))
{
    return FALSE;
}
BYTE* iterator = params->dataStart + params->contentStart;
params->currentContentLength = 0;
UINT currentChunkLength = 0;
BOOLEAN isAllData = FALSE;
while ((ULONG)iterator - (ULONG)params->dataStart < params->streamEditor->dataLength) //calculate total length
{
    currentChunkLength = strtol(iterator, &iterator, 16);
    iterator += s_chunksSeparatorLength + currentChunkLength + s_chunksSeparatorLength;
    ..
    ..
    ..
}

警告显示在以下位置:

while ((ULONG)iterator - (ULONG)params->dataStart < params->streamEditor->dataLength)

有什么问题?为什么?

1 个答案:

答案 0 :(得分:4)

LONG 类型是4字节宽,而指针类型如 BYTE * 具有架构的宽度,即。 x86平台上32位或4字节,x64架构上64位(8字节)。因此,这可以在x86平台上正常编译,但在64位平台上发出警告(被视为错误)。

对于x64架构,正确的转换将是数字类型“ LONG LONG ”或 UINT64 和类似类型,或者如果你真的不在乎你可以< em> static_cast(x)值。