wndows程序设计之书籍知识与代码摘录-封装一个类似printf的messagebox
生活随笔
收集整理的這篇文章主要介紹了
wndows程序设计之书籍知识与代码摘录-封装一个类似printf的messagebox
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
//-----------------------------------------
//本程序展示了如何實現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的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ThinkPHP(3.2)搭建简单留言板
- 下一篇: ATS push cache 测试