在线等!关于GetSystemTimes函数未定义的问题

时间:2022-02-21 18:41:13
最近在做的一个东西用到了GetSystemTimes函数,在MSDN上查过后知道它是包含在winbase.h头文件里面。
但是在用的过程中,就算我添加了#inclue <winbase.h>,编译时也还是提示GetSystemTimes函数未定义。

在本地计算机进行搜索后,发现在C:\Program Files\Microsoft SDKs\Windows\v7.0A\Include中的winbase.h里面有这个函数,但系统每次都找到的都是C:\Program Files\Microsoft Visual Studio\VC98\Include中的winbase.h。

尝试了两种方法改正:
1、将正确的winbase.h文件拷到project目录下,代码中改为#include "winbase.h",依然找的是C:\Program Files\Microsoft Visual Studio\VC98\Include中的winbase.h,失败;

2、在Tools->Options->Directories中将C:\Program Files\Microsoft SDKs\Windows\v7.0A\Include换到最上方,又出现另一个错误:cannot open include file 'sal.h',仍然失败。

请问各位大侠,是我引用头文件方法不对吗?还是别的什么原因?希望哪位知道的大侠指条明路给我吧,不胜感激~~~

35 个解决方案

#1


#include<windows.h>,可以

#2


引用 1 楼 bdmh 的回复:
#include<windows.h>,可以

试过了,也不行

#3


#include <windows.h>  应该是对的! 

#4


试试 #include "windows.h"

#5


引用 4 楼 jordancar 的回复:
试试 #include "windows.h"


试过了,也不对

#6


刚刚在写代码的时候这个问题又出现了,极度无语中,知道的同学站出来说下吧,不胜感激~~~

#7


这个winbase.h文件应该怎么include到对的呀,抓狂撞墙中,,,

#8


在本地计算机进行搜索后,发现在C:\Program Files\Microsoft SDKs\Windows\v7.0A\Include中的winbase.h里面有这个函数,但系统每次都找到的都是C:\Program Files\Microsoft Visual Studio\VC98\Include中的winbase.h。

是不是因为配置选项的include中,C:\Program Files\Microsoft Visual Studio\VC98\Include在C:\Program Files\Microsoft SDKs\Windows\v7.0A\Include的前面导致的?试着将两项换一下位置

#9


引用 8 楼 pengchy 的回复:
在本地计算机进行搜索后,发现在C:\Program Files\Microsoft SDKs\Windows\v7.0A\Include中的winbase.h里面有这个函数,但系统每次都找到的都是C:\Program Files\Microsoft Visual Studio\VC98\Include中的winbase.h。

是不是因为配置选项的include中,C:\Program Fi……


换了又会出现另外一个问题:2、在Tools->Options->Directories中将C:\Program Files\Microsoft SDKs\Windows\v7.0A\Include换到最上方,又出现另一个错误:cannot open include file 'sal.h',仍然失败。

#10


可能是VC6生成的程序吧,将_WIN32_WINNT定义 为0x0400 或0x0500

#11


引用 10 楼 ltqin 的回复:
可能是VC6生成的程序吧,将_WIN32_WINNT定义 为0x0400 或0x0500


不好意思,请问应该在哪里将_WIN32_WINNT定义 为0x0400 或0x0500?

#12


查MSDN是Windows程序员必须掌握的技能之一。
ms-help://MS.VSCC.v90/MS.MSDNQTR.v90.chs/sysinfo/base/getsystemtimes.htm
GetSystemTimes Function

Retrieves system timing information. On a multiprocessor system, the values returned are the sum of the designated times across all processors.


BOOL WINAPI GetSystemTimes(
  __out         LPFILETIME lpIdleTime,
  __out         LPFILETIME lpKernelTime,
  __out         LPFILETIME lpUserTime
);

Parameters
lpIdleTime 
A pointer to a FILETIME structure that receives the amount of time that the system has been idle.

lpKernelTime 
A pointer to a FILETIME structure that receives the amount of time that the system has spent executing in Kernel mode (including all threads in all processes, on all processors).

lpUserTime 
A pointer to a FILETIME structure that receives the amount of time that the system has spent executing in User mode (including all threads in all processes, on all processors).

Return Value
If the function succeeds, the return value is nonzero. 

If the function fails, the return value is zero. To get extended error information, call GetLastError.

