wndows程序设计之书籍知识与代码摘录-封装一个类似printf的messagebox
生活随笔
收集整理的這篇文章主要介紹了
wndows程序设计之书籍知识与代码摘录-封装一个类似printf的messagebox
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
//-----------------------------------------
//本程序展示了如何實現(xiàn)MessageBoxPrintf函數(shù)
//本函數(shù)能像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認為此函數(shù)具有安全性問題 因此我替換成上邊的函數(shù)//---------------------------------------------------------------------------------------------------------------------------------
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;
}
這個函數(shù)使用了可變參數(shù) 這樣就出現(xiàn)了一些陌生的東西,解釋如下
CDECL
__cdecl __fastcall與__stdcall,三者都是調(diào)用約定(Calling convention),它決定以下內(nèi)容:1)函數(shù)參數(shù)的壓棧順序,2)由調(diào)用者還是被調(diào)用者把參數(shù)彈出棧,3)以及產(chǎn)生函數(shù)修飾名的方法。 1、__stdcall調(diào)用約定:函數(shù)的參數(shù)自右向左通過棧傳遞,被調(diào)用的函數(shù)在返回前清理傳送參數(shù)的內(nèi)存棧。 2、_cdecl是C和C++程序的缺省調(diào)用方式。每一個調(diào)用它的函數(shù)都包含清空堆棧的代碼,所以產(chǎn)生的可執(zhí)行文件大小會比調(diào)用_stdcall函數(shù)的大。函數(shù)采用從右到左的壓棧方式。注意:對于可變參數(shù)的成員函數(shù),始終使用__cdecl的轉(zhuǎn)換方式。 3、__fastcall調(diào)用約定:它是通過寄存器來傳送參數(shù)的(實際上,它用ECX和EDX傳送前兩個雙字(DWORD)或更小的參數(shù),剩下的參數(shù)仍舊自右向左壓棧傳送,被調(diào)用的函數(shù)在返回前清理傳送參數(shù)的內(nèi)存棧)。?va_start va_end等
函數(shù)名稱,讀取可變參數(shù)的過程其實就是在堆棧中,使用指針,遍歷堆棧段中的參數(shù)列表,從低地址到高地址一個一個地把參數(shù)內(nèi)容讀出來的過程
#define va_start(ap,v) ( ap = (va_list)&v + _INTSIZEOF(v) ) //第一個可選參數(shù)地址 #define va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) ) //下一個參數(shù)地址 #define va_end(ap) ( ap = (va_list)0 ) // 將指針置為無效?
在學習windows程序設計時此函數(shù)可以給c/c++程序員一份熟悉感。。。。。。。。。。。
?
轉(zhuǎn)載于:https://www.cnblogs.com/xdblog/p/4821517.html
總結(jié)
以上是生活随笔為你收集整理的wndows程序设计之书籍知识与代码摘录-封装一个类似printf的messagebox的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ThinkPHP(3.2)搭建简单留言板
- 下一篇: ATS push cache 测试