函数学习

一: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地址的计算机IP
SrcIP:通常情况下为NULL
pMacAddr:存放MAC地址的数组,最小长度为2
phyAddrLen: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: ";
        }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值