.NET CF调用eVC的动态库,Char* 传参问题解决方法。
2008-07-09 00:56
489 查看
做项目时碰到这个问题,在网上搜了半天,资料很少。不过做了多次试验后总算调出来了,放出来供大家参考。eVC函数原型intInit_Port(char*mPort);这个函数需要接收一个Char*参数,指示打开哪个com端口。
我需要把ComPortName的值作为参数进行传递。一开始,我定义
调用部分:
Byte[]buf=System.Text.Encoding.ASCII.GetBytes(ComPortName);
try
{
Int32iRet=Init_Port(buf);
if(iRet==0)
{
_CurPortState=PortState.Opened;
}
else_CurPortState=PortState.OpenFailed;
}
catch(Exception){_CurPortState=PortState.OpenFailed;}
一次性调试通过。实际上,这个动态库只能接受ASCII编码的参数。但是在Mobile平台,参数的传递是基于Unicode的。有资料说如果eVC将函数声明为WChar_t*,那么直接传递String就可以了。我自己没办法做实验,进做资料的记录。顺便记一下如何从处理IntPtr参数值。
///<summary>
///消息循环,在这里处理消息。
///</summary>
///<paramname="msg"></param>
protectedoverridevoidWndProc(refMessagemsg)
{
switch(msg.Msg)
{
caseWM_SCAN:
try
{
Byte[]Ret=newByte[20];
Marshal.Copy(msg.WParam,Ret,0,20);
TMCode=Encoding.ASCII.GetString(Ret,0,20).Trim(newChar[]{'/0'});
CurScanState=ScanState.Finished;
}
catch(Exception)
{
CurScanState=ScanState.Finished;
}
break;
}
base.WndProc(refmsg);
}
eVC程序利用SendMessage将一个字符串发送到我窗体的handle。因此我首先要处理这个消息循环,相应消息。我需要取得的值被保存在WParam的指针里面。首先声明长度为20的Byte[],之后用Marshal.Copy将Msg.WParam指针指向的内存数据复制到这个数组。然后再利用Encoding.ASCII将Byte[]转换为String。并将结果截断后面的/0。空数据实际上Marshal有一个方法,用于将IntPtr转换为String。名字为Marshal.PtrToStringBSTR(ptr)。然而我的程序里面,调用这个方法会产生内存溢出异常。可能还是源程序写的不够规范吧。
privatereadonlyStringComPortName="COM5:";
我需要把ComPortName的值作为参数进行传递。一开始,我定义
[DllImport("ComPort.dll",EntryPoint="Init_Port",CharSet=CharSet.Auto)]
privatestaticexternInt32Init_Port(StringPortName);
调用Init_Port(ComPortName)后没有报异常,但是返回值显示端口打开失败。分析后认为,还是参数传值的时候出了问题。然后先后把PortName声明为StringBuilder---端口打开失败[Marshal.LPArray]String,报Unsupported异常。多次试验后。决定用Byte[]试试看。于是有了以下代码声明部分:[DllImport("ComPort.dll",EntryPoint="Init_Port",CharSet=CharSet.Auto)]
privatestaticexternInt32Init_Port(Byte[]buf);
调用部分:
try
{
Int32iRet=Init_Port(buf);
if(iRet==0)
{
_CurPortState=PortState.Opened;
}
else_CurPortState=PortState.OpenFailed;
}
catch(Exception){_CurPortState=PortState.OpenFailed;}
一次性调试通过。实际上,这个动态库只能接受ASCII编码的参数。但是在Mobile平台,参数的传递是基于Unicode的。有资料说如果eVC将函数声明为WChar_t*,那么直接传递String就可以了。我自己没办法做实验,进做资料的记录。顺便记一下如何从处理IntPtr参数值。
///消息循环,在这里处理消息。
///</summary>
///<paramname="msg"></param>
protectedoverridevoidWndProc(refMessagemsg)
{
switch(msg.Msg)
{
caseWM_SCAN:
try
{
Byte[]Ret=newByte[20];
Marshal.Copy(msg.WParam,Ret,0,20);
TMCode=Encoding.ASCII.GetString(Ret,0,20).Trim(newChar[]{'/0'});
CurScanState=ScanState.Finished;
}
catch(Exception)
{
CurScanState=ScanState.Finished;
}
break;
}
base.WndProc(refmsg);
}
eVC程序利用SendMessage将一个字符串发送到我窗体的handle。因此我首先要处理这个消息循环,相应消息。我需要取得的值被保存在WParam的指针里面。首先声明长度为20的Byte[],之后用Marshal.Copy将Msg.WParam指针指向的内存数据复制到这个数组。然后再利用Encoding.ASCII将Byte[]转换为String。并将结果截断后面的/0。空数据实际上Marshal有一个方法,用于将IntPtr转换为String。名字为Marshal.PtrToStringBSTR(ptr)。然而我的程序里面,调用这个方法会产生内存溢出异常。可能还是源程序写的不够规范吧。
相关文章推荐
- asp.net调用word的过程中出现的问题及其解决方法
- 关于java jni调用c++动态库的一些问题及解决方法
- JAVA+AXIS客户端调用Asp.net Web Service过程中遇到的问题及解决方法
- Asp.Net里面调用Microsoft Excel Application DCOM问题终极解决方法
- Java 调用 .Net Web Service 问题解决方法分享
- asp.net 用户控件 调用js问题解决方法
- 解决session关闭时再调用对象方法时报session已关闭问题
- 在VS.NET 2003中建立项目时遇到的两个问题及解决方法 (转贴)
- 解决在安装和安装后WinCE.net 4.2时遇到的virtual PC的问题的方法
- ASP.NET Ajax发布时异步刷新失效的问题解决方法
- asp.net mvc使用的心得和问题的解决方法(陆续更新ing)
- Office 开发系列:ASP.Net调用Excel组件错误的问题解决
- 轻松解决asp.net用户ASPNET登录失败问题的方法分享
- C++ 调用Python3 脚本中无法引入内建模块的问题 解决方法
- 关于asp.net中ajax的问题:AjaxControlToolkit 未定义的解决方法
- C# ASP.NET Webservice调用外部exe无效的解决方法
- Net::ERR_INCOMPLETE_CHUNKED_ENCODING问题跟踪,顺藤摸找出解决方法
- 使用DotNetNuke(DNN) Startkit 4.7(及以上版本)安装无法完成问题的解决方法
- 关于AJAX调用ASP.NET MVC 或者WEBAPI项目提示I跨域问题的解决办法
- 调用innerHTML之后onclick失效问题的解决方法