最近做视频前端,全是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;//下面是具体处里代码,不贴了
找不出原因,发贴来问!!!
请教各位程序员朋友,帮个小忙 :)

解决方案 »

  1.   

    你可以试着改变函数原型
    public static extern bool VSNET_ClientReadMessage(ref StringBuilder m_sername, out IntPtr m_url);调用时候使用
    VSNET_ClientReadMessage(ref sername,url)) 不知道行不行 不行的吧  在试试  插入ref char[]
      

  2.   

    此char非彼char。 byte吧 
      

  3.   

    [DllImport("NetClient.dll",CharSet=Ansi] 
    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"高手们,还有高招吗 ?
      

  4.   

    可以尝试一下,给stringbuilder预先分配空间
    StringBuilder demo = new StringBuilder(24);
      

  5.   

    stringbuilder 试过,函数注册是没问题,可得不到值,为空。另外,char 和byte 楼上就别纠缠了,都试过的,没用
      

  6.   

    UCHAR            int/byte   大部分情况都可以使用int代替,而如果需要严格对齐的话则应该用bytebyte 
      

  7.   

    http://www.cnblogs.com/yiki/archive/2008/10/29/1321848.html
      

  8.   

    这样试试看
    public static extern bool VSNET_ClientReadMessage(ref string m_sername, ref string m_url); 
      

  9.   

    貌似你的C++代码有问题:
    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就行了。
      

  10.   


    强!!!应该是这个原因。C++代码不是我写的,用了朗驰的视频开发SDK包。只提供了VC++的应用例子,而且运用正常。