C++ 使用LockWorkStation()的过程遇到的问题[通俗易懂]

C++ 使用LockWorkStation()的过程遇到的问题[通俗易懂]关于函数“LockWorkStation()”,参见:https://msdn.microsoft.com/en-us/library/windows/desktop/aa376875.aspxHo

大家好,又见面了,我是你们的朋友全栈君。

关于函数“LockWorkStation()”,参见:https://msdn.microsoft.com/en-us/library/windows/desktop/aa376875.aspx

How to Lock the Workstation (如何锁定工作站),参见:https://msdn.microsoft.com/zh-cn/library/windows/desktop/aa376869

 

看了MSDN提供的“How to Lock the Workstation”例子,觉得挺蛮简洁的。于是自己也试试,Ctrl + C、Ctrl + V,稍微修改一下。

IDE: Code::Blocks

操作系统:Windows 7 x64

 1 #include <windows.h>
 2 #include <stdio.h>
 3 
 4 #pragma comment( lib, "user32.lib" )
 5 
 6 int main()
 7 {
 8     // Lock the workstation.
 9 
10     if( !LockWorkStation() )
11         printf ("LockWorkStation failed with %lu \n", GetLastError());
12 
13     return 0;
14 }

Build… What the hell? 居然有错!

error: ‘LockWorkStation’ was not declared in this scope

于是各种折腾… 不说,心累啊!

 

上网找,最终找到了解决方法,网友给出的解决方法,http://blog.csdn.net/kelsel/article/details/52758448,还有他找到的参考:http://oldbbs.rupeng.com/thread-4007-1-1.html

 


 

在Code::Blocks中,可以通过右击函数“LockWorkStation()”,Find declaration of: ‘LockWorkStation’定位到该函数所在的头文件“winuser.h”。

 

如果你细心一些,就可以发现,这个函数被限制在条件编译语句里:(我不够细心啊!!!)

#if (_WIN32_WINNT >= 0x0500)
WINUSERAPI BOOL WINAPI LockWorkStation(void);
#endif

只有当_WIN32_WINNT >= 0x0500,LockWorkStation()才能被编译。

 

再看看关于_WIN32_WINNT的定义:

#ifndef WINVER
#define WINVER 0x0400
/*
 * If you need Win32 API features newer the Win95 and WinNT then you must
 * define WINVER before including windows.h or any other method of including
 * the windef.h header.
 */
#endif
#ifndef _WIN32_WINNT
#define _WIN32_WINNT WINVER
/*
 * There may be the need to define _WIN32_WINNT to a value different from
 * the value of WINVER.  I don't have any example of why you would do that.
 * However, if you must then define _WIN32_WINNT to the value required before
 * including windows.h or any other method of including the windef.h header.
 */
#endif

从上面的宏定义,我们可以知道,_WIN32_WINNT的值等于0x0400。

这下清楚了,实际上_WIN32_WINNT小于0x0500,那LockWorkStation()怎么可能会被编译呢?所以只能报错了!

 

解决方法是在包含头文件之前使用“#define WINVER 0x0500”或“#define _WIN32_WINNT 0x0500”。

来,把代码改改:

 1 //#define WINVER 0x0500
 2 #define _WIN32_WINNT 0x0500
 3 
 4 #include <windows.h>
 5 #include <stdio.h>
 6 
 7 using namespace std;
 8 
 9 int main()
10 {
11     // Lock the workstation.
12 
13     if( !LockWorkStation() )
14         printf ("LockWorkStation failed with %lu \n", GetLastError());
15 
16     return 0;
17 }

 

难受,睡个觉。。。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/154953.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • pycharm安装matplotlib_深度学习小白篇一:Anaconda的安装和配置

    pycharm安装matplotlib_深度学习小白篇一:Anaconda的安装和配置一、前言大家知道,深度学习需要使用Python来做开发,所以,想要进入深度学习的战场,我们就必须要先要有python的开发环境作为武器,否则只能干看,而无从下手。子曰:“工欲善其事,必先利其器。”,我们最直接的武器就是编译Python程序的开发环境,一般情况下,我们选择在Python官网下载对应版本的Python然后用记事本编写,再在终端进行编译运行即可。但是对于我这样懒的小白,我喜欢装一些方便的…

    2022年8月28日
  • MySQL触发器

    MySQL在5.0.2版本以上开始支持触发器,触发器是有某些带有命令的时间来触发某些操作,这些事件包括insert语句、delete语句、update语句等。触发器可以用于记录对数据库的操作。1、创

    2021年12月25日
  • Java中如何声明数组「建议收藏」

    Java中如何声明数组「建议收藏」Java语言声明数组有两种形式,以一维数组为例:数组类型 数组名 []; 这种方式是C语言书写习惯数组类型 [] 数组名; 这种方式是Java书写习惯数组的声明方法:数组类型[]数组名={em1,em2,em3,…,emN};//声明数组的时候初始化,一共N个元素,例如:int[]array={3,5,4,8,12,5};//一共六个元素数组类型[]数组名=n

    2022年6月2日
  • 为什么使用框架

    为什么使用框架

    2022年3月12日
  • idea创建java web项目_ideajava创建项目

    idea创建java web项目_ideajava创建项目JavaWeb专栏之(二):Idea创建JavaWeb项目前言:关注:《遇见小Du说》微信公众号,分享更多Java知识,不负每一次相遇。更多内容请访问:www.dushunchang.top在上一篇博客中传送门,小Du带大家了解了什么JavaWeb,B/C与C/S结构,以及Java开发中最常见的MVC三层架构模式。本文章将带大家使用Idea创建JavaWeb项目的教程。在企业开发中,我们经常使用maven构建框架来创建项目,但很多初学者没有接触过Maven构建工具,所以本期教程使用Idea自带的W

    2022年9月20日
  • 开源报表工具 java_java生成报表

    开源报表工具 java_java生成报表BestOpenSourceReportingTools一文列出目前比较好的几种开源报表工具1.BIRTProjectBIRT是基于Eclipse的报表系统,很有竞争力。2.Pentaho侧重于从各种现有系统输出创建产生丰富复杂的报表内容。3.OpenRPTxTupleERPEditions的一部分,侧重ERP领域的报表4.OpenReports基于浏览器参数驱动动态报…

    2022年10月20日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号