亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? util.cpp

?? modbus PLC 模擬程序
?? CPP
字號:
/////////////////////////////////////////////////////////////////////////////
//
// FILE: util.cpp
//
// See _README.CPP
//
/////////////////////////////////////////////////////////////////////////////
//
// Implementation of Utility functions
//     The functions and classes below are defined in "util.h"
//  
/////////////////////////////////////////////////////////////////////////////

#include "stdafx.h"


// ----------------------------- PackField ----------------------------
// PURPOSE: packs the value into ASCII-HEX into the telegram
// NOTE:
//    Unused
void PackField(CHAR **pBuffer, WORD value, WORD length)
{
CHAR tempStr[80];
CHAR formatStr[80];

   // build a format string
   sprintf(formatStr, "%%0%dX", length);
   // plonk it in
   sprintf(tempStr, formatStr, value);
   strncpy(*pBuffer, tempStr, length);
   // increment pointer
   *pBuffer+=length;
   **pBuffer = '\0'; // add a null
} // PackField


// ------------------------------ SwapBytes ----------------------------
// PURPOSE: Swap the HI and LO bytes of a WORD
// NOTES: This could have been written as a macro, but gets messy when using 
//        pointer de-refferencing and type casting.
WORD SwapBytes(WORD wrd)
{
    WORD result;

    result = ( (LOBYTE(wrd) << 8) + HIBYTE(wrd) ); 
    return(result);
} // SwapBytes


// -------------------------------- UnPackField --------------------------
// return a WORD or BYTE (depends on length) at a pointer
WORD UnPackField(BYTE **pBuffer, WORD length)
{
BYTE *pField = (BYTE*)(*pBuffer);
WORD value=0;
int i;
      
   for (i=0;i<length;i++)
   {
      //**** 20021101 mod by HF
	   //value = value * 16;
	   value *= 256;
	  //**** 20021101 end
      value += (BYTE)*pField;
      pField++;
   }
   // increment pointer
   *pBuffer +=length;
   return (value);
} // UnPackField

// ------------------------- UnPackASCIIField -------------------------------
WORD UnPackASCIIField(BYTE **pBuffer, WORD length, BOOL & error)
{
CHAR *pField = (CHAR*)(*pBuffer);
WORD value=0;
int i;

   error = FALSE;      
   for (i=0;i<length;i++)
   {
      value = value * 16;
      //value += ( (*pField >= 'A') ? 
      //            (*pField - ('A' - 10) ) : (*pField - '0') );
      if ((*pField >= 'A')&&(*pField <= 'F'))
         value += *pField - ('A' - 10);
      else
         if ((*pField >= 'a')&&(*pField <= 'f'))
            value += *pField - ('a' - 10);
         else
         {
            if ((*pField >= '0')&&(*pField <= '9'))
               value += *pField - '0';
            else
               error = TRUE;
         }
      pField++;

   }
   // increment pointer
   *pBuffer+=length;
   return (value);
}

