windows函数入口问题 UNREFERENCED_PARAMETER的用处 _tWinMain与wWinMain又有什么区别
windows函数入口问题
以下四种组合,可以实现console和windows模式的混合,可以达到不弹出DOS窗口的效果,也可以达到在Windows程序中向控制台输出printf信息的目的。
#pragma comment( linker, "/subsystem:windows /entry:WinMainCRTStartup" )
#pragma comment( linker, "/subsystem:windows /entry:mainCRTStartup" )
#pragma comment( linker, "/subsystem:console /entry:mainCRTStartup" )
#pragma comment( linker, "/subsystem:console /entry:WinMainCRTStartup" )
/ENTRY:mainCRTStartup
/ENTRY:wmainCRTStartup
/ENTRY:WinMainCRTStartup
/ENTRY:wWinMainCRTStartup
它们对应的入口函数分别是main,wmain,WinMain,wWinMain
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
// ...
}
int main(void)
{
// ...
}
2) UNREFERENCED_PARAMETER的用处
作用:告诉编译器,已经使用了该变量,不必检测警告!
在VC编译器下,如果您用最高级别进行编译,编译器就会很苛刻地指出您的非常细小的警告。当你生命了一个变量,而没有使用时,编译器就会报警告:
“warning C4100: ''XXXX'' : unreferenced formal parameter.”
所以,为了让编译器不必检测你的警告,就使用UNREFERENCED_PARAMETER语句。比如:
int SomeFunction(int arg1, int arg2)
{
UNREFERENCED_PARAMETER(arg2)
...
}
===============================================================================
|
作者简介 Paul DiLascia 是一名自由作家,顾问和 Web/UI 设计者。他是《Writing Reusable Windows Code in C++》书(Addison-Wesley, 1992)的作者。通过http://www.dilascia.com 可以获得更多了解。 |
本文出自 MSDN Magazine 的May 2005 期刊,可通过当地报摊获得,或者最好是 订阅 |
3) _tWinMain与wWinMain又有什么区别呢
MFC封装了WIN API.大家都知道.但是MFC应用程序的真正流程又有多少人知道呢?
下面就是我对MFC启动代码的一些剖析.
在TCHAR.H里,有这么2小段define.通过我的简化,我们可以看到:
//TCHAR.H
#ifdef _UNICODE
#define _tWinMain wWinMain
#else
#define _tWinMain WinMain
#endif
由于为了支持UNICODE,C运行库对WinMain其实区分了UNICODE版和ANSI版.对UNICODE版的程序,C运行库将调用wWinMain,而对于ANSI版的应用,则调用WinMain.这是第一点.
然后,其实MFC的代码设计时是自动支持UNICODE的,所以,MFC的WinMain在APPMODUL.CPP被定义为
_tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
这样以一来,无论用户#define _UNICODE与否,MFC的WinMain都会被调用.接下来,_tWinMain的实际运作如下:
extern "C" int WINAPI
_tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPTSTR lpCmdLine, int nCmdShow)
{
// call shared/exported WinMain
return AfxWinMain(hInstance, hPrevInstance, lpCmdLine, nCmdShow);
}
这样,AfxWinMain就和MFC挂上了钩.甚至在PETER NORTON的书中,都仅讲到了AfxWinMain乃是MFC的WinMain,但是,NORTON同志看来没有讲述清楚这点.因为,WinMain仍然是WinMain,C运行库并没有因为MFC的存在而重新设计AfxWinMain的入口.
在MS的AfxWinMain(WINMAIN.CPP)里我们可以看到如下代码:
int AFXAPI AfxWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPTSTR lpCmdLine, int nCmdShow)
{
ASSERT(hPrevInstance == NULL);
int nReturnCode = -1;
CWinThread* pThread = AfxGetThread();
CWinApp* pApp = AfxGetApp();
// AFX internal initialization
if (!AfxWinInit(hInstance, hPrevInstance, lpCmdLine, nCmdShow))
goto InitFailure;
// App global initializations (rare)
if (pApp != NULL && !pApp->InitApplication())
goto InitFailure;
// Perform specific initializations
if (!pThread->InitInstance())
{
if (pThread->m_pMainWnd != NULL)
{
TRACE0("Warning: Destroying non-NULL m_pMainWnd/n");
pThread->m_pMainWnd->DestroyWindow();
}
nReturnCode = pThread->ExitInstance();
goto InitFailure;
}
nReturnCode = pThread->Run();
InitFailure:
#ifdef _DEBUG
// Check for missing AfxLockTempMap calls
if (AfxGetModuleThreadState()->m_nTempMapLock != 0)
{
TRACE1("Warning: Temp map lock count non-zero (%ld)./n",
AfxGetModuleThreadState()->m_nTempMapLock);
}
AfxLockTempMaps();
AfxUnlockTempMaps(-1);
#endif
AfxWinTerm();
return nReturnCode;
}
windows函数入口问题 UNREFERENCED_PARAMETER的用处 _tWinMain与wWinMain又有什么区别相关推荐
- Win32编程-头文件与函数入口
#include <windows.h> //#include <tchar.h>int WINAPI WinMain(HINSTANCE hInstance, HINSTAN ...
- 【Android 逆向】函数拦截实例 ( ② 插桩操作 | 保存实际函数入口 6 字节数据 | 在插桩的函数入口写入跳转指令 | 构造拼接桩函数 )
文章目录 前言 一.函数拦截需要的几个参数 二.插桩前先保存实际函数入口 6 字节数据 三.在插桩的函数入口写入跳转指令 | 构造拼接桩函数 前言 [Android 逆向]函数拦截实例 ( 函数拦截流 ...
- 【Flutter】Dart 技巧 ( 独立主函数入口 | 可空类型判定 | 默认值设定 )
文章目录 一.独立主函数入口 二.可空类型判定 三.默认值设定 四.完整代码示例 五. 相关资源 一.独立主函数入口 在 dart 文件中声明 main() 函数 , 即可脱离 Flutter 环境 ...
- Windows函数错误处理
当调用一个Windows函数时,它首先要检验传递给它的各个参数的有效性,然后再设法执行任务.如果传递一个无效参数,或者由于某种原因无法执行这项操作,那么操作系统就会返回一个值,指明该函数在某种程度上运 ...
- caffe函数入口caffe.cpp详解
概览 这篇博客解析caffe函数入口caffe.cpp,主要内容为caffe启动框架,基本不涉及深度学习的具体内容,内容十分基础,适合新手阅读.下面所有的代码解析都以训练lenet手写数字体识别为例, ...
- Windows程序入口
程序入口 标准的Windows程序入口 #include<windows.h>int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPre ...
- d3d透视逆向篇:第6课 通过特征码定位D3D函数入口地址
本逆向安全章节是我业余之间编写的,也借鉴了前辈的经验来给大家做一个简单的文字逆向安全教程,欢迎大家讨论和指正,共同学习.禁止非法用途.教程我从最简单的开始给大家做一个简单的讲解d3d 类的3d游戏和f ...
- Javascript防抖函数节流函数的介绍(最详细)、彻底搞懂防抖节流的区别以及使用第三方库的防抖节流函数
文章目录 1.防抖节流函数介绍 1.1 认识防抖节流函数 1.2 认识防抖函数 1.3 防抖函数应用 1.4 认识节流函数 1.5 节流函数应用 1.6 生活中的例子 2.Underscore库 2. ...
- python主函数入口_Python 入口函数(菜鸟入门)
Python 入口函数(菜鸟入门) 最近在组内研究专项项目,其中的一个现有工具是用 Python 开发的,我的目标是对这款工具的流程进行优化.虽然可以找到对应的开发者了解现有流程,然后结合我的研究提出 ...
- python主函数入口_python类 + mian()函数
main函数 import sklearn import numpy as np print(sklearn) # print("hello") ra = np.random.ra ...
最新文章
- eclipse配置struts.xml自动提示
- 【ROM修改教程】添加高级电源重启菜单(安卓4.0.4官方ROM)
- javascript箭头函数和this的指向问题
- 活动延期通知 | 7.31 阿里云 Serverless Developer Meetup 杭州站本周六见!
- PHP-RSA加密跨域通讯实战
- 网站搭建从零开始(三)域名解析
- Linux获取本机hostname函数,Linux下获得主机与域名-gethostbyname和gethostbyaddr
- 真格量化——50etf与期权对冲策略
- Problem E: 校庆
- stringbuffer判断是否为空
- 番茄时间管理法(Pomodoro Technique)
- linux服务器离线安装python第三方库
- 数据库锁,事务特性,脏读,幻读,不可重复度,隔离级别,分布式事务,本地事务的介绍
- oracle18c创建数据库,Oracle 18C 手工创建CDB
- css中relative、absolute和float
- 天河二号上运行ZHT(a zero-hop distributed table)
- 408复习经验先写到这,后面再补充
- 软件测试人员分工【管理层必看】
- pdf文件过大如何缩小上传
- 用串口(TFTP)给设备升级程序
热门文章
- python爬虫系统知识_网络爬虫基础知识(Python实现)
- python正则匹配_Python中的正则表达式(re)
- php 变量 unset,在PHP中unset变量
- 一句话菜刀 php eval,如何基于菜刀PHP一句话实现单个文件批量上传?
- java public就是可选吗_java 中的public
- python仿真电力系统自动化技术_基于MSAA的自动化封装和设计—python版(转)
- 查看mysql下的内容
- Angr安装与使用之使用篇(一)
- 23.3.3 Web存储机制【JavaScript高级程序设计第三版】
- 阿里大于短信返回XML