关于main与wmain函数
最近写一个控制台程序,并且希望该控制台程序运行时不显示控制台窗口,于是在程序include语句下面加入如下代码
#pragma comment (linker,"/subsystem:\"windows\" /entry:\"mainCRTStartup\"")
而原先的控制台程序入口为int wmain(int argc, _TCHAR* argv[]),必须要改为main才能编译通过
但是问题来了,原来运行没问题的代码,现在出问题了
if ((argc > 1) && ((*argv[1] == L'-') || (*argv[1] == L'/'))){
if (__wcsicmp(L"set", argv[1] + 1) == 0){
}
}
通过打印,调试后发现,我在控制台中输入命令***.exe /set,argv[1] + 1 读取到的内容为et,
而在int wmain(int argc, _TCHAR* argv[])函数中argv[1] + 1 读取到的内容为set。Why?
后来查了一下这两个函数的区别,发现有如下特点:
1、main()是WINDOWS的控制台程序(32BIT)或DOS程序(16BIT),
2、WinMain()是WINDOWS的GUI程序,
3、 wmain()是UNICODE版本的main(),wmain也是main的另一個别名,是为了支持二个字节的语言环境
4、_tmain()是个宏,如果是UNICODE则他是wmain()否则他是main()
因此分析,在main(int argc, _TCHAR* argv[])和wmain(int argc, _TCHAR* argv[])两种情况下
同样输入***.exe /set
wmain中argv[1] = "/" ,占两个字节
main中argv[1] = "/s" ,占两个字节
argv[1]均是双字节变量,而在wmain入口中,用户的输入字符,每个字符按UNICODE方式存储,
而在main入口中,用户的输入字符,每个字符按ANSCII方式存储。
因此修改如下:
if ((argc > 1) && ((*argv[1] == L'-') || (*argv[1] == L'/'))){
if (_stricmp("set", argv[1] + 1) == 0){
}
}
关于main与wmain函数的更多相关文章
- 解决:C++ 中 main函数 wmain函数 _tmain函数 WinMain函数 wWInMain函数 _tWinMain函数的区别
main函数与WinMain函数区别: 前者为控制台程序入口主函数,后者为Windows API窗体程序入口函数,在windef.h文件中定义. main函数与wmain函数 | WinMain函数与 ...
- public static void main(String[] args){}函数诠释
public static void main(String[] args){}函数诠释 主函数的一般写法如下: public static void main(String[] args){-} 下 ...
- c# 可以有多个Main()函数
可以有多个Main()函数,这样写:namespace ConsoleApp1{class Program{static void Main(string[] args){Console.WriteL ...
- MDK调试无法进入main()函数
今天在用MDK调试stm32时出现了无法进入main函数,进入startup文件的情况. 在网上查找资料时发现,MDK调试设置断点最多只能设置5个.在减少断点后,调试果然能够正常进入main()函数了 ...
- public static void main(String[] args){}函数理解
主函数的一般写法如下: public static void main(String[] args){…} 下面分别解释这些关键字的作用: (1)public关键字,这个好理解,声明主函数为publi ...
- 命令行参数 main()函数设计
一.main()函数的形式 int main( void )--无参数形式 { ... return 0; } int main( int argc, char *argv[] )--带参数形式 { ...
- Qt Windows下链接子系统与入口函数(终结版)(可同时存在main和WinMain函数)
Qt Windows下链接子系统与入口函数(终结版) 转载自:http://blog.csdn.net/dbzhang800/article/details/6358996 能力所限,本讨论仅局限于M ...
- C语言与汇编的嵌入式编程:main中模拟函数的调用(两数交换)
编写一个两数交换函数swap,具体代码如下: #include<stdio.h> void swap(int *p1,int *p2) { int temp; temp = *p1; *p ...
- c/c++的函数参数压栈顺序
整理日:2015年3月18日 为了这句话丢了很多次人.无所谓了,反正咱脸皮厚. 总结一下 编译出来的c/c++程序的参数压栈顺序只和编译器相关! 下面列举了一些常见的编译器的调用约定 VC6 调用约定 ...
随机推荐
- 笨办法学Python(三十六)
习题 36: 设计和调试 现在你已经学会了“if 语句”,我将给你一些使用“for 循环”和“while 循环”的规则,一面你日后碰到麻烦.我还会教你一些调试的小技巧,以便你能发现自己程序的问题.最后 ...
- MySQL入门很简单: 7 触发器
触发器是由事件来触发某个操作,这些事件包括INSERT语句,UPDATE语句和DELETE语句 1.创建触发器 1)创建只有一个执行语句的触发器 例子:再向department表中执行INSERT操作 ...
- 如何在CRM WebClient UI里使用HANA Live Report
1. 使用业务角色ANALYTICSPRO登录SAP CRM WebClient UI: 点击新建按钮创建一个新的HANA live report: 类型选择SHL: 弹出窗口,维护report的名称 ...
- IOS照相机的启动,图片的读取,存储demo
#import @interface ViewController : UIViewController@property (retain, nonatomic) IBOutlet UIImageVi ...
- 【转】Android tools:context
tools:context="com.example.guolin.scrollertest.MainActivity" 有时候可以看到有这个东西,但是从来没有用过,不知道有什么作 ...
- python 3+djanjo 2.0.7简单学习(三)--Django 管理页面
django里自带了一个管理页面,也就是后台,下面来学习一下 1.创建超级管理员 python manage.py createsuperuser 键入你想要使用的用户名,然后按下回车键: Usern ...
- 缓冲区溢出实战教程系列(三):利用OllyDbg了解程序运行机制
想要进行缓冲区溢出的分析与利用,当然就要懂得程序运行的机制.今天我们就用动态分析神器ollydbg来了解一下在windows下程序是如何运行的. 戳这里看之前发布的文章: 缓冲区溢出实战教程系列(一) ...
- @NotEmpty、@NotNull、@NotBlank 的区别
@NotEmpty 用在集合上面(不能注释枚举) @NotBlank用在String上面 @NotNull用在所有类型上面 1. @NotEmpty Asserts that the annotate ...
- git 学习笔记 window操作系统
一.准备工作 1.设置好操作者和邮箱 $ git config --global user.name "Your Name" $ git config --global user. ...
- React Native ref高级用法&&setNativeProps使用
ref属性不只是string ref属性不仅接受string类型的参数,而且它还接受一个function作为 callback.这一特性让开发者对ref的使用更加灵活. render() { retu ...