/*
// ------------------------------ FillCharCBox ----------------------
// fill a combo-box control from a string array. the user-Data in the 
// combo is filled from an array of DWORDs.
void FillCharCBox(CComboBox * cBox, DWORD * table, char ** strTable,
                  WORD tableLen, DWORD currentsetting)
{
DWORD count;
CHAR ** strTablePtr = strTable;

   cBox->ResetContent();
   for (count = 0; count < tableLen; count++)
   {
      cBox->AddString(strTablePtr[count]);
      cBox->SetItemData(count,  *(table + count));
      if (*(table + count) == currentsetting)
         cBox->SetCurSel(count);
   }
} // FillCharCBox

// --------------------------- FillDWordCBox --------------------------
// fill a combo-box with numbers from a table.
void FillDWordCBox(CComboBox * cBox, DWORD * table, WORD tableLen,
                   DWORD currentsetting)
{
DWORD count;
CHAR temp[256];

   cBox->ResetContent();
   for (count = 0; count < tableLen; count++)
   {
      sprintf(temp,"%ld",(DWORD *)table[count]);
      cBox->AddString(temp);  //strTablePtr[count]);
      cBox->SetItemData(count,  *(table + count));
      if (*(table + count) == currentsetting)
         cBox->SetCurSel(count);
   }
} // FillDWordCBox


///////////////////////////////////////////////////////////////////////
// Local constants and function defs
#define PORT_INUSESTR      " *"     // appended to LB for used comm ports

extern BOOL PortInUse(LPCTSTR portName);
extern void FillSerialCBoxUsedResources(CComboBox * cBox, LPCTSTR currentselection);
extern void ClearPortUseMark(LPSTR name);

// --------------------------- EnumerateSerialPorts -----------------------------
// PURPOSE: Retrieve hardware configuration from registry instead of letting
//          the user guess what ports he has available.
//
LONG EnumerateSerialPorts (char *deviceName, 
                           DWORD maxLen, 
                           DWORD index)
{
CHAR     RegPath[MAX_PATH]  = "HARDWARE\\DEVICEMAP\\SERIALCOMM";
HKEY     hKey;
HKEY     hKeyRoot = HKEY_LOCAL_MACHINE;
DWORD    retCode;
CHAR     ClassName[MAX_PATH] = ""; // Buffer for class name.
DWORD    dwcClassLen = MAX_PATH;   // Length of class string.
DWORD    dwcSubKeys;               // Number of sub keys.
DWORD    dwcMaxSubKey;             // Longest sub key size.
DWORD    dwcMaxClass;              // Longest class string.
DWORD    dwcValues;                // Number of values for this key.
CHAR     valueName[MAX_VALUE_NAME] ;
DWORD    dwcValueName = MAX_VALUE_NAME;
DWORD    dwcMaxValueName;          // Longest Value name.
DWORD    dwcMaxValueData;          // Longest Value data.
DWORD    dwcSecDesc;               // Security descriptor.
FILETIME ftLastWriteTime;          // Last write time.
DWORD    dwType;
DWORD    retValue;
DWORD    cbData;


   // Use RegOpenKeyEx() with the new Registry path to get an open handle
   // to the child key you want to enumerate.
   retCode = RegOpenKeyEx (hKeyRoot,
                           RegPath,
                           0,
                           KEY_ENUMERATE_SUB_KEYS |
                           KEY_EXECUTE |
                           KEY_QUERY_VALUE,
                           &hKey);

   if (retCode != ERROR_SUCCESS)
      return(aFAILED);


   // Get Class name, Value count.
   RegQueryInfoKey ( hKey,              // Key handle.
                     ClassName,         // Buffer for class name.
                     &dwcClassLen,      // Length of class string.
                     NULL,              // Reserved.
                     &dwcSubKeys,       // Number of sub keys.
                     &dwcMaxSubKey,     // Longest sub key size.
                     &dwcMaxClass,      // Longest class string.
                     &dwcValues,        // Number of values for this key.
                     &dwcMaxValueName,  // Longest Value name.
                     &dwcMaxValueData,  // Longest Value data.
                     &dwcSecDesc,       // Security descriptor.
                     &ftLastWriteTime); // Last write time.

   // Enumerate the Key Values
   cbData = maxLen ;
   dwcValueName = MAX_VALUE_NAME;
   valueName[0] = '\0';

   retValue = RegEnumValue (hKey, index, valueName,
                            &dwcValueName,
                            NULL,
                            &dwType,
                            (BYTE *)&deviceName[0],
                            &cbData);

   RegCloseKey (hKey);   // Close the key handle.
   if(dwType == REG_SZ && retValue == (DWORD)ERROR_SUCCESS)
      return(SUCCESS);
   else
      return(aFAILED);
} // EnumerateSerialports


// ---------------------------- PortInUse ------------------------------
// Returns whether the RS-232 port can currently be opened.
// It tests this by opening and closing the port.
BOOL PortInUse(LPCTSTR portName)
{
CHAR port[MAX_PORT_NAME];
HANDLE   hPort;

   GetLongComPortName(portName, port);
   hPort =  CreateFile( port,                    // PIP 1823-400-1997
                        GENERIC_READ | GENERIC_WRITE,
                        (DWORD)NULL,   // exclusive access
                        NULL,          // no security
                        OPEN_EXISTING,
                        FILE_ATTRIBUTE_NORMAL,
                        NULL           // hTemplate
                      );
   if (INVALID_HANDLE_VALUE != hPort)
   {
      CloseHandle(hPort);
      return (FALSE);
   }
   return (TRUE);
} // PortInUse
*/

