2012-04-04 85 views
2

我试图在窗口中获取以毫秒为单位的经过时间。我发现要做到这一点的唯一方法是使用FILETIME结构获得1601年以来的100纳秒数。但是FILETIME结构会将值存储在两个变量中,我想知道如何减去这两个结构,将它们除以10000(以获得毫秒)并将结果存储在单个变量中 我正在使用C++ Visual Studio 2008速成版如何减去两个FILETIME?

+2

编程语言?框架? – 2012-04-04 10:38:21

+0

对不起,我以为我已经把它。我正在使用Visual Studio 2008 Express版的C++ – XaitormanX 2012-04-04 10:49:35

+1

IMO这是一个完全合法的问题和答案,目前的措辞。它应该重新打开。 – 2014-04-04 16:32:53

回答

4

阅读的FILETIME文档:

不建议您从FILETIME结构加减值来获得相对时间。相反,你应该的文件时,低和高位部分复制到一个ULARGE_INTEGER结构,执行QuadPart成员在64位运算,并复制LowPartHighPart成员进入FILETIME结构体。

在那里你也有你的单一号码(ULARGE_INTEGER结构的QuadPart)。

+0

+1,这就是问题如何解决。 – sharptooth 2012-04-04 10:58:35

+0

好的,谢谢你,解决了这个问题。但它表示,如果编译器支持内置64位整数,则只能使用QuadPart。 Visual Studio支持它,但是当我制作可执行文件时,它可以在安装了Windows的任何系统中工作? – XaitormanX 2012-04-04 11:06:14

+0

根据定义,可执行文件本身不再依赖于编译器。 – Joey 2012-04-04 11:18:02

0
FILETIME ft1; 
FILETIME ft2; 

int iDifferenceInMS = (*((ULONGLONG*)&ft2) - *((ULONGLONG*)&ft1))/10000; 
+2

这实际上可能非常糟糕。 FILETIMES是32位对齐的,而不是64位对齐的。这意味着,取决于编译器将变量放在内存中的位置,并取决于系统。这意味着在某些机器上运行时可能会崩溃。你不想要这种悲伤。 另一方面,ULARGE_INTEGER需要64位对齐,所以你不会得到这些对齐错误。 – Eagle 2014-08-08 22:03:00