如何将整数转换为LARGE_INTEGER

时间:2016-11-14 08:29:13

标签: c windows winapi timer driver

如何将整数转换为LARGE_INTEGER?

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

LARGE_INTEGER zero;  
zero.QuadPart = 0;  
KeSetTimer(pTimer, zero, pDpc);

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

KeSetTimer(pTimer, (SomeType)0, pDpc);

我试过了:

KeSetTimer(pTimer, (LARGE_INTEGER )0, pDpc);

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

3 个答案:

答案 0 :(得分:5)

LARGE_INTEGERstruct。 无法将值转换为结构类型。

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

例如:

LARGE_INTEGER intToLargeInt(int i) {
    LARGE_INTEGER li;
    li.QuadPart = i;
    return li;
}

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

KeSetTimer(pTimer, intToLargeInt(0), pDpc);

答案 1 :(得分:2)

为扩展和增强先前对这个问题的回答以提高可移植性, LARGE_INTEGER 实际上是两个结构的结合,旨在表示一个64位带符号整数值,同时还考虑了以下情况:编译器可能没有对64位整数数据类型的内置支持。

位于https://docs.microsoft.com/en-us/windows/win32/api/winnt/ns-winnt-large_integer~r1的文档指出:

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

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

这可以通过以下方式完成:将 HighPart 的所有位左移32,然后将结果与 LowPart 成员按位或,以将其下限设置为低32位。

因此,相反的操作是屏蔽给定long long整数的32位High和Low部分,并将它们相应地分配给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;
}

答案 2 :(得分:0)

是的,但是,如果您使用的是C#,则LARGE_INTEGER是64个有符号整数,因此为什么不直接使用System.Int64,或者如果您愿意, “使用LARGE_INTEGER = System.Int64” //就像不调用整个库的System.Int64一样,这也是防止函数中毒的“好习惯”