如何将整数转换为LARGE_INTEGER

Jus*_*oob 1 c windows winapi driver timer

如何将整数转换为LARGE_INTEGER?

例如,当我想立即触发计时器时:

LARGE_INTEGER zero;  
zero.QuadPart = 0;  
KeSetTimer(pTimer, zero, pDpc);
Run Code Online (Sandbox Code Playgroud)

有没有办法将0转换为LARGE_INTEGER?所以我可以这样做:

KeSetTimer(pTimer, (SomeType)0, pDpc);
Run Code Online (Sandbox Code Playgroud)

我试过了:

KeSetTimer(pTimer, (LARGE_INTEGER )0, pDpc);
Run Code Online (Sandbox Code Playgroud)

但它不起作用.我用谷歌搜索,但找不到任何帮助.

小智 7

为了扩展和增强之前对此问题的答案以实现更大的可移植性,LARGE_INTEGER实际上是两个结构的联合,旨在表示 64 位有符号整数值,同时还考虑到编译器可能没有内置支持的情况64 位整数数据类型。

正如托管在https://learn.microsoft.com/en-us/windows/win32/api/winnt/ns-winnt-large_integer~r1的文档所述:

如果您的编译器内置了对 64 位整数的支持,请使用 QuadPart 成员来存储 64 位整数。否则,使用 LowPart 和 HighPart 成员来存储 64 位整数。

在后一种情况下,必须组成一个有符号的 long long整数,由C99标准保证宽度至少为 64 位(如http://www.open-std.org/jtc1/sc22/中指定) wg14/www/docs/n1256.pdf)来自给定 LARGE_INTEGER 对象的HighPartLowPart,每个对象的宽度均为 32 位。

这可以通过将HighPart的所有位左移32 并将结果与​​ LowPart成员按位或运算以设置其低 32 位来完成。

因此,相反的操作是屏蔽掉给定 long long 整数的 32 位高位和低位部分,并将它们相应地分配给 LARGE_INTEGER 实例的成员。

下面是这两种操作的代码示例,确保编译器本身不支持 64 位整数的情况也被考虑在内:

// LARGE_INTEGER to 64-bit integral type:

static long long toInteger(LARGE_INTEGER const & integer)
{
#ifdef INT64_MAX // Does the compiler natively support 64-bit integers?
        return integer.QuadPart;
#else
        return (static_cast<long long>(integer.HighPart) << 32) | integer.LowPart;
#endif
}

// signed long long to LARGE_INTEGER object:

static LARGE_INTEGER toLargeInteger(long long value)
{
        LARGE_INTEGER result;

#ifdef INT64_MAX // Does the compiler natively support 64-bit integers?
        result.QuadPart = value;
#else
        result.high_part = value & 0xFFFFFFFF00000000;
        result.low_part  = value & 0xFFFFFFFF;
#endif
        return result;
}
Run Code Online (Sandbox Code Playgroud)


Kla*_*äck 5

LARGE_INTEGER是一个struct.无法将值转换为结构类型.

您需要创建结构的实例并根据需要设置其字段.

例如:

LARGE_INTEGER intToLargeInt(int i) {
    LARGE_INTEGER li;
    li.QuadPart = i;
    return li;
}
Run Code Online (Sandbox Code Playgroud)

然后你可以像这样使用它:

KeSetTimer(pTimer, intToLargeInt(0), pDpc);
Run Code Online (Sandbox Code Playgroud)