VS2005 및 EVC4. 정보2 프로젝트 개발 과정에서의 문제점

그동안 삽입식 IOServer와 삽입식 HMI의 개발에 주력해 왔는데 이 가운데 C#와 EVC의 통신 문제도 관련되고 EVC 자체의 개발에 부딪힌 문제점도 관련된다.
1. EVC와 C의 데이터 전달
나는 EVC로 DLL(MFC 확장 DLL)을 만들고 C를 직접 호출한다.
EVC DLL 커넥터입니다.
   
   
   
   
   
  1. DLLEXPORT long WINAPI IOMReadData(LPTSTR,LPTSTR);         //        
  2.    DLLEXPORT long WINAPI IOMWriteData(LPTSTR,LPTSTR);          //     

이것은 C#의 인터페이스 선언입니다.
 
   
   
   
   
  1. [DllImport(@"\Storage Card\YFIOES.dll")]  
  2. public static extern int IOMReadData(string strName, StringBuilder strData);  
  3. [DllImport(@"\Storage Card\YFIOES.dll")]  
  4. public static extern int IOMWriteData(string strName, string strData); 

이 안에서 몇 가지 재미있는 문제가 발생했다. 문자열 유형은 데이터 전달의 문제가 빈번한 지역이다. EVC 인터페이스에서 Cstring과 Cstring & 인터페이스를 설명할 때 문자열이 전달될 수 있지만 되돌아오지 않는다. LPTSTR 형식으로 성명하고 C#인터페이스가string이면 메시지박스가 이 문자열을 표시할 수 있지만 textbox 컨트롤에 전달되면 비어 있다.StringBuilder로 선언하면 문제가 없습니다.
여기에 주의해야 할 문제가 하나 있습니다. 되돌아오는 문자열이 16글자 길이보다 크면 다음과 같이 StringBuilder strData=new StringBuilder () 를 설명합니다.StringBuilder strData=new StringBuilder(255)로 수정하려면 다음과 같이 하십시오.그렇지 않으면 잘못 보고할 것이다. 나는 이 문제에서 한참 동안 디버깅을 했는데, 나는 나의 DLL에 문제가 생긴 줄 알았다.
2, EVC 및 INI 파일
EVC에서는 INI가 읽고 쓰는 API를 지원하지 않는데 다행히 인터넷이 있어서 하나 찾았는데 잘 됐어요.
   
   
   
   
  1. DWORD CYFIOMEM::GetPrivateProfileString(LPCTSTR lpAppName,LPCTSTR lpKeyName,LPCTSTR lpDefault,LPTSTR lpReturnedString,DWORD nSize,LPCTSTR lpFileName )  
  2. {  
  3.  
  4.   CFile iniFile;  
  5.   PBYTE pFileBuf;   
  6.   CString szBuf;  
  7.   DWORD dwLength;  
  8.  
  9.   if( lpReturnedString == NULL )return 0;  
  10.   if( lpDefault ) {_tcscpy( lpReturnedString,lpDefault ); }  
  11.   else {_tcscpy( lpReturnedString,TEXT( "\0" )); }  
  12.    
  13.   if (lpFileName == NULL ){return _tcslen( lpReturnedString );}    
  14.   if(!iniFile.Open(lpFileName, CFile::modeRead)) {return _tcslen( lpReturnedString );}  
  15.    
  16.   dwLength = iniFile.GetLength();  
  17.   if (dwLength == 0) { return _tcslen( lpReturnedString );}  
  18.   pFileBuf = new BYTE[dwLength + 2];  
  19.   if (pFileBuf == NULL) { return _tcslen( lpReturnedString );}  
  20.    
  21.   memset(pFileBuf, 0x0, dwLength + 2);  
  22.   iniFile.Read((void *)pFileBuf, dwLength);  
  23.   iniFile.Close();  
  24.    
  25.   if (pFileBuf[0] == 0xFF && pFileBuf[1] == 0xFE) {szBuf = (LPCWSTR)(pFileBuf + 2);}  
  26.   else 
  27.   {  
  28.    PTCHAR pszWideChar = new TCHAR[dwLength + 1];  
  29.    MultiByteToWideChar(CP_ACP, 0, (LPCSTR)pFileBuf, dwLength, pszWideChar, dwLength);  
  30.    szBuf = pszWideChar;  
  31.    delete pszWideChar;  
  32.   }  
  33.   delete pFileBuf;  
  34.    
  35.   while (1)  
  36.   {  
  37.    CString szTemp;  
  38.    int nPos;  
  39.    if (szBuf.IsEmpty()) return _tcslen( lpReturnedString );  
  40.     
  41.    nPos = szBuf.FindOneOf(TEXT("\r
    "
    ));  
  42.    if (nPos == -1)   
  43.    {  
  44.     szTemp = szBuf;  
  45.     szBuf.Empty();  
  46.    }  
  47.    else 
  48.    {  
  49.     szTemp = szBuf.Left(nPos);  
  50.     szBuf = szBuf.Right(szBuf.GetLength() - nPos);  
  51.     szBuf.TrimLeft(TEXT("\r
    "
    ));  
  52.    }    
  53.    szTemp.TrimLeft(TEXT("\t "));  
  54.    szTemp.TrimRight(TEXT("\t "));  
  55.    if (szTemp.GetAt(0) == TEXT('[') && szTemp.GetAt(szTemp.GetLength() - 1) == TEXT(']'))  
  56.    {  
  57.     szTemp = szTemp.Right(szTemp.GetLength() - 1);  
  58.     szTemp = szTemp.Left(szTemp.GetLength() - 1);  
  59.     if (lpAppName == NULL)   
  60.     {  
  61.   return _tcslen( lpReturnedString );                   
  62.     }  
  63.     else if (szTemp.CompareNoCase(lpAppName) == 0)   
  64.     {  
  65.   while (1)   
  66.   {  
  67.    if (szBuf.IsEmpty()) {continue; }       
  68.    nPos = szBuf.FindOneOf(TEXT("\r
    "
    ));  
  69.    if (nPos == -1)   
  70.    {  
  71.     szTemp = szBuf;  
  72.     szBuf.Empty();  
  73.    }  
  74.    else 
  75.    {  
  76.     szTemp = szBuf.Left(nPos);  
  77.     szBuf = szBuf.Right(szBuf.GetLength() - nPos);  
  78.     szBuf.TrimLeft(TEXT("\r
    "
    ));  
  79.    }  
  80.        
  81.    nPos = szTemp.Find(TEXT("="));  
  82.    if (nPos == -1) {return _tcslen( lpReturnedString );}  
  83.  
  84.    CString szTemp1;  
  85.    szTemp1 = szTemp.Left(nPos);  
  86.    szTemp1.TrimLeft(TEXT("\t "));  
  87.    szTemp1.TrimRight(TEXT("\t "));  
  88.    if (lpKeyName == NULL)  {return _tcslen( lpReturnedString  );}  
  89.    else if (szTemp1.CompareNoCase(lpKeyName) == 0)   
  90.    {  
  91.     szTemp1 = szTemp.Right(szTemp.GetLength() - nPos - 1);  
  92.     szTemp1.TrimLeft(TEXT("\t "));  
  93.     szTemp1.TrimRight(TEXT("\t "));  
  94.     _tcscpy( lpReturnedString,szTemp1 );  
  95.         
  96.     return _tcslen( lpReturnedString );  
  97.    }  
  98.   }  
  99.     }  
  100.    }  
  101.   }   
  102.   return _tcslen( lpReturnedString );  
  103. }  
  104.        
  105.  

3. EVC에서 넓은 문자는 제가 가장 골치 아픈 것입니다. Cstring을 많이 사용하면 이 문제를 효과적으로 회피할 수 있습니다.
개발 과정에서 반드시 각양각색의 문제에 부딪힐 것이다. 시간이 있으면 다시 한 번 써보자...
 

좋은 웹페이지 즐겨찾기