// -------------------------------- PortAvailable ---------------------------
// This func simply calls the other func
BOOL PortAvailable(LPCTSTR portName)
{
   return (!PortInUse(portName));
} // PortAvailable

/*
// --------------------------- FillSerialCBoxUsedResources ------------------
// Calls the function FillSerialCBox(), and then puts a '*' next to all used
// ports.
void FillSerialCBoxUsedResources(CComboBox * cBox, LPCTSTR currentselection)
{
DWORD index, count;
LONG selection;
CString selectionText;
   FillSerialCBox(cBox, currentselection);
   count = cBox->GetCount();
   selection = cBox->GetCurSel();
   index = 0;
   while (index < count)
   {
      cBox->GetLBText(index, selectionText);
      if (PortInUse(selectionText))
      {
         cBox->DeleteString(index);
         selectionText = selectionText + PORT_INUSESTR;  // " *"
         cBox->InsertString(index, selectionText);
         cBox->SetItemData(index, index);
      }
      index++;
   }
   cBox->SetCurSel(selection);
} // FillSerialCBoxUsedResources


// ---------------------------- ClearPortUseMark -------------------------
// Removes the '*' mark from a port name if present.
// Use this function to read the LB contents if U used FillSerialCBoxUsedResources()
void ClearPortUseMark(LPSTR name)
{
   strtok(name, PORT_INUSESTR);
} // ClearPortUseMark


// ----------------------------- FillSerialCBox -----------------------------
// the list box contains the strings that describe each serial comm port available
// the port names themselves are retrieved when destroying the combo box
void FillSerialCBox(CComboBox * cBox, LPCTSTR currentselection)
{
DWORD count;
LONG retCode;
CHAR portname[MAX_PORT_NAME];

   cBox->ResetContent();
   count = 0;
   while (TRUE)
   {
      retCode = EnumerateSerialPorts(portname, sizeof(portname), count);
      if( retCode != SUCCESS)
         break;
      cBox->AddString(portname);
      cBox->SetItemData(count, count);
      if (strcmp(portname,currentselection)==0)
         cBox->SetCurSel(count);
      count++;
   }
} // FillSerialCBox
*/

// ----------------------------- GetFirstFreePort -----------------------------
// Go thru all ports, and find the 1st unused one
void GetFirstFreePort(LPSTR freePortName)
{
DWORD count;
LONG retCode;
CHAR portname[MAX_PORT_NAME];

   freePortName[0] = '\0';
   count = 0;
   while (TRUE)
   {
      retCode = EnumerateSerialPorts(portname, sizeof(portname), count);
      if( retCode != SUCCESS)
         break;
      if (PortAvailable(portname))
      {
         strcpy(freePortName, portname);
         return;
      }
      // try next port
      count++;
   }
} // GetFirstFreePort



// ----------------------------- LoadDATAResource -------------------------------
// load a TEXT data resource into a CString
BOOL LoadDATAResource(int resourceID, char **pBuffer, DWORD* resSize)
{
HRSRC hFound;
HGLOBAL   hRes;
BOOL bResult;	
DWORD size;
HMODULE hModule = AfxGetResourceHandle();
   
   hFound = FindResource(hModule, MAKEINTRESOURCE(resourceID), "HELPFILES");
   hRes = LoadResource(hModule, hFound);
   size = SizeofResource(hModule, hFound);
   if (size)
   {
      *pBuffer = new char[size+1];
      if (NULL !=*pBuffer)
      {
         memcpy(*pBuffer, LockResource(hRes), size);
         (*pBuffer)[size] = '\0';   // terminate the string
      }
      bResult = UnlockResource(hRes);
   }
   else 
      return (FALSE);
   bResult = FreeResource(hRes); 
   *resSize = size;
   return (TRUE);
} // LoadDATAResource


