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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 克莱因瓶莫比乌斯带_克莱因瓶剪莫比乌斯带

    克莱因瓶莫比乌斯带_克莱因瓶剪莫比乌斯带  [克莱茵瓶&莫比乌斯带]在1882年,著名数学家菲立克斯·克莱因(FelixKlein)发现了后来以他的名字命名的著名“瓶子”。这是一个象球面那样封闭的(也就是说没有边)曲面,但是它却只有一个面。在图片上我们看到,克莱因瓶的确就象是一个瓶子。但是它没有瓶底,它的瓶颈被拉长,然后似乎是穿过了瓶壁,最后瓶颈和瓶底圈连在了一起。如果瓶颈不穿过瓶壁而…

    2025年11月6日
    4
  • tp5 $_ENV获取不到数据

    tp5 $_ENV获取不到数据

    2021年10月13日
    90
  • VS2017专业版使用最新版Qt5.9.2教程(最新教材)

    VS2017专业版使用最新版Qt5.9.2教程(最新教材)VS2017专业版使用最新版Qt5.9.2教程(最新教材)目录VS2017专业版使用最新版Qt5.9.2教程(最新教材)运行环境:1.安装Qt5.9.22.安装Qt5.9与VS2017之间的插件:3.配置QtVSTool的环境.4.设置创建的Qt的项目的属性,对包含目录、引用目录、库目录进行环境配置5.Qt的环境变量配置6.开心,开心,开心的样子,运行成功…

    2022年6月7日
    53
  • response的contentType 几种类型

    response的contentType 几种类型response的contentType 几种类型

    2022年4月22日
    129
  • COLA 4.0:应用架构的最佳实践

    COLA 4.0:应用架构的最佳实践前几天和几个饿了么的同学聊天,一听说他们还在使用COLA1.0,我二话没说,90度鞠躬,赔礼道歉,虚心聆听他们的吐槽。COLA的初衷旨在控制复杂度,救码农于水火,惭愧的是,早期的思想不成熟,设计也多有缺陷,不仅没帮到他们,反而坑了他们,实在抱歉。实际上,我在COLA3.0迭代的时候,已经举起奥卡姆剃刀,砍掉了很多东西。然而还不够,主要体现在对架构的思考还不够透彻。因此,经过仔细反思,有了这一版最新的COLA4.0,期望回归初心,让COLA真正成为应用架构的最佳实践,帮助广大的业务技术同学,脱离酱缸

    2022年5月24日
    52
  • log4j自定义layout_log4j使用教程

    log4j自定义layout_log4j使用教程如果使用pattern布局就要指定的打印信息的具体格式ConversionPattern,打印参数如下:   %m输出代码中指定的消息    %p输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL    %r输出自应用启动到输出该log信息耗费的毫秒数    %c输出所属的类目,通常就是所在类的全名    %t输出产生该日志事件的线

    2022年8月22日
    12

发表回复

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

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