关于VS2005与EVC4.2的项目开发过程中的问题点滴
2007-10-27 11:16
375 查看
2006年10月18日 09:34:00
这段时间一直致力于嵌入式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,能有效回避该问题。
在开发过程中一定还会遇到各种各样的问题,有时间再一一写来... ...
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1339242
这段时间一直致力于嵌入式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,能有效回避该问题。
在开发过程中一定还会遇到各种各样的问题,有时间再一一写来... ...
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1339242
相关文章推荐
- 关于VS2005与EVC4.2的项目开发过程中的问题点滴
- 关于VS2005与EVC4.2的项目开发过程中的问题点滴
- 关于VS2005与EVC4.2的项目开发过程中的问题点滴
- 关于windowmobile 开发vs2005不能新建vc++项目的问题
- 敏捷开发模式在项目实际开发过程中一些问题
- node.js项目开发问题集锦(不定期更新,随时把开发过程中遇到的问题加上)
- [项目过程中所遇到的各种问题记录]工具篇——.NET开发时常用的工具类库
- 关于搭建Maven-webapp项目的过程及一些问题
- 关于struts2网页开发过程中的404或500问题
- 关于开发效率和项目周期的问题
- 心得体会:关于开发效率和项目周期的问题
- 项目采用asp.net mvc开发过程中遇到的问题。
- ios开发点滴-关于xib效果和模拟器效果跑出来错位的问题
- 关于C#开发WEB项目TextBox控件的自适应高问题解决办法!
- asp.net 开发过程中关于image控件中图片点击后地址乱码的问题
- 关于实际项目中C++(MFC)指针问题的解决过程
- 关于 weChat 页面开发过程中遇到的问题总结
- 谈谈在开发过程中关于数据库操作的问题
- 关于团队合作开发项目时的沟通问题!(不仅要注意【相关机能】,还要注意【相似功能】)
- 项目开发过程中的细节问题及解决方法(Vue,Css)(入门级)