Remarks
To compile an application that uses this function, define _WIN32_WINNT as 0x0501 or later. For more information, see Using the Windows Headers.

Requirements
Client
 Requires Windows Vista or Windows XP SP1.
 
Server
 Requires Windows Server 2008 or Windows Server 2003.
 
Header
 Declared in Winbase.h; include Windows.h.
 
Library
 Use Kernel32.lib.
 
DLL
 Requires Kernel32.dll.
 

See Also
FILETIME
System Time
Time Functions



Send comments about this topic to Microsoft 

Build date: 8/15/2007

#13


应该是动态库没有链接 吧

#14


放到当前目录下用""都搞不定是不是应该换个编译器试试,或者重装一下!

#15


引用 11 楼 rabbiting 的回复:
引用 10 楼 ltqin 的回复:

可能是VC6生成的程序吧,将_WIN32_WINNT定义 为0x0400 或0x0500


不好意思,请问应该在哪里将_WIN32_WINNT定义 为0x0400 或0x0500?

一般在 stdafx.h中,如果没有自己定义

你看看winbase.h文件,如果_WIN32_WINNT小于0x0400,GetSystemTimes是没有定义的(#ifdef...)

#16


引用 12 楼 zhao4zhong1 的回复:
查MSDN是Windows程序员必须掌握的技能之一。
ms-help://MS.VSCC.v90/MS.MSDNQTR.v90.chs/sysinfo/base/getsystemtimes.htm
GetSystemTimes Function

Retrieves system timing information. On a multiprocessor system, the va……

Remarks
To compile an application that uses this function, define _WIN32_WINNT as 0x0501 or later. For more information, see Using the Windows Headers.

可以在工程设置里定义
工程属性--〉C/C++ --> Preprocessor --> Preprocessor Definitions里加上_WIN32_WINNT=0x0501

#17


不那是没有头文件吧 
  #include <atltime.h>  你加进去看下应该是可以的哦!
MSDN上面很明确说明了 要加这个头文件的

#18


引用 15 楼 ltqin 的回复:
引用 11 楼 rabbiting 的回复:

引用 10 楼 ltqin 的回复:

可能是VC6生成的程序吧,将_WIN32_WINNT定义 为0x0400 或0x0500


不好意思,请问应该在哪里将_WIN32_WINNT定义 为0x0400 或0x0500?

一般在 stdafx.h中,如果没有自己定义

你看看winbase.h文件,如果_WIN32_WINN……


我检查过了,那个winbase.h文件中就根本没有GetSystemTimes这串字符,搜索不到。

#19


引用 12 楼 zhao4zhong1 的回复:
查MSDN是Windows程序员必须掌握的技能之一。
ms-help://MS.VSCC.v90/MS.MSDNQTR.v90.chs/sysinfo/base/getsystemtimes.htm
GetSystemTimes Function

Retrieves system timing information. On a multiprocessor system, the va……


查过了,具体原因不是在这里

#20


引用 14 楼 dyangrun 的回复:
放到当前目录下用""都搞不定是不是应该换个编译器试试,或者重装一下!


编译器是不能换了,重装过了,也没用

#21


Requirements
Client
 Requires Windows Vista or Windows XP SP1.
 
Server
 Requires Windows Server 2008 or Windows Server 2003.
 
Header
 Declared in Winbase.h; include Windows.h.
 
Library
 Use Kernel32.lib.
 
DLL
 Requires Kernel32.dll.
 

前提是你使用的操作系统中的Kernel32.dll中有这个导出函数!

#22


以及你链接器链接时用的Kernel32.lib里面也有这个导出函数!

#23


查Kernel32.dll和Kernel32.lib中是否有GetSystemTimes导出函数用命令行
dumpbin.exe /EXPORTS Kernel32.lib | find "GetSystemTimes"
dumpbin.exe /EXPORTS Kernel32.dll | find "GetSystemTimes"
 

#24


#include <windows.h>

#25


引用 18 楼 rabbiting 的回复:
引用 15 楼 ltqin 的回复:
引用 11 楼 rabbiting 的回复:

引用 10 楼 ltqin 的回复:

可能是VC6生成的程序吧,将_WIN32_WINNT定义 为0x0400 或0x0500


不好意思,请问应该在哪里将_WIN32_WINNT定义 为0x0400 或0x0500?

一般在 stdafx.h中,如果没有自己定义

你看看winb……


是GetSystemTime()函数,而不是GetSystemTimes()函数啊,后面没有s

#26


了GetSystemTimes
楼主函数名写错了。
是GetSystemTime

#27


引用 25 楼 ltqin 的回复:
引用 18 楼 rabbiting 的回复:

引用 15 楼 ltqin 的回复:
引用 11 楼 rabbiting 的回复:

引用 10 楼 ltqin 的回复:

可能是VC6生成的程序吧,将_WIN32_WINNT定义 为0x0400 或0x0500


不好意思,请问应该在哪里将_WIN32_WINNT定义 为0x0400 或0x0500?

一般在 std……


我要用的就是GetSystemTimes函数,没写错

#28


引用 26 楼 legionalways 的回复:
了GetSystemTimes
楼主函数名写错了。
是GetSystemTime


不是哦,这是两个不一样的函数,我没写错

#29


问题找到原因了,是我的SDK版本太低了,要升级下SDK才会有GetSystemTimes这个函数。
谢谢大家的帮助哈~尤其是zhao4zhong1,散分~

#30


楼主
怎么解决的,我也遇到这个问题

#31


参照MSDN说明
Requirements
Client: Included in Windows XP SP1.
Server: Included in Windows Server 2003.
Header: Declared in Winbase.h; include Windows.h.
Library: Use Kernel32.lib.

发现接口是在 Winbase.h 文件中声明的,就打开看看,发现声明如下:
#if _WIN32_WINNT >= 0x0501

BOOL
WINAPI
GetSystemTimes(
    LPFILETIME lpIdleTime,
    LPFILETIME lpKernelTime,
    LPFILETIME lpUserTime
    );

#endif // (_WIN32_WINNT >= 0x0501)

注意,这个宏 #if _WIN32_WINNT >= 0x0501 ,它的意思是,只有当windows版本高于0x0501,也就是WinXP SP1时,声明才有效,原来如此!

修改头文件声明为:
#define _WIN32_WINNT 0x0501
#include <Windows.h>

#32


楼主,我也遇到这个问题了,能告诉下你是怎么解决的吗

#33


引用 32 楼 chenhongbing2010 的回复:
楼主,我也遇到这个问题了,能告诉下你是怎么解决的吗


我也遇到了,你解决了吗

#34


引用 33 楼 yaoyaoli1 的回复:
Quote: 引用 32 楼 chenhongbing2010 的回复:

楼主,我也遇到这个问题了,能告诉下你是怎么解决的吗


我也遇到了,你解决了吗
求教,你们都解决了吗?

#35


好久没来,原来结贴了也可以回复,我不是回复说了么,是sdk的版本太低了,升级下sdk就好了啊

#1


#include<windows.h>,可以

#2


引用 1 楼 bdmh 的回复:
#include<windows.h>,可以

试过了,也不行

#3


#include <windows.h>  应该是对的! 

#4


试试 #include "windows.h"

#5


引用 4 楼 jordancar 的回复:
试试 #include "windows.h"


试过了,也不对

#6


刚刚在写代码的时候这个问题又出现了,极度无语中,知道的同学站出来说下吧,不胜感激~~~

#7


这个winbase.h文件应该怎么include到对的呀,抓狂撞墙中,,,

#8


在本地计算机进行搜索后,发现在C:\Program Files\Microsoft SDKs\Windows\v7.0A\Include中的winbase.h里面有这个函数,但系统每次都找到的都是C:\Program Files\Microsoft Visual Studio\VC98\Include中的winbase.h。

是不是因为配置选项的include中,C:\Program Files\Microsoft Visual Studio\VC98\Include在C:\Program Files\Microsoft SDKs\Windows\v7.0A\Include的前面导致的?试着将两项换一下位置

#9


引用 8 楼 pengchy 的回复:
在本地计算机进行搜索后,发现在C:\Program Files\Microsoft SDKs\Windows\v7.0A\Include中的winbase.h里面有这个函数,但系统每次都找到的都是C:\Program Files\Microsoft Visual Studio\VC98\Include中的winbase.h。

是不是因为配置选项的include中,C:\Program Fi……


换了又会出现另外一个问题:2、在Tools->Options->Directories中将C:\Program Files\Microsoft SDKs\Windows\v7.0A\Include换到最上方,又出现另一个错误:cannot open include file 'sal.h',仍然失败。

#10


可能是VC6生成的程序吧,将_WIN32_WINNT定义 为0x0400 或0x0500

#11


引用 10 楼 ltqin 的回复:
可能是VC6生成的程序吧,将_WIN32_WINNT定义 为0x0400 或0x0500


不好意思,请问应该在哪里将_WIN32_WINNT定义 为0x0400 或0x0500?

#12


查MSDN是Windows程序员必须掌握的技能之一。
ms-help://MS.VSCC.v90/MS.MSDNQTR.v90.chs/sysinfo/base/getsystemtimes.htm
GetSystemTimes Function

Retrieves system timing information. On a multiprocessor system, the values returned are the sum of the designated times across all processors.


BOOL WINAPI GetSystemTimes(
  __out         LPFILETIME lpIdleTime,
  __out         LPFILETIME lpKernelTime,
  __out         LPFILETIME lpUserTime
);

Parameters
lpIdleTime 
A pointer to a FILETIME structure that receives the amount of time that the system has been idle.

lpKernelTime 
A pointer to a FILETIME structure that receives the amount of time that the system has spent executing in Kernel mode (including all threads in all processes, on all processors).

lpUserTime 
A pointer to a FILETIME structure that receives the amount of time that the system has spent executing in User mode (including all threads in all processes, on all processors).

Return Value
If the function succeeds, the return value is nonzero. 

If the function fails, the return value is zero. To get extended error information, call GetLastError.

Remarks
To compile an application that uses this function, define _WIN32_WINNT as 0x0501 or later. For more information, see Using the Windows Headers.

Requirements
Client
 Requires Windows Vista or Windows XP SP1.
 
Server
 Requires Windows Server 2008 or Windows Server 2003.
 
Header
 Declared in Winbase.h; include Windows.h.
 
Library
 Use Kernel32.lib.
 
DLL
 Requires Kernel32.dll.
 

See Also
FILETIME
System Time
Time Functions



Send comments about this topic to Microsoft 

Build date: 8/15/2007

#13


应该是动态库没有链接 吧

#14


放到当前目录下用""都搞不定是不是应该换个编译器试试,或者重装一下!

#15


引用 11 楼 rabbiting 的回复:
引用 10 楼 ltqin 的回复:

可能是VC6生成的程序吧,将_WIN32_WINNT定义 为0x0400 或0x0500


不好意思,请问应该在哪里将_WIN32_WINNT定义 为0x0400 或0x0500?

一般在 stdafx.h中,如果没有自己定义

你看看winbase.h文件,如果_WIN32_WINNT小于0x0400,GetSystemTimes是没有定义的(#ifdef...)

#16


引用 12 楼 zhao4zhong1 的回复:
查MSDN是Windows程序员必须掌握的技能之一。
ms-help://MS.VSCC.v90/MS.MSDNQTR.v90.chs/sysinfo/base/getsystemtimes.htm
GetSystemTimes Function

Retrieves system timing information. On a multiprocessor system, the va……

Remarks
To compile an application that uses this function, define _WIN32_WINNT as 0x0501 or later. For more information, see Using the Windows Headers.

可以在工程设置里定义
工程属性--〉C/C++ --> Preprocessor --> Preprocessor Definitions里加上_WIN32_WINNT=0x0501

#17


不那是没有头文件吧 
  #include <atltime.h>  你加进去看下应该是可以的哦!
MSDN上面很明确说明了 要加这个头文件的

#18


引用 15 楼 ltqin 的回复:
引用 11 楼 rabbiting 的回复:

引用 10 楼 ltqin 的回复:

可能是VC6生成的程序吧,将_WIN32_WINNT定义 为0x0400 或0x0500


不好意思,请问应该在哪里将_WIN32_WINNT定义 为0x0400 或0x0500?

一般在 stdafx.h中,如果没有自己定义

你看看winbase.h文件,如果_WIN32_WINN……


我检查过了,那个winbase.h文件中就根本没有GetSystemTimes这串字符,搜索不到。

#19


引用 12 楼 zhao4zhong1 的回复:
查MSDN是Windows程序员必须掌握的技能之一。
ms-help://MS.VSCC.v90/MS.MSDNQTR.v90.chs/sysinfo/base/getsystemtimes.htm
GetSystemTimes Function

Retrieves system timing information. On a multiprocessor system, the va……


查过了,具体原因不是在这里

#20


引用 14 楼 dyangrun 的回复:
放到当前目录下用""都搞不定是不是应该换个编译器试试,或者重装一下!


编译器是不能换了,重装过了,也没用

#21


Requirements
Client
 Requires Windows Vista or Windows XP SP1.
 
Server
 Requires Windows Server 2008 or Windows Server 2003.
 
Header
 Declared in Winbase.h; include Windows.h.
 
Library
 Use Kernel32.lib.
 
DLL
 Requires Kernel32.dll.
 

前提是你使用的操作系统中的Kernel32.dll中有这个导出函数!

#22


以及你链接器链接时用的Kernel32.lib里面也有这个导出函数!

#23


查Kernel32.dll和Kernel32.lib中是否有GetSystemTimes导出函数用命令行
dumpbin.exe /EXPORTS Kernel32.lib | find "GetSystemTimes"
dumpbin.exe /EXPORTS Kernel32.dll | find "GetSystemTimes"
 

#24


#include <windows.h>

#25


引用 18 楼 rabbiting 的回复:
引用 15 楼 ltqin 的回复:
引用 11 楼 rabbiting 的回复:

引用 10 楼 ltqin 的回复:

可能是VC6生成的程序吧,将_WIN32_WINNT定义 为0x0400 或0x0500


不好意思,请问应该在哪里将_WIN32_WINNT定义 为0x0400 或0x0500?

一般在 stdafx.h中,如果没有自己定义

你看看winb……


是GetSystemTime()函数,而不是GetSystemTimes()函数啊,后面没有s

#26


了GetSystemTimes
楼主函数名写错了。
是GetSystemTime

#27


引用 25 楼 ltqin 的回复:
引用 18 楼 rabbiting 的回复:

引用 15 楼 ltqin 的回复:
引用 11 楼 rabbiting 的回复:

引用 10 楼 ltqin 的回复:

可能是VC6生成的程序吧,将_WIN32_WINNT定义 为0x0400 或0x0500


不好意思,请问应该在哪里将_WIN32_WINNT定义 为0x0400 或0x0500?

一般在 std……


我要用的就是GetSystemTimes函数,没写错

#28


引用 26 楼 legionalways 的回复:
了GetSystemTimes
楼主函数名写错了。
是GetSystemTime


不是哦,这是两个不一样的函数,我没写错

#29


问题找到原因了,是我的SDK版本太低了,要升级下SDK才会有GetSystemTimes这个函数。
谢谢大家的帮助哈~尤其是zhao4zhong1,散分~

#30


楼主
怎么解决的,我也遇到这个问题

#31


参照MSDN说明
Requirements
Client: Included in Windows XP SP1.
Server: Included in Windows Server 2003.
Header: Declared in Winbase.h; include Windows.h.
Library: Use Kernel32.lib.

发现接口是在 Winbase.h 文件中声明的,就打开看看,发现声明如下:
#if _WIN32_WINNT >= 0x0501

BOOL
WINAPI
GetSystemTimes(
    LPFILETIME lpIdleTime,
    LPFILETIME lpKernelTime,
    LPFILETIME lpUserTime
    );

#endif // (_WIN32_WINNT >= 0x0501)

注意,这个宏 #if _WIN32_WINNT >= 0x0501 ,它的意思是,只有当windows版本高于0x0501,也就是WinXP SP1时,声明才有效,原来如此!

修改头文件声明为:
#define _WIN32_WINNT 0x0501
#include <Windows.h>

#32


楼主,我也遇到这个问题了,能告诉下你是怎么解决的吗

#33


引用 32 楼 chenhongbing2010 的回复:
楼主,我也遇到这个问题了,能告诉下你是怎么解决的吗


我也遇到了,你解决了吗

#34


引用 33 楼 yaoyaoli1 的回复:
Quote: 引用 32 楼 chenhongbing2010 的回复:

楼主,我也遇到这个问题了,能告诉下你是怎么解决的吗


我也遇到了,你解决了吗
求教,你们都解决了吗?

#35


好久没来,原来结贴了也可以回复,我不是回复说了么,是sdk的版本太低了,升级下sdk就好了啊