//-----------------------------------------
//本程序展示了如何实现MessageBoxPrintf函数
//本函数能像printf那样格式化输出
//摘录自:《windows程序设计第五版》
//-----------------------------------------
#include<windows.h>
#include<tchar.h>
#include<stdio.h>int CDECL MessageBoxPrintf(TCHAR * szCaption, TCHAR * szFormat, ...)
{TCHAR szBuffer[1024];va_list pArgList;va_start (pArgList, szFormat);_vsntprintf_s(szBuffer,sizeof(szBuffer)/sizeof(TCHAR), sizeof(szBuffer) / sizeof(TCHAR),szFormat, pArgList);//---------------------------------------------------------------------------------------------------------------------------------//原文使用_vsntprintf(szBuffer, sizeof(szBuffer) / sizeof(TCHAR),szFormat, pArgList); vs认为此函数具有安全性问题 因此我替换成上边的函数//---------------------------------------------------------------------------------------------------------------------------------
    va_end(pArgList);return MessageBox(NULL,szBuffer,szCaption,0);
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{int cxScreen;int cyScreen;cxScreen = GetSystemMetrics(SM_CXSCREEN);cyScreen = GetSystemMetrics(SM_CYSCREEN);MessageBoxPrintf(TEXT("SCREEN SIZE"),TEXT("您的视屏显示器:\nWIDE:%i\nHIGH: %i"),cxScreen,cyScreen);return 0;
}

这个函数使用了可变参数 这样就出现了一些陌生的东西,解释如下

CDECL

__cdecl __fastcall与__stdcall,三者都是调用约定(Calling convention),它决定以下内容:1)函数参数的压栈顺序,2)由调用者还是被调用者把参数弹出栈,3)以及产生函数修饰名的方法。
1、__stdcall调用约定:函数的参数自右向左通过栈传递,被调用的函数在返回前清理传送参数的内存栈。
2、_cdecl是C和C++程序的缺省调用方式。每一个调用它的函数都包含清空堆栈的代码,所以产生的可执行文件大小会比调用_stdcall函数的大。函数采用从右到左的压栈方式。注意:对于可变参数的成员函数,始终使用__cdecl的转换方式。
3、__fastcall调用约定:它是通过寄存器来传送参数的(实际上,它用ECX和EDX传送前两个双字(DWORD)或更小的参数,剩下的参数仍旧自右向左压栈传送,被调用的函数在返回前清理传送参数的内存栈)。

va_start va_end等

函数名称,读取可变参数的过程其实就是在堆栈中,使用指针,遍历堆栈段中的参数列表,从低地址到高地址一个一个地把参数内容读出来的过程

#define va_start(ap,v) ( ap = (va_list)&v + _INTSIZEOF(v) ) //第一个可选参数地址
#define va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) ) //下一个参数地址
#define va_end(ap) ( ap = (va_list)0 ) // 将指针置为无效

在学习windows程序设计时此函数可以给c/c++程序员一份熟悉感。。。。。。。。。。。

转载于:https://www.cnblogs.com/xdblog/p/4821517.html

