C++和C# 的字符串传递问题

 

C++定义,要传出字符串 name

void __stdcall getName(int slave, char* name);

代码:    strcpy(name, adapter->name);   用 strcpy 复制修改字符串数据

 

C#定义

[DllImport("lib.dll")]
extern public static void getName(int index, StringBuilder name);

 

网上都是这么说的,我也是这么用的,可是还是崩了,为什么??

重点是:

默认:               StringBuilder sb = new StringBuilder();            默认 sb.Capacity = 16 ,缓冲区长度不够,结果还是会造成溢出

要修改成这样:    StringBuilder sb = new StringBuilder(1024);    要保证缓冲区足够大,避免溢出

 

也可以这么定义:

[DllImport("lib.dll")]
extern public static void getName(int index, byte[] name);

代码这么写:

byte[] bts = new byte[1024];
getName(0, bts);
string ss = System.Text.Encoding.Default.GetString(bts);
ss = ss.Trim('\0');

代码太多,太麻烦了

 

 

如果是直接返回的字符串,如这样:

C++

char* __stdcall getName(int index);

 

C#

[DllImport("soemlib.dll", CharSet = CharSet.Ansi)]
extern public static IntPtr getName(int index);

代码里这么用:

IntPtr pStr= getName(0);
string ss = Marshal.PtrToStringAnsi(pStr);

注意,CharSet.Ansi 和 PtrToStringAnsi 相对应,CharSet.Unicode --> PtrToStringUni

 

posted @ 2024-11-18 18:11  czcbzc  阅读(2)  评论(0编辑  收藏  举报