VS2005 및 EVC4. 정보2 프로젝트 개발 과정에서의 문제점
1. EVC와 C의 데이터 전달
나는 EVC로 DLL(MFC 확장 DLL)을 만들고 C를 직접 호출한다.
EVC DLL 커넥터입니다.
- DLLEXPORT long WINAPI IOMReadData(LPTSTR,LPTSTR); //
- DLLEXPORT long WINAPI IOMWriteData(LPTSTR,LPTSTR); //
이것은 C#의 인터페이스 선언입니다.
- [DllImport(@"\Storage Card\YFIOES.dll")]
- public static extern int IOMReadData(string strName, StringBuilder strData);
- [DllImport(@"\Storage Card\YFIOES.dll")]
- 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를 지원하지 않는데 다행히 인터넷이 있어서 하나 찾았는데 잘 됐어요.
- DWORD CYFIOMEM::GetPrivateProfileString(LPCTSTR lpAppName,LPCTSTR lpKeyName,LPCTSTR lpDefault,LPTSTR lpReturnedString,DWORD nSize,LPCTSTR lpFileName )
- {
-
- CFile iniFile;
- PBYTE pFileBuf;
- CString szBuf;
- DWORD dwLength;
-
- if( lpReturnedString == NULL )return 0;
- if( lpDefault ) {_tcscpy( lpReturnedString,lpDefault ); }
- else {_tcscpy( lpReturnedString,TEXT( "\0" )); }
-
- if (lpFileName == NULL ){return _tcslen( lpReturnedString );}
- if(!iniFile.Open(lpFileName, CFile::modeRead)) {return _tcslen( lpReturnedString );}
-
- dwLength = iniFile.GetLength();
- if (dwLength == 0) { return _tcslen( lpReturnedString );}
- pFileBuf = new BYTE[dwLength + 2];
- if (pFileBuf == NULL) { return _tcslen( lpReturnedString );}
-
- memset(pFileBuf, 0x0, dwLength + 2);
- iniFile.Read((void *)pFileBuf, dwLength);
- iniFile.Close();
-
- if (pFileBuf[0] == 0xFF && pFileBuf[1] == 0xFE) {szBuf = (LPCWSTR)(pFileBuf + 2);}
- else
- {
- PTCHAR pszWideChar = new TCHAR[dwLength + 1];
- MultiByteToWideChar(CP_ACP, 0, (LPCSTR)pFileBuf, dwLength, pszWideChar, dwLength);
- szBuf = pszWideChar;
- delete pszWideChar;
- }
- delete pFileBuf;
-
- while (1)
- {
- CString szTemp;
- int nPos;
- if (szBuf.IsEmpty()) return _tcslen( lpReturnedString );
-
- nPos = szBuf.FindOneOf(TEXT("\r
"));
- if (nPos == -1)
- {
- szTemp = szBuf;
- szBuf.Empty();
- }
- else
- {
- szTemp = szBuf.Left(nPos);
- szBuf = szBuf.Right(szBuf.GetLength() - nPos);
- szBuf.TrimLeft(TEXT("\r
"));
- }
- szTemp.TrimLeft(TEXT("\t "));
- szTemp.TrimRight(TEXT("\t "));
- if (szTemp.GetAt(0) == TEXT('[') && szTemp.GetAt(szTemp.GetLength() - 1) == TEXT(']'))
- {
- szTemp = szTemp.Right(szTemp.GetLength() - 1);
- szTemp = szTemp.Left(szTemp.GetLength() - 1);
- if (lpAppName == NULL)
- {
- return _tcslen( lpReturnedString );
- }
- else if (szTemp.CompareNoCase(lpAppName) == 0)
- {
- while (1)
- {
- if (szBuf.IsEmpty()) {continue; }
- nPos = szBuf.FindOneOf(TEXT("\r
"));
- if (nPos == -1)
- {
- szTemp = szBuf;
- szBuf.Empty();
- }
- else
- {
- szTemp = szBuf.Left(nPos);
- szBuf = szBuf.Right(szBuf.GetLength() - nPos);
- szBuf.TrimLeft(TEXT("\r
"));
- }
-
- nPos = szTemp.Find(TEXT("="));
- if (nPos == -1) {return _tcslen( lpReturnedString );}
-
- CString szTemp1;
- szTemp1 = szTemp.Left(nPos);
- szTemp1.TrimLeft(TEXT("\t "));
- szTemp1.TrimRight(TEXT("\t "));
- if (lpKeyName == NULL) {return _tcslen( lpReturnedString );}
- else if (szTemp1.CompareNoCase(lpKeyName) == 0)
- {
- szTemp1 = szTemp.Right(szTemp.GetLength() - nPos - 1);
- szTemp1.TrimLeft(TEXT("\t "));
- szTemp1.TrimRight(TEXT("\t "));
- _tcscpy( lpReturnedString,szTemp1 );
-
- return _tcslen( lpReturnedString );
- }
- }
- }
- }
- }
- return _tcslen( lpReturnedString );
- }
-
-
3. EVC에서 넓은 문자는 제가 가장 골치 아픈 것입니다. Cstring을 많이 사용하면 이 문제를 효과적으로 회피할 수 있습니다.
개발 과정에서 반드시 각양각색의 문제에 부딪힐 것이다. 시간이 있으면 다시 한 번 써보자...
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
양식 제출 후 제출 버튼 비활성화텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.