wndows程序设计之书籍知识与代码摘录-封装一个类似printf的messagebox相关推荐

  1. java绘制聊天气泡代码_封装一个canvas画对话气泡的函数

    quadraticCurveTo(cp1x, cp1y, x, y) 绘制二次贝塞尔曲线,cp1x,cp1y为一个控制点,x,y为结束点.开始点由moveTo,或者前面一次的结束点作为下次调用的开始点 ...

  2. c语言设计知识,C语言程序设计的初步知识.doc

    C语言程序设计的初步知识.doc 第二章 C语言程序设计的初步知识一.选择题1在C 语言中,下列类型属于构造类型的是 .(0级) A)整型 B)字符型 C)实型 D)数组类型2在C 语言中,下列类型属 ...

  3. 如果t是整数用c语言表达式,C语言程序设计习题及习题参考答案 任文 孔庆彦 全书习题及习题参考答案 第2章 C程序设计的初步知识.pdf...

    第 2 章 C 程序设计的初步知识 2-1 选择题 1.以下不能用作用户标识符的是( ) A)_26 B)case C)scanf D)Double 2 .C 语言中的数据的基本类型包括( ) A)整 ...

  4. C语言人民币的构造的关键,C语言程序设计 教学课件 任文 孔庆彦电子课件 全书习题及习题参考答案 第2章 C程序设计的初步知识.pdf...

    第 2 章 C 程序设计的初步知识 2-1 选择题 1.以下不能用作用户标识符的是( ) A)_26 B)case C)scanf D)Double 2 .C 语言中的数据的基本类型包括( ) A)整 ...

  5. (十二) 完整注释的代码摘录

    title: 完整注释的代码摘录 date: 2019/4/23 20:40:00 toc: true --- 完整注释的代码摘录 作者网页 #include <linux/kernel.h&g ...

  6. 从文本中提取知识图谱代码比较好的,代码对齐,可以使用的

    从文本中提取知识图谱代码比较好的,代码对齐,可以使用的 https://blog.csdn.net/fendouaini/article/details/102987373 https://blog. ...

  7. ruby网站部署到服务器,入门知识: 把代码部署到服务器, SSH

    入门知识: 把代码部署到服务器, SSH 2015-07-28 16:28 访问量: 2868 分类: 技术 如何登陆远程服务器呢? $ ssh root@your.server.com -p 334 ...

  8. python内置函数用来打开或创建文件_2020年《python程序设计》基础知识及程序设计598题XS[含参考答案]...

    2020年<python程序设计>基础知识及程序设计 598题[含参考答案] 一.填空题 1.表达式 len('中国'.encode('utf-8')) 的值为___________.(6 ...

  9. 沈航C语言上机实验题答案,大学大一c语言程序设计实验室上机题全部代码答案(实验报告).doc...

    大学大一c语言程序设计实验室上机题全部代码答案(实验报告) C语言实验报告 实验1-1: hello world程序: 源代码: #include main() { printf("hell ...

最新文章

  1. 智能车竞赛车模轮子与电机齿轮的参数
  2. 实例介绍,如何在开发中将各层日志归类输出.
  3. reuse project css less path folder hierarchy issue
  4. react 最佳入门_miaov-React 最佳入门
  5. 前端学习(3254):react中todolist制作静态组件
  6. 比较文本差异的工具_Linux 开发的五大必备工具 | Linux 中国
  7. windows下Apache虚拟主机配置
  8. Linux 命令(77)—— killall 命令
  9. 类库、通用变量、is和as、委托
  10. Office 2007无法卸载也无法安装的解决
  11. 管理学定律七:责任分散效应与帕金森定律
  12. 如何看到并删除电脑的操作记录
  13. 2022年身份证号码信息查询API接口分享
  14. 橙单微服务的权限部分之过滤规则
  15. c语言中查重,体验CCleaner查重功能,快速找出电脑中的重复文件
  16. C++最佳实践 | 5. 可移植性及多线程
  17. js的初识及数据类型简介
  18. 智能城市应用中的安全和隐私:挑战和解决方案
  19. 安卓贴图源码---记录旋转后位置..类似in/百度魔图
  20. saveOrUpdate Transaction silently rolled back because it has been marked as rollback-only

热门文章

  1. 淘宝开放API,很不错
  2. win8 软件字体乱码
  3. TinyXML保存UTF-8编码的XML
  4. 一些web开发中常用的、做成cs文件的js代码 - 搜刮来的
  5. STL之string类型
  6. 数据结构之链式栈的一些基本操作
  7. NumPy常用属性及方法
  8. 浅谈面向对象的javascript几个特性
  9. Android倒计时工具类
  10. ASP.NET AJAX入门系列(10):Timer控件简单使用