C# 调DLL,字符串子针的问题

Maxdell 2009-04-02 07:16:39
最近做视频前端,全是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;

//下面是具体处里代码,不贴了


找不出原因,发贴来问!!!
请教各位程序员朋友,帮个小忙 :)
...全文
160 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
zzxap 2009-04-03
  • 打赏
  • 举报
回复
http://www.cnblogs.com/yiki/archive/2008/10/29/1321848.html
zzxap 2009-04-03
  • 打赏
  • 举报
回复
UCHAR int/byte 大部分情况都可以使用int代替,而如果需要严格对齐的话则应该用bytebyte
josephSC 2009-04-03
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 li45214521 的回复:]
此char非彼char。。。。 byte吧
[/Quote]是吧。。
Maxdell 2009-04-03
  • 打赏
  • 举报
回复
stringbuilder 试过,函数注册是没问题,可得不到值,为空。

另外,char 和byte 楼上就别纠缠了,都试过的,没用
asdjwl 2009-04-03
  • 打赏
  • 举报
回复
我是来学习的,,,
Maxdell 2009-04-03
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 juqiang 的回复:]
貌似你的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',很正常了。

[/Quote]

强!!!

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


juqiang 2009-04-03
  • 打赏
  • 举报
回复
貌似你的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就行了。
bobgu 2009-04-03
  • 打赏
  • 举报
回复
这样试试看
public static extern bool VSNET_ClientReadMessage(ref string m_sername, ref string m_url);
xian_wwq 2009-04-02
  • 打赏
  • 举报
回复
可以尝试一下,给stringbuilder预先分配空间
StringBuilder demo = new StringBuilder(24);

Ny-6000 2009-04-02
  • 打赏
  • 举报
回复
看不明白。

Maxdell 2009-04-02
  • 打赏
  • 举报
回复
[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"



高手们,还有高招吗 ?
li45214521 2009-04-02
  • 打赏
  • 举报
回复
此char非彼char。。。。 byte吧
yinxiaowei823 2009-04-02
  • 打赏
  • 举报
回复
你可以试着改变函数原型
public static extern bool VSNET_ClientReadMessage(ref StringBuilder m_sername, out IntPtr m_url);

调用时候使用
VSNET_ClientReadMessage(ref sername,url))

不知道行不行 不行的吧 在试试 插入ref char[]

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