c++ - 从 'BYTE *' 到 'ULONG' 的指针截断

标签 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)

问题是什么?为什么?

最佳答案

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

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

关于c++ - 从 'BYTE *' 到 'ULONG' 的指针截断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46522345/

相关文章:

windows - 关于NTFS过滤驱动的问题

c++ - 在 C++ 中使用具有继承性的指针

c++ - gcc 编译错误,在 Visual Studio 2008 C++ 中工作正常

c++ - 像 ListView 这样的资源管理器

linux - 如何在 RHEL 6/Linux 上设置 Oracle ODBC 驱动程序

linux - 无法编译qc-usb驱动?

c++ - 图形驱动程序会导致我的应用程序发生内存泄漏吗?

c++ - 使用 C++ MJPEG 流媒体服务器时缺少 boost::asio 随机 header

c++ - 复制STL:删除元素,用户定义的函数作为参数和事件队列

applet - 通过 Java Applet 安装驱动程序