一:FormatMessage()
1.原型
DWORD WINAPI FormatMessage( __in DWORD dwFlags, __in LPCVOID lpSource, __in DWORD dwMessageId, __in DWORD dwLanguageId, __out LPTSTR lpBuffer, __in DWORD nSize, __in va_list* Arguments );
2.返回值
如果函数执行成功,那么返回值将储存在lpBuffer中,如果执行失败,函数将返回0(bool变量)
3.参数说明
dwFlags:
# FORMAT_MESSAGE_ALLOCATE_BUFFER // 此函数会分配内存以包含描述字串(使用完后需要用LocalFree释放内存)。
# FORMAT_MESSAGE_FROM_SYSTEM, // 在系统的id映射表中寻找描述字串
# FORMAT_MESSAGE_FROM_HMODULE // 在其他资源模块中寻找描述字串
# FORMAT_MESSAGE_FROM_STRING // 消息ID是个字串,不是个DWORD
通常为:FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM
lpSource:
# 指定了FORMAT_MESSAGE_FROM_HMODULE的话,此参数表示模块的HANDLE
# 指定了FORMAT_MESSAGE_FROM_STRING的话,此参数表示id字串
通常为:NULL
dwMessageId:
消息ID;如果指定FORMAT_MESSAGE_FROM_STRING,将被忽略。
dwLanguageId:
消息描述所用的语言
通常为:0表示自动选择
lpBuffer:
#如果未指定FORMAT_MESSAGE_ALLOCATE_BUFFER,则为自己提供的缓冲区
#否则为系统LocalAlloc分配,需要被用户LocalFree
nSize:
#如果未指定FORMAT_MESSAGE_ALLOCATE_BUFFER,则为自己提供的缓冲区大小
#否则为系统LocalAlloc分配之最小缓冲区大小
4.实例
DWORD DErrorCode = GetDlgItemInt(IDC_ERRORCODE);
HLOCAL hlocal = NULL;//得到内存中的message buffer!bool bOk = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_ALLOCATE_BUFFER,
NULL,DErrorCode,MAKELANGID(LANG_CHINESE,SUBLANG_CHINESE_SIMPLIFIED),(LPTSTR)&hlocal,0,NULL);
if(hlocal != NULL)
{
SetDlgItemText(IDC_ERRORDTL,(PCTSTR)hlocal);
LocalFree(hlocal);//释放内存
else{
SetDlgItemText(IDC_ERRORDTL,L"Error found the error message number!/r/nPLS re_enter.");
}
二:SendARP()
1.原型
DWORD SendARP( __in IPAddr DestIP, __in IPAddr SrcIP, __out PULONG pMacAddr, __in_out PULONG PhyAddrLen );
2.返回值
成功返回NO_ERROR(0)
3.参数说明
DestIP:需要得到MAC地址的计算机IPSrcIP:通常情况下为NULLpMacAddr:存放MAC地址的数组,最小长度为2phyAddrLen:MAC的BYTE长度,通常为6
4:实例
const char *ip(input.c_str());
if(inet_addr(ip) != INADDR_NONE)
{
ipAddr = inet_addr(ip);
}
else
{
cout<<"Format error,Pls re_write!";
return 1;
}
memset(pulMac,0xff,sizeof(pulMac));
ulLen = 6;hr = SendARP(ipAddr,0,pulMac,&ulLen);
cout<<hr<<" "<<ulLen<<endl;
if(hr != 0 )
{
HLOCAL hLocal = NULL;
bool bOk = FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
NULL,(DWORD)hr,0,(LPTSTR)&hLocal,0,NULL);
if(hLocal != NULL)
{
LPCTSTR TEMP = (LPCTSTR)hLocal;
cout<<TEMP<<endl;
cout<<"/r/nPLS input the ip address: ";
LocalFree(hLocal);//释放内存
}
}
else
{
SIZE_T i,j;
char *szMac = new char[ulLen*3];
PBYTE pbHexMac = (PBYTE) pulMac;for(i = 0,j = 0;i < int(ulLen) - 1;i++)
j+=sprintf(szMac + j,"%.2X:",(int)pbHexMac[i]);
sprintf(szMac + j,"%.2X",(int)pbHexMac[ulLen-1]);
cout<<"IP: "<<ip<<" MAC: "<<szMac<<endl;
delete [] szMac;
cout<<"/r/nPLS input the ip address: ";
}