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

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

?? util.cpp

?? 用于開發Modbus工業級通信
?? 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一区二区三区免费野_久草精品视频
久久久久久久综合狠狠综合| 欧美成人乱码一区二区三区| 欧美国产日韩一二三区| 国产精品一区免费视频| 久久综合狠狠综合| 色婷婷综合在线| 日韩国产欧美三级| 久久先锋资源网| 97久久超碰精品国产| 免费成人在线网站| 中文字幕+乱码+中文字幕一区| 99久久99久久免费精品蜜臀| 亚洲精品美国一| 久久精品综合网| 在线观看免费亚洲| 福利一区在线观看| 日本欧美肥老太交大片| 中文字幕精品一区| 精品国产一区二区三区久久久蜜月 | 99精品久久只有精品| 天堂在线亚洲视频| 亚洲图片激情小说| 国产欧美一区在线| 26uuu亚洲综合色| 精品三级av在线| 91精品久久久久久久91蜜桃| 99这里只有精品| 国产999精品久久久久久| 看国产成人h片视频| 久久综合久久久久88| 欧美日韩三级视频| 337p亚洲精品色噜噜| 欧美少妇一区二区| 91九色02白丝porn| 欧美日韩精品一区二区| 欧美日韩你懂的| 69久久夜色精品国产69蝌蚪网| 欧美午夜精品一区| 欧美电影一区二区三区| 欧美一区国产二区| 久久亚区不卡日本| 亚洲精品久久久久久国产精华液| 亚洲特黄一级片| 亚洲成人免费电影| 丰满白嫩尤物一区二区| 99久久久国产精品免费蜜臀| 欧美性大战久久久| 欧美videofree性高清杂交| 欧美国产日韩精品免费观看| 亚洲品质自拍视频网站| 久久精品噜噜噜成人av农村| 岛国av在线一区| 555www色欧美视频| 日韩美女精品在线| 激情深爱一区二区| 在线欧美一区二区| 久久久久久久免费视频了| 亚洲一区二区三区影院| 国产精品一区二区男女羞羞无遮挡| 99久久99久久久精品齐齐| 欧美一级视频精品观看| 亚洲女与黑人做爰| www.成人在线| 欧美成人精品3d动漫h| 天天色天天操综合| 91原创在线视频| 久久婷婷久久一区二区三区| 亚洲精品国产无天堂网2021| 国产一区二区三区精品视频| 欧美精三区欧美精三区| 国产精品护士白丝一区av| 亚洲成人动漫一区| 91国模大尺度私拍在线视频| 久久久国产精品午夜一区ai换脸| 天堂av在线一区| 欧美色中文字幕| 亚洲综合一区二区三区| 日本乱码高清不卡字幕| 国产精品欧美极品| 北岛玲一区二区三区四区| 中文字幕+乱码+中文字幕一区| 国产成人自拍网| 中文字幕制服丝袜一区二区三区| 国产成a人无v码亚洲福利| 久久久久97国产精华液好用吗 | 一区二区在线观看免费视频播放| a在线播放不卡| 日韩成人精品在线观看| 欧美一区二区三区小说| 天天综合日日夜夜精品| 欧美成va人片在线观看| 9久草视频在线视频精品| 亚洲国产日韩a在线播放| 欧美一级高清片在线观看| 高清不卡在线观看| 午夜免费久久看| wwww国产精品欧美| 欧美日韩国产123区| 国产69精品久久99不卡| 亚洲午夜精品一区二区三区他趣| 欧美一二三四在线| 欧美亚洲禁片免费| 成人手机电影网| 国产综合色视频| 美女任你摸久久| 亚洲国产成人精品视频| 国产精品乱码久久久久久| 欧美一区二区三区在线| 欧美午夜视频网站| 色综合久久久久综合| 成人动漫一区二区三区| 国产精品亚洲第一区在线暖暖韩国 | 麻豆freexxxx性91精品| 综合分类小说区另类春色亚洲小说欧美| 日韩欧美中文字幕精品| 在线播放欧美女士性生活| 欧美日韩成人在线| 欧美日韩高清在线| 日韩美女天天操| 国产婷婷色一区二区三区四区| 欧美剧情片在线观看| 欧美视频一二三区| 成人免费视频一区二区| 成人网页在线观看| 欧美在线观看禁18| 日韩一区二区三免费高清| 日韩欧美在线123| 国产精品国产馆在线真实露脸 | 欧美日韩精品欧美日韩精品一 | 成人动漫av在线| 欧美视频一区在线| 日韩精品一区二区三区中文不卡| 久久午夜色播影院免费高清| 国产欧美中文在线| 亚洲午夜羞羞片| 粉嫩一区二区三区在线看| 欧美怡红院视频| 久久免费午夜影院| 午夜久久久久久久久久一区二区| 国内精品免费在线观看| 91丨porny丨首页| 久久综合999| 午夜伦理一区二区| 91精品福利视频| 国产欧美一区视频| 久久99这里只有精品| 色综合久久久久| 日韩一区日韩二区| 国产成人自拍高清视频在线免费播放| 欧美日韩精品电影| 亚洲一区欧美一区| 欧洲国内综合视频| 亚洲福利一二三区| 欧洲精品中文字幕| 一区二区理论电影在线观看| 成人精品免费视频| 国产亚洲精品福利| 成人涩涩免费视频| 成人欧美一区二区三区1314| 国产精品一区二区在线观看网站| 欧美久久久久久蜜桃| 亚洲自拍偷拍麻豆| 国产精品久久久久久亚洲毛片| 国产91精品一区二区麻豆网站| 欧美精品乱人伦久久久久久| 欧美精品乱人伦久久久久久| 亚洲精品一线二线三线无人区| 一区二区三区在线观看视频 | 亚洲啪啪综合av一区二区三区| 亚洲一区精品在线| 欧美日韩精品一区二区三区| 亚洲国产sm捆绑调教视频| 欧美日韩国产免费| 麻豆91精品视频| 国产精品久线观看视频| 91丨九色丨蝌蚪丨老版| 视频一区免费在线观看| 精品剧情v国产在线观看在线| 国产99久久久精品| 午夜精品国产更新| 国产亚洲人成网站| 欧美色区777第一页| 国产一区 二区| 亚洲欧美在线另类| 91在线精品一区二区| 日本欧美一区二区三区乱码| 日韩欧美中文字幕制服| 91免费版在线看| 国产黄色成人av| 日韩激情在线观看| 亚洲免费视频中文字幕| 精品国产在天天线2019| 欧美日韩精品欧美日韩精品一 | 99久久久久久| 麻豆视频一区二区| 日韩精品久久久久久| 一区二区三区欧美日韩| 中文字幕制服丝袜成人av| 久久久久久久精| 欧美韩国一区二区|