首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

函数标注是不是如下就可以了?解决方案

2012-02-15 
函数标注是不是如下就可以了?很多代码,即便自己写的,隔些时日,也淡忘了。依《高质量C++编程指南.pdf》,对下面

函数标注是不是如下就可以了?
很多代码,即便自己写的,隔些时日,也淡忘了。依《高质量C++编程指南.pdf》,对下面的四个文件,稍加标注,不知还有什么需注意的?

C/C++ code
//.h#pragma once/* * Copyright (c) 2011,431工作室 * All rights reserved. *  * 文件名称:Comm.h * 摘    要:与卡交互底层类(public函数,供AdvancedComm.h封装应用,不要直接在其它地方使用)*  * 当前版本:1.1 * 作    者:431 * 完成日期:2011年7月29日 * * 取代版本:1.0   * 原作者  :431* 完成日期:2011年7月28日 */ #include <vector>using namespace std;//AT命令返回信息enum CommandResultType {    COMMAND_OK,    COMMAND_UNKNOWN_ERROR,    COMMAND_DATA_NOT_FOUND,    COMMAND_OPENPORT_FAIL,    COMMAND_WRITE_FAIL};//AT命令读缓冲区尺寸const int AT_BUFFER_SIZE = 128;class CComm{public:    CComm(void);public:    ~CComm(void);private:        BOOL GetConfigIni(vector<CString> &vec); //读配置文件COM名称列表    DWORD GetAvailableDataLen(); //获取字节流长度    BOOL Read(void* pBuf, DWORD dwBufLen, DWORD& dwDataLen); //读buffer数据    BOOL Write(const void* pData, DWORD dwDataLen); //写buffer数据public:    BOOL QueryPCUIPort(long int& dwPortNum); //查找PCUI设备口    BOOL Open(long int dwPortNum); //打开指定COM口    void Close(); //关闭COM口    CommandResultType ExecuteATCommand(char* pCmd, char* pResult); //发送AT指令private:    vector<CString> m_cfgPorts; //配置文件COM名称列表};//.cpp#include "StdAfx.h"#include "Comm.h"#include <Setupapi.h> //在“Demo 属性页-》配置属性-》链接器-》输入-》附加依赖项”增加setupapi.lib。#include "GlobalFunction.h"static HANDLE m_hComHandle = INVALID_HANDLE_VALUE; //加static,说明这个变量只类内使用CComm::CComm(void){    GetConfigIni(m_cfgPorts);}CComm::~CComm(void){}/* *  函数介绍: 读配置文件COM名称列表*  输入参数: 无*  输出参数: vec,COM名称列表*  返回值  : TRUE,配置文件找到;FALSE,配置文件没找到*/BOOL CComm::GetConfigIni(vector<CString> &vec){    vec.clear();    wstring wstrWorkDir = CGlobalFunction::GetModuleDirectory();    string strWorkDir = CGlobalFunction::WideCharToMultiByte(wstrWorkDir.c_str(), 0);    CString cstrWorkDir = CString(strWorkDir.c_str());    CString cstrPortSettingFile = cstrWorkDir + _T("config.ini");    vec.clear();    for (int i=0; i<255; i++)    {        CString cstrPortNum = "";        CString cstrPortName = "";        cstrPortNum.Format(_T("port%d"), i+1);        //if (GetKeyValue(cstrPortSettingFile, "PORT", cstrPortNum, cstrPortName))        {            //vec.push_back(cstrPortName);            vec.push_back("HUAWEI Mobile CMCC AT Interface");        }        //else        {            break;        }    }    return TRUE;}/* *  函数介绍: 查找PCUI设备口*  输入参数: 无*  输出参数: dwPortNum,COM口号*  返回值  : TRUE,找到COM口;FALSE,没找到COM口*/ BOOL CComm::QueryPCUIPort(long int& dwPortNum){    HDEVINFO NewDeviceInfoSet;    SP_DEVINFO_DATA DeviceInfoData;    DWORD PropertyRegDataType;    BYTE PropertyBuffer[1024];    DWORD RequiredSize;    BOOL bDev, bDrv;    int i = 0;    BOOL Result = FALSE;    GUID Guid = {0x4d36e978L, 0xe325, 0x11ce, {0xbf, 0xc1, 0x08, 0x00, 0x2b, 0xe1, 0x03, 0x18}};    do     {        NewDeviceInfoSet = SetupDiGetClassDevs(&Guid, NULL, NULL, DIGCF_PRESENT);        if (INVALID_HANDLE_VALUE == NewDeviceInfoSet)        {            return Result;        }        bDev = FALSE;        bDrv = FALSE;        memset(&DeviceInfoData, 0, sizeof(DeviceInfoData));        DeviceInfoData.cbSize = sizeof(DeviceInfoData);        bDev = SetupDiEnumDeviceInfo(NewDeviceInfoSet, i, &DeviceInfoData);        if (bDev)        {            memset(PropertyBuffer, 0, 1024);            bDrv = SetupDiGetDeviceRegistryProperty(NewDeviceInfoSet, &DeviceInfoData,                 SPDRP_FRIENDLYNAME, &PropertyRegDataType, PropertyBuffer, 1024, &RequiredSize);            if (bDrv)            {                char* cPorts;                vector<CString>::iterator iter = m_cfgPorts.begin();                 for (iter=m_cfgPorts.begin(); iter!=m_cfgPorts.end(); iter++)                {                    if ((strstr((const char*)PropertyBuffer, (*iter).GetBuffer()) != NULL)                        && (cPorts=const_cast<char*>(strstr((const char*)PropertyBuffer, "COM"))))                    {                        dwPortNum = (DWORD)atol((char*)&cPorts[3]);                        Result = TRUE;                        break;                    }                }                if (Result)                {                    break;                }            }        }        else        {            DWORD dwError = GetLastError();            if ((ERROR_SUCCESS==dwError) | (ERROR_NO_MORE_ITEMS==dwError))            {                break;            }        }        Sleep(500);        i++;    }    while (true);    SetupDiDestroyDeviceInfoList(NewDeviceInfoSet);    return Result;}/* *  函数介绍: 打开指定COM口*  输入参数: dwPortNum,COM口号*  输出参数: 无*  返回值  : TRUE,成功打开COM口;FALSE,打开COM口失败。*/BOOL CComm::Open(long int dwPortNum){    CString str;    std::string strPortName;    str.Format("\\\\.\\COM%d", dwPortNum);    strPortName = str;    m_hComHandle = CreateFile(strPortName.c_str(), GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);    if (INVALID_HANDLE_VALUE == m_hComHandle)    {        return FALSE;    }    SetCommMask(m_hComHandle, EV_RXCHAR);    DCB dcb;    if (!GetCommState(m_hComHandle, &dcb))    {        CloseHandle(m_hComHandle);        m_hComHandle = INVALID_HANDLE_VALUE;        return FALSE;    }    dcb.BaudRate     = CBR_115200;    dcb.Parity       = NOPARITY;    dcb.ByteSize     = 8;    dcb.StopBits     = ONESTOPBIT;    dcb.fDsrSensitivity = FALSE;    dcb.fOutxCtsFlow = FALSE;    dcb.fOutxDsrFlow = FALSE;    dcb.fOutX        = FALSE;    dcb.fInX         = FALSE;    if (!SetCommState(m_hComHandle, &dcb))    {        CloseHandle(m_hComHandle);        m_hComHandle = INVALID_HANDLE_VALUE;        return FALSE;    }    return TRUE;}/* *  函数介绍: 关闭COM口*  输入参数: 无*  输出参数: 无*  返回值  : 无*/void CComm::Close(){    if (INVALID_HANDLE_VALUE != m_hComHandle)    {        CloseHandle(m_hComHandle);    }    m_hComHandle = INVALID_HANDLE_VALUE;}/* *  函数介绍: 获取字节流长度*  输入参数: 无*  输出参数: 无*  返回值  : 字节流长*/DWORD CComm::GetAvailableDataLen(){    COMSTAT ComState;    DWORD dwError;    if (!ClearCommError(m_hComHandle, &dwError, &ComState))    {        return 0;    }    return ComState.cbInQue;}/* *  函数介绍: 读buffer数据*  输入参数: 无*  输出参数: pBuf,缓冲区;dwBufLen,缓冲区大小;dwDataLen,数据长度*  返回值  : TRUE,读成功;FALSE,读失败。*/BOOL CComm::Read(void* pBuf, DWORD dwBufLen, DWORD& dwDataLen){    if (INVALID_HANDLE_VALUE == m_hComHandle)    {        return FALSE;    }    DWORD dwDataInCom = 0;    BYTE* pRetBuf = (BYTE*)pBuf;    dwDataLen = 0;    dwDataInCom = GetAvailableDataLen();    OVERLAPPED* pOverLap = new OVERLAPPED;    BOOL bRet = FALSE;    memset(pOverLap, 0, sizeof(OVERLAPPED));    pOverLap->hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);    try    {        bRet = ReadFile(m_hComHandle, pBuf, dwBufLen, &dwDataLen, pOverLap);    }    catch (...)    {        dwDataLen = 0;        CloseHandle(pOverLap->hEvent);        return FALSE;    }    if (FALSE == bRet)    {        DWORD dwError = GetLastError();        if(ERROR_IO_PENDING == dwError)        {            DWORD dwState = WaitForSingleObject(pOverLap->hEvent, 500);            switch (dwState)            {            case WAIT_OBJECT_0:                {                    if (GetOverlappedResult(m_hComHandle, pOverLap, &dwDataInCom, FALSE))                    {                        bRet = TRUE;                        dwDataLen = (DWORD)pOverLap->InternalHigh; //强转,获取数据长度                    }                }                break;            case WAIT_TIMEOUT:                break;            default:                break;            }        }    }    else    {        bRet = TRUE;        dwDataLen = (DWORD)pOverLap->InternalHigh; //强转,获取数据长度    }    CloseHandle(pOverLap->hEvent);    return bRet;}/* *  函数介绍: 写buffer数据*  输入参数: pData,缓冲区;dwDataLen,缓冲区大小*  输出参数: 无*  返回值  : TRUE,写成功;FALSE,写失败。*/BOOL CComm::Write(const void* pData, DWORD dwDataLen){    DWORD dwWriteLen;    OVERLAPPED OverLap;    memset(&OverLap, 0, sizeof(OverLap));    if (INVALID_HANDLE_VALUE == m_hComHandle)    {        return FALSE;    }    OverLap.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);    BOOL bRet = FALSE;    try    {        bRet = WriteFile(m_hComHandle, pData, dwDataLen, &dwWriteLen, &OverLap);    }    catch(...)    {        dwWriteLen = 0;        CloseHandle(OverLap.hEvent);        return FALSE;    }    if (!bRet)    {        if (ERROR_IO_PENDING == GetLastError())        {            DWORD dwState = WaitForSingleObject(OverLap.hEvent, 2000);            switch (dwState)            {            case WAIT_OBJECT_0:                {                    if (GetOverlappedResult(m_hComHandle, &OverLap, &dwWriteLen, FALSE))                    {                        if (dwWriteLen == dwDataLen)                        {                            bRet = TRUE;                        }                    }                }                break;            case WAIT_TIMEOUT:                break;            default:                break;            }        }        else        {            if (dwDataLen == (DWORD)OverLap.InternalHigh) //强转,获取数据长度            {                bRet = TRUE;            }        }    }    CloseHandle(OverLap.hEvent);    return bRet;}/* *  函数介绍: 发送AT指令*  输入参数: pCmd,AT指令*  输出参数: pResult,返回数据*  返回值  : 枚举结果信息*/CommandResultType CComm::ExecuteATCommand(char* pCmd, char* pResult){    if (NULL == pResult)    {        return COMMAND_UNKNOWN_ERROR;    }    char ans[AT_BUFFER_SIZE] = {0};    if (!Write(pCmd, (DWORD)strlen(pCmd))) //强转,获取数据长度    {        return COMMAND_WRITE_FAIL;    }    DWORD dwStart = GetTickCount();    BOOL get_response = FALSE;    while (GetTickCount() - dwStart < 3000)    {        DWORD dwDataLen;        Read(ans, AT_BUFFER_SIZE, dwDataLen);        if (strstr(ans, "OK") != NULL)        {            get_response = TRUE;            strcpy(pResult, ans);            return COMMAND_OK;        }        else if (strstr(ans, "ERROR") != NULL)        {            return COMMAND_UNKNOWN_ERROR;        }        else if (strstr(ans, "COMMAND NOT SUPPORTED") != NULL)        {            return COMMAND_UNKNOWN_ERROR;        }        else        {            Sleep(500);        }    }    if (!get_response)    {        return COMMAND_UNKNOWN_ERROR;    }    strcpy(pResult, ans);    return COMMAND_OK;} 



[解决办法]
含有一些不容易理解的地方 也标注一下 差不多了吧
[解决办法]
写的不错 我都没有标注过

热点排行