FILETIME类型到LARGE_INTEGER类型的转换

核心编程第5版 245页到247页的讲到SetWaitableTimer函数的使用 其中提到 FILETIME类型到LARGE_INTEGER类型的转换问题,如下代码
	//我们声明的局部变量
	HANDLE hTimer;
	SYSTEMTIME st;
	FILETIME ftLocal, ftUTC;
	LARGE_INTEGER liUTC;

	//创建自动重置计时器
	hTimer = CreateWaitableTimer(NULL,FALSE,NULL);

	//第一次触发时间是在2008年1月1日,在下午1:00(当地时间)。
	st.wYear = 2008;		//年
	st.wMonth = 1;			//1月
	st.wDayOfWeek = 0;		//忽略
	st.wDay = 1;			//1日
	st.wHour = 13;			//下午1点
	st.wMinute = 0;			//一个小时的第0分
	st.wSecond = 0;			//一个分钟的第0秒
	st.wMilliseconds = 0;	//一秒的第0毫秒

	SystemTimeToFileTime(&st, &ftLocal);

	//将本地时间转换为UTC时间
	LocalFileTimeToFileTime(&ftLocal, &ftUTC);

	//转换 FILETIME类型 为 LARGE_INTEGER类型 因为这2个类型的对齐方式不同
	liUTC.LowPart = ftUTC.dwLowDateTime;
	liUTC.HighPart = ftUTC.dwHighDateTime;

	//设置时间
	SetWaitableTimer(hTimer, &liUTC, 6 * 60 * 60 * 1000,   
		NULL, NULL, FALSE);
书上说到
虽然FILETIME 结构和LARGE_INTEGER结构具有完全相同的二进制格式,但是这两个结构的对齐方式是不同的。 所有FILETIME结构的地址必须对齐到32位边界(即地址是4的整数倍),而所有LARGE_INTEGER结构的地址则必须对齐到64位边界(即地址是8的整数倍)。调用SetWaitableTimer并传入FILETIME结构 是否能够正常工作,取决于FILETIME结构 是否正好在64位边界上。但是,编译器会确保LARGE_INTEGER结构的地址始终都在64位边界上,因此正确的做法(任何时候都能够正常工作的做法)是先把FILETIME的成员复制到LARGE_INTEGER的成员中,然后再把LARGE_INTEGER的地址传给SetWaitableTimer。

转载于:https://www.cnblogs.com/zero5/p/3604034.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值