【问题标题】:How to convert an Integer to LARGE_INTEGER如何将整数转换为 LARGE_INTEGER
【发布时间】:2016-11-14 08:29:12
【问题描述】:

如何将整数转换为 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);

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

【问题讨论】:

  • 考虑到您在 Windows 上并且可能使用 Visual Studio,这可能行不通,但否则您应该阅读有关 compound literals 的信息。

标签: c windows winapi timer driver


【解决方案1】:

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

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

例如:

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

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

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

【讨论】:

    【解决方案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 位整数。

    在后一种情况下,必须编写一个 signed long long 整数,C99 标准保证其宽度为来自给定 LARGE_INTEGER 对象的 HighPartLowPart 的至少 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;
    }
    

    【讨论】:

      【解决方案3】:

      是的,但是如果您使用 C#,LARGE_INTEGER 是一个 64 位有符号整数,那么为什么不直接使用 System.Int64,或者如果您愿意, "using LARGE_INTEGER = System.Int64" // 就像 System.Int64 一样,无需调用整个库,它也是“良好做法”,可防止函数中毒

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-04-04
        • 2014-11-13
        • 1970-01-01
        • 2017-06-27
        • 2019-10-05
        • 2019-05-10
        • 2017-01-26
        • 2019-02-19
        相关资源
        最近更新 更多