为啥使用 FileTimeToSystemTime() 时程序崩溃了?

Posted

技术标签:

【中文标题】为啥使用 FileTimeToSystemTime() 时程序崩溃了?【英文标题】:Why the program collapsed when using FileTimeToSystemTime()?为什么使用 FileTimeToSystemTime() 时程序崩溃了? 【发布时间】:2013-11-17 18:58:41 【问题描述】:

我想把FileTime改成SystemTime,但是程序总是崩溃,为什么?

提前致谢。

FILETIME *Kernel_Time;
HANDLE Process = OpenProcess ( PROCESS_ALL_ACCESS, FALSE, 0);
GetProcessTimes (Process, NULL, NULL, Kernel_Time, NULL);
SYSTEMTIME  *Sys_Time;
FileTimeToSystemTime (Kernel_Time, Sys_Time);

【问题讨论】:

您的Kernel_Time 指针需要指向一个有效的FILETIME 结构。目前只是一个指针。 对了,什么是“折叠”?访问冲突?描述问题时请尽可能具体。 您是否在调试器下运行?如果您使用的是 IDE,请尝试查找“Run > Run with Debugging”或“Debug > Run”菜单项,或类似的内容。它的名称可能会根据您使用的程序而改变。然后,IDE 将在发生异常时暂停您的程序。 那么你将不得不使用the command-line debugger.(Erk。你这样做很难!)尝试下载一个好的Windows C++ IDE,例如Visual C++(Express 是免费的,你可能想要 Express 2013 for Windows Desktop)或C++ Builder(不幸的是,没有免费版本,但在构建用户界面方面比 VC++ 好得多。) @David M 感谢您的建议;我想我会尝试一些适用于 C/C++ 的 IDE。 :-) 【参考方案1】:

您不会为结果分配内存。在堆栈上分配它可能更容易,并像这样在函数调用中使用地址:

FILETIME Kernel_Time;
HANDLE Process = OpenProcess(PROCESS_ALL_ACCESS, FALSE, 0);
GetProcessTimes(Process, NULL, NULL, &Kernel_Time, NULL);
SYSTEMTIME Sys_Time;
FileTimeToSystemTime(&Kernel_Time, &Sys_Time);

【讨论】:

【参考方案2】:

您对OpenProcess 的呼叫失败:

如果指定的进程是系统进程(0x00000000),则函数失败,最后的错误码是ERROR_INVALID_PARAMETER。

您应该考虑检查返回值。您的应用程序崩溃了,因为您将随机指针 (Sys_Time) 传递给 FileTimeToSystemTimeKernel_TimeGetProcessTimes

对于每次调用,您都需要分配内存。在这种情况下,自动变量就足够了:

FILETIME Kernel_Time =  0 ;
...
GetProcessTimes( Process, NULL, NULL, &Kernel_Time, NULL );

【讨论】:

以上是关于为啥使用 FileTimeToSystemTime() 时程序崩溃了?的主要内容,如果未能解决你的问题,请参考以下文章

为啥或为啥不在 C++ 中使用 memset? [关闭]

为啥在参数周围使用 /*、*/ 以及为啥在提取数组长度时使用 >>>? [复制]

为啥我们使用 hadoop mapreduce 进行数据处理?为啥不在本地机器上做呢?

为啥 CoreGui Roblox 锁定在 DataModel 中,为啥受信任的用户不能使用 CoreScripts?

为啥有人应该在 git commit 之前使用 git add?或者为啥有人应该使用 git add 呢?

为啥刷新令牌更安全?如果刷新令牌也可能被盗,为啥我们还要使用它?