BOOL FindFragment(const BYTE * buffer, DWORD length, 
                  const BYTE *pSearchBuff, DWORD mSearchLength, 
                  DWORD *pos)
{
BOOL found = FALSE;
DWORD idx=0;

   while (idx + mSearchLength <= length)
   {
      if (0 ==memcmp(&buffer[idx], pSearchBuff, mSearchLength))
      {
         *pos = idx;
         found = TRUE;
         break;
      }
      idx++;
   }
   return(found);
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美一区二区免费观在线| 久久se精品一区二区| 色婷婷精品久久二区二区蜜臀av | 黄色日韩网站视频| 欧美一区二区三区人| 日韩精品电影在线| 欧美精品一区二区三区四区| 国产风韵犹存在线视精品| 中文字幕中文乱码欧美一区二区 | 国产视频视频一区| 91小视频免费观看| 亚洲午夜激情av| 久久综合中文字幕| 99这里只有精品| 亚洲成人精品一区| 久久综合色综合88| 91色乱码一区二区三区| 午夜精品免费在线观看| 久久这里只精品最新地址| 成人的网站免费观看| 亚洲成va人在线观看| 日韩欧美资源站| 成人aa视频在线观看| 日韩在线观看一区二区| 国产亚洲综合av| 欧美日韩亚洲丝袜制服| 国产精品白丝jk黑袜喷水| 亚洲精品自拍动漫在线| 欧美一区二区三区不卡| 99在线精品视频| 久热成人在线视频| 亚洲男人的天堂一区二区 | 日韩欧美一卡二卡| a美女胸又www黄视频久久| 亚洲bt欧美bt精品777| 亚洲理论在线观看| 日韩欧美电影一区| 在线精品视频免费播放| 国产精品综合视频| 午夜精彩视频在线观看不卡| 中文字幕欧美区| 91精品国产综合久久婷婷香蕉 | 日本一二三不卡| 欧美日韩精品一区二区三区| 9i在线看片成人免费| 经典一区二区三区| 亚洲黄色片在线观看| 久久久久久久久97黄色工厂| 欧美久久一区二区| 色94色欧美sute亚洲线路二| 激情久久久久久久久久久久久久久久| 亚洲品质自拍视频| 国产亚洲成aⅴ人片在线观看| 日韩一区二区电影网| 欧美在线|欧美| 97久久精品人人爽人人爽蜜臀| 精品一区二区成人精品| 日韩va亚洲va欧美va久久| 一区二区欧美视频| 中文字幕永久在线不卡| 久久久久久久综合色一本| 日韩一级黄色片| 欧美卡1卡2卡| 欧美午夜影院一区| 色94色欧美sute亚洲线路一久 | 色综合久久久网| 国产成人午夜视频| 韩国女主播成人在线| 蜜桃av一区二区| 美脚の诱脚舐め脚责91| 日韩国产欧美在线视频| 午夜精品久久久久久久99水蜜桃 | 99re视频这里只有精品| 国产成人av影院| 国产一区二区三区最好精华液| 久久av资源网| 国产在线视视频有精品| 免费美女久久99| 毛片av中文字幕一区二区| 久久草av在线| 国产69精品久久99不卡| 日韩免费看的电影| 6080日韩午夜伦伦午夜伦| 欧美美女一区二区| 日韩免费在线观看| 2欧美一区二区三区在线观看视频| 26uuu欧美日本| 欧美激情在线一区二区| 国产精品盗摄一区二区三区| 亚洲视频在线观看三级| 一区二区免费在线| 天天色天天操综合| 麻豆freexxxx性91精品| 国产一区在线精品| 成人午夜电影网站| 欧美影院一区二区| 69久久99精品久久久久婷婷| 久久亚洲精精品中文字幕早川悠里| 久久夜色精品国产噜噜av| 国产精品丝袜一区| 夜夜嗨av一区二区三区四季av| 天堂午夜影视日韩欧美一区二区| 日韩有码一区二区三区| 国产综合色产在线精品| 波多野结衣亚洲一区| 欧美日韩亚洲综合在线 欧美亚洲特黄一级 | 亚洲女人****多毛耸耸8| 一区二区三区在线视频播放| 日本一不卡视频| 丰满少妇在线播放bd日韩电影| 色欧美88888久久久久久影院| 91麻豆精品国产91久久久| 欧美精品一区二区三区很污很色的 | 高清日韩电视剧大全免费| 91蝌蚪porny九色| 欧美一区二区三区免费视频 | 91女厕偷拍女厕偷拍高清| 欧美日韩国产首页| 欧美韩国日本不卡| 亚洲成人av在线电影| 国产成人精品免费看| 欧美三级视频在线观看| 国产欧美日韩亚州综合| 婷婷综合在线观看| 大美女一区二区三区| 久久综合精品国产一区二区三区| 亚洲美女偷拍久久| 国模一区二区三区白浆| 91传媒视频在线播放| 国产丝袜欧美中文另类| 亚洲电影在线播放| 成人精品鲁一区一区二区| 7777精品伊人久久久大香线蕉经典版下载 | 国产欧美一区二区精品忘忧草| 亚洲一卡二卡三卡四卡| 国产麻豆午夜三级精品| 在线观看国产一区二区| 国产日产欧美一区二区三区| 日本视频中文字幕一区二区三区| 99视频在线精品| 国产欧美视频一区二区| 免费欧美高清视频| 欧美日韩在线亚洲一区蜜芽| 亚洲欧美另类综合偷拍| 国产精品白丝jk白祙喷水网站| 日韩午夜在线播放| 亚洲一级二级三级在线免费观看| 国产69精品久久久久777| 日韩精品影音先锋| 丝袜a∨在线一区二区三区不卡| 一本大道av一区二区在线播放| 中文字幕第一区第二区| 国产一区二区导航在线播放| 欧美一区二区三区喷汁尤物| 午夜不卡av免费| 欧美伊人久久大香线蕉综合69| 国产精品久久久久久亚洲毛片| 国产成人三级在线观看| 久久久99精品免费观看不卡| 国产综合久久久久久鬼色 | 在线免费不卡电影| 亚洲免费观看视频| av一区二区三区| 国产精品午夜在线观看| 国产99精品在线观看| 久久精品亚洲精品国产欧美kt∨| 韩国精品主播一区二区在线观看| 91麻豆精品国产自产在线 | 亚洲成人先锋电影| 欧美三级日韩在线| 亚洲成人动漫在线免费观看| 欧美日韩小视频| 青青草一区二区三区| 欧美一区二区三区婷婷月色| 蜜乳av一区二区| 久久精品夜色噜噜亚洲aⅴ| 国产福利精品导航| 国产精品美女久久久久久久久| 欧美一区二区三区四区高清| 精品一区二区三区免费播放| 26uuu精品一区二区在线观看| 国产成人在线视频免费播放| 国产精品网曝门| 色综合天天综合| 五月天欧美精品| 精品欧美黑人一区二区三区| 国产露脸91国语对白| 中文字幕在线观看一区二区| 色婷婷国产精品综合在线观看| 亚洲国产精品一区二区久久| 欧美二区在线观看| 国产成人在线视频播放| 伊人色综合久久天天人手人婷| 欧美老人xxxx18| 国产精品99久久久久久似苏梦涵 | 国产欧美视频一区二区| 91亚洲精品久久久蜜桃| 日韩精品91亚洲二区在线观看| 久久嫩草精品久久久精品一| 在线观看视频一区二区欧美日韩|