关于VS2005与EVC4.2的项目开发过程中的问题点滴

news/2024/7/6 1:00:03

        这段时间一直致力于嵌入式IOServer与嵌入式HMI的开发,这中间及牵扯C#与EVC通信的问题,也牵扯EVC本身开发遇到的一些问题。

        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 ,则messagebox可以显示该字符串,但是传递到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/n"));
   if (nPos == -1)
   {
    szTemp = szBuf;
    szBuf.Empty();
   }
   else
   {
    szTemp = szBuf.Left(nPos);
    szBuf = szBuf.Right(szBuf.GetLength() - nPos);
    szBuf.TrimLeft(TEXT("/r/n"));
   } 
   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/n"));
   if (nPos == -1)
   {
    szTemp = szBuf;
    szBuf.Empty();
   }
   else
   {
    szTemp = szBuf.Left(nPos);
    szBuf = szBuf.Right(szBuf.GetLength() - nPos);
    szBuf.TrimLeft(TEXT("/r/n"));
   }
    
   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,能有效回避该问题。

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





http://www.niftyadmin.cn/n/3655733.html

相关文章

嵌入式IOEServer终于开发完成,相应的问题作一个系统阐述(WINCE)

经过近一个月的努力,嵌入式IOEServer终于开发完成,目前仅做了四个驱动,西门子 PPI,CP243; modbus Rtu/AscII,,TCP;效果比预想的要好,下面就是运行在WinCE上的一个截图。下面简单介绍…

.net精简框架集多个类同时串行化(XML方式)技术

存取类实例的参数最佳的方法当然是串行化技术,串行化支持两种方式:二进制方式,可以高保真的保存类示例,另一种是XML方式,它仅保存公共数据。很可惜.net 2.0的精简框架集仅支持XML方式。我这里做了一个示例,…

将一个数组旋转K步

题: 输入一个数组 [1,2,3,4,5,6,7] K3, 即旋转3步 输出 [5,6,7,1,2,3] 思路:1 把末尾的元素挨个pop , 然后unshift到数组前面 思路:2 把数组拆分,最后concat拼接到一起 /*** 把末尾的元素挨个pop , 然后unshift到数组前面* param arr* param k*/ export function kn1(arr:num…

判断一个字符串是否括号匹配

一个字符串s可能包括{}() [] 三种括号 判断s是否是括号匹配的 如(a{b}c)匹配, 而{a(b 或 {a(b}c}就不匹配 这个题考的就是 栈 栈: 先进后出 api: push pop length 栈和数组有什么区别? 没有区别 不是一个概念的东西, 逻辑结…

北京Tech.ed2006微软技术大会场记(9.21~9.23)

今年有幸获取了微软MVP在北京、上海、广州三地Tech.ed大会30张赠票中的一张,21号早6:50出发终于在10:30之前赶到了会场(北京九华山庄),三天两宿的时间虽然很累,但是收获很大。下边做了几张截图,简略的说一下…

两个栈 实现一个队列

请用两个栈,实现一个队列 队列: 概念:先进先出 api : add delete length 队列是逻辑结构,抽象模型 简单的,可以用数组、链表实现 复杂的队列服务,需要单独设计 // 思路 1 定义一个原型对象 里面包涵…

脚本引擎初步研究

由于组态软件里要嵌入脚本引擎,以前虽然在IOServer中嵌入了VBScript,但脚本引擎的概念实在是不甚明白,这几天集中突击了脚本引擎的相关知识,收获还不少。看了网上的一篇《实现一个脚本引擎》的文章,一步步做了下来&…