首页
社区
课程
招聘
[原创]不包含windows.h和window.h内的任何头文件,弹框 “Hello, world!”
发表于: 2020-10-22 15:11 8097

[原创]不包含windows.h和window.h内的任何头文件,弹框 “Hello, world!”

2020-10-22 15:11
8097

windows应用程序下,不包含windows.hwindow.h内的任何头文件,弹框 “Hello, world!本文主要基于 vs2015 生成的windows应用程序的空工程进行研究,以提高对基础知识的理解。



一、VS基础配置

1.打开VS2015,新建项目----win32控制台应用程序----windows应用程序,附加选项,空项目

 

二、windows应用程序的主入口函数wWinMain

写任何一个函数应该有一个该函数的入口了。我们知道控制台的入口函数是main()函数,那么在写Windows应用程序也是main()吗?回答当然不是了。我们用的是SDK中的WinMain()函数,参考MSDN的说明:

MSDN上已经说明需要包含 Winbase.h或者Windows.h. 那我们需要的挑战就是不使用任何头文件,也能正常弹出提示框MessageBox。


三、具体流程

1、先写主函数内的内容

2、如果直接选择编译以上问题,相信大家看VS提示输出窗口是一大堆,莫名其妙的错误提示

            

            这么多语法错误、未声明的标识符 为啥???

            

            现在我会一点一点的挽回那失去的耐心!优先解决掉未声明的标识符


3、提示“_In_”: 未声明的标识符的问题

     _in 输入参数
            _out 输出参数
            _opt 参数是可选的,就是可以为NULL
           这些宏都被定义为空,只是让程序更容易理解!

解决方法:宏定义

#define _In_

#define _In_opt_


4、C语言语法基础知识:在使用函数之前应该先声明,那么WinMain函数,同样也需要声明,OK,加上

         代码:

5、继续F7编译,还是提示很多报错,不要放弃,继续解决错误


可以新的提示“HINSTANCE”: 未声明的标识符,依次解决掉WinMain函数的所有类型

解决方法:

HINSTANCE“句柄型”数据类型

HWND 是一个基本类型一般指窗口句柄

LPSTR一种字符串数据类型

LPCSTR一种常量字符串数据类型

LPWSTR是wchar_t字符串数据类型

LPCWSTR 常量wchar_t字符串数据类型

UINT是无符号整型数据类型

依次自定义类型

typedef void *HINSTANCE;

typedef void *HWND;

typedef char *LPSTR;


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 2
支持
分享
最新回复 (8)
雪    币: 9626
活跃值: (1838)
能力值: ( LV5,RANK:73 )
在线值:
发帖
回帖
粉丝
2

3、提示“_In_”: 未声明的标识符的问题

     _in 输入参数
            _out 输出参数
            _opt 参数是可选的,就是可以为NULL
           这些宏都被定义为空,只是让程序更容易理解!

_In_ _In_opt_ 这些宏定义时并不为空,它的作用也不只是单纯为了代码好理解,还可以使编译器帮助检查代码。


HINSTANCE“句柄型”数据类型

HWND 是一个基本类型一般指窗口句柄


typedef void *HINSTANCE;

typedef void *HWND;

HINSTANCE 是一个匿名结构指针,代表句柄。单纯 typedef 为一个 void* 会导致意外的隐式转换可能出现。

HWND 同上。


  需要进行宏定义

  #ifdef UNICODE

  #define MessageBox  MessageBoxW

  #else

  #define MessageBox  MessageBoxA

  #endif


      解决:NULL TEXT,MB_OK未知标识符,宏定义走起

      #define __TEXT(quote) L##quote     

      #define TEXT(quote) __TEXT(quote)   

      #define MB_OK   0x00000000L

      #define  NULL 0

      #define WINAPI __stdcall


既然 MessageBox 都使用了 UNICODE 宏定义,那 __TEXT 为什么不用?此时你使用多字节字符集配置编译就 GG 了。

2020-10-22 22:46
0
雪    币: 2466
活跃值: (4561)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
这有什么用吗,,,,,,,,真正有意义的是深层的原因,既然分享知识那还是写的全面一点.....
2020-10-22 23:00
0
雪    币: 2089
活跃值: (3933)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
可以,但没必要。用#pragma命令引入MSVCRT,声明需要导入的函数即可。
2020-10-24 17:15
0
雪    币: 665
活跃值: (1051)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
无CRT的操作最后还是CRT..
2020-10-25 22:30
0
雪    币: 4372
活跃值: (1718)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
厉害!
2021-2-2 10:11
0
雪    币: 200
活跃值: (21)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
虽然意义不大,但我就看着你折腾
2021-2-9 10:52
0
雪    币: 341
活跃值: (1171)
能力值: ( LV3,RANK:24 )
在线值:
发帖
回帖
粉丝
8
这么搞有什么意义?windows.h的头文件中这些都定义好了,居然不用现成的,要自己瞎折腾
2021-2-9 12:19
0
雪    币: 27
活跃值: (127)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9

对 2 楼第二点不认同。如果都不用 windows.h 了,那么将 HINSTANCE 和 HWND 定义 void * 还是结构体指针不都无所谓了吗,哪还会存在什么转换的问题。

最后于 2021-2-20 13:55 被Xenophon编辑 ,原因:
2021-2-20 13:54
0
游客
登录 | 注册 方可回帖
返回
//