void CTestDBDlg::OnOK()
{
StorePROC( "lo%d",100);
}
BOOL CTestDBDlg::StorePROC(char* fmt,...) //一个简单的类似于printf的实现,//参数必须都是int 类型
{
char* pArg=NULL; //等价于原来的va_list
char c;
CString Msg;
pArg = (char*) &fmt; //注意不要写成p = fmt !!因为这里要对//参数取址,而不是取值
pArg += sizeof(fmt); //等价于原来的va_start
do
{
c =*fmt;
if ( c != '%')
{
putchar(c); //照原样输出字符
}
else
{
//按格式字符输出数据
switch(*++fmt)
{
case 'd' :
Msg.Format("%d",*((int*)pArg));
this->SetDlgItemText(IDC_STATIC,Msg);
break;
case 'x' :
Msg.Format("%#x",*((int*)pArg));
this->SetDlgItemText(IDC_STATIC,Msg);
break;
default:
break;
}
pArg += sizeof(int); //等价于原来的va_arg
}
++fmt;
}while (*fmt != '\0' );
pArg = NULL; //等价于va_end
return TRUE;
}
==================================================//类似的
// va_list arg_ptr;
// int nArgValue =start;
// int nArgCout=0; //可变参数的数目
// va_start(arg_ptr,start); //以固定参数的地址为起点确定变参的内存起始地址。
// CString Msg;
// do
// {
// ++nArgCout;
// Msg.Format("the %d th arg: %d",nArgCout,nArgValue); //输出各参数的值
// this->SetDlgItemText(IDC_STATIC,Msg);
// nArgValue = va_arg(arg_ptr,int); //得到下一个可变参数的值
// } while(nArgValue != -1);
//