最近做视频前端,全是C++的DLL,于是用C#来调用,遇到这个问题。//函数原型,(参数方向均是 out)
//BOOL VSNET_ClientReadMessage(char *m_sername,char *m_url)
[DllImport("NetClient.dll")]
public static extern bool VSNET_ClientReadMessage(out IntPtr m_sername, out IntPtr m_url)在调用函数的时候,就是怎样把指向m_sername的值读出来。
我用了这个方法:char[] a = new char[24];
Marshal.Copy(sername, a, 0, 24);运行到这步就出错,m_sername到是有个值,77512061 ,估计是指向的内存地址抛出异常:System.AccessViolationException尝试读取或写入内存出错!
另外,用stringbuilder试过,传出来的值只有1个字符 'e',很奇怪。应该传出的值为 sername="video server"======================================该函数在VC++中使用的代码如下:char sername[24];
char url[40];if(!VSNET_ClientReadMessage(sername,url))
return;//下面是具体处里代码,不贴了
找不出原因,发贴来问!!!
请教各位程序员朋友,帮个小忙 :)
//BOOL VSNET_ClientReadMessage(char *m_sername,char *m_url)
[DllImport("NetClient.dll")]
public static extern bool VSNET_ClientReadMessage(out IntPtr m_sername, out IntPtr m_url)在调用函数的时候,就是怎样把指向m_sername的值读出来。
我用了这个方法:char[] a = new char[24];
Marshal.Copy(sername, a, 0, 24);运行到这步就出错,m_sername到是有个值,77512061 ,估计是指向的内存地址抛出异常:System.AccessViolationException尝试读取或写入内存出错!
另外,用stringbuilder试过,传出来的值只有1个字符 'e',很奇怪。应该传出的值为 sername="video server"======================================该函数在VC++中使用的代码如下:char sername[24];
char url[40];if(!VSNET_ClientReadMessage(sername,url))
return;//下面是具体处里代码,不贴了
找不出原因,发贴来问!!!
请教各位程序员朋友,帮个小忙 :)
public static extern bool VSNET_ClientReadMessage(ref StringBuilder m_sername, out IntPtr m_url);调用时候使用
VSNET_ClientReadMessage(ref sername,url)) 不知道行不行 不行的吧 在试试 插入ref char[]
public static extern bool VSNET_ClientReadMessage(out IntPtr m_sername, out IntPtr m_url);void fun()
{
IntPtr sername;
IntPtr url;
VSNET_ClientReadMessage(out sername,out url) System.Dialognose.Debug.WriteLine("sername:"+sername); byte[] b=new byte[24];
Marshal.Copy(sername, b, 0, 24); //到这步出现内存出错!
}
--------又试过如下: 用 string
[DllImport("NetClient.dll",CharSet=Ansi]
public static extern bool VSNET_ClientReadMessage(string m_sername, out IntPtr m_url);
几次实验下来,能得到一个字符'e',显然是不对的。后面再试几次,连 执行函数体 VSNET_ClientReadMessage 都过不了,奇怪。-------
再试过StringBuilder,方法同string,还是只能得到'e'=============
看看他的VC++代码:char sername[24];
char url[40]; VSNET_ClientReadMessage(sername,url);//执行后,sername ="vedio server", url="92.168.1.23"高手们,还有高招吗 ?
StringBuilder demo = new StringBuilder(24);
public static extern bool VSNET_ClientReadMessage(ref string m_sername, ref string m_url);
char sername[24];
char url[40]; if(!VSNET_ClientReadMessage(sername,url))
return; //下面是具体处里代码,不贴了 看你的逻辑,似乎是最后作了strcpy(sername, "some value");然后return sername;如果是这样,出现你这个问题就不奇怪了。因为sername[24]是在stack上的,你的return sername执行完成后,该地址就可能是任何的一个随即的值,你只得到一个‘e',很正常了。你修改为:char* sername = (char*)malloc(24);
看看。当然,也要注意内存泄露的问题。另外,call native时,一般用stringbuilder就行了。
强!!!应该是这个原因。C++代码不是我写的,用了朗驰的视频开发SDK包。只提供了VC++的应用例子,而且运用正常。