我试着为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)
有什么问题?为什么?
答案 0 :(得分:4)
LONG 类型是4字节宽,而指针类型如 BYTE * 具有架构的宽度,即。 x86平台上32位或4字节,x64架构上64位(8字节)。因此,这可以在x86平台上正常编译,但在64位平台上发出警告(被视为错误)。
对于x64架构,正确的转换将是数字类型“ LONG LONG ”或 UINT64 和类似类型,或者如果你真的不在乎你可以< em> static_cast(x)值。