关于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 ,则messagebox可以显示该字符串,但是传递到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\n"));  
  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\n"));  
  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\n"));  
  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\n"));  
  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,能有效回避该问题。

       在开发过程中一定还会遇到各种各样的问题,有时间再一一写来... ...














本文转自yefanqiu51CTO博客,原文链接:http://blog.51cto.com/yfsoft/323792,如需转载请自行联系原作者

相关文章
|
3月前
|
敏捷开发 数据可视化 算法
瀑布模型大揭秘:如何用分段式开发轻松搞定软件项目?
瀑布模型是软件开发中最早的线性开发方法,由Winston W. Royce于1970年提出。该模型将项目分为需求分析、系统设计、实现、集成与测试、部署和维护六个阶段,每个阶段自上而下依次进行。尽管近年来敏捷开发备受推崇,但瀑布模型在需求明确、流程复杂的项目中仍具重要价值。本文将详细介绍瀑布模型的概念、主要阶段及步骤,并探讨如何使用项目管理工具如板栗看板,帮助团队高效协作。
46 0
|
8月前
|
搜索推荐 JavaScript Java
项目开发过程中实际遇到的几个问题处理
项目开发过程中实际遇到的几个问题处理
211 2
|
项目管理
【项目开发计划制定工作经验之谈】
【项目开发计划制定工作经验之谈】
130 1
|
测试技术
测试思想-测试流程 需求开发与管理简述
测试思想-测试流程 需求开发与管理简述
99 0
|
存储 安全 搜索推荐
详解软件开发的标准过程(生命周期):跟着标准搞,设计没烦恼
详解软件开发的标准过程(生命周期):跟着标准搞,设计没烦恼
|
运维 测试技术 数据库
测试思想-流程规范 关于预发布环境的一些看法
测试思想-流程规范 关于预发布环境的一些看法
540 0
|
测试技术 开发者
软件测试面试题:软件配置管理的作用?软件配置包括什么?
软件测试面试题:软件配置管理的作用?软件配置包括什么?
199 0
|
架构师 Java 程序员
Java面向对象实践--开发团队调度软件(一)
Java面向对象实践--开发团队调度软件(一)
245 0
Java面向对象实践--开发团队调度软件(一)
|
Java 调度
Java面向对象实践--开发团队调度软件(二)
Java面向对象实践--开发团队调度软件(二)
189 0
Java面向对象实践--开发团队调度软件(二)
|
Java 调度
Java面向对象实践--开发团队调度软件(三)
Java面向对象实践--开发团队调度软件(三)
125 0

热门文章

最新文章