请问如何调用C++的DLL并返回一个数组?

hxn8203 2008-04-07 05:25:21
各位好,我用C#写了个程序,要调用一个C++编写的DLL(也是我写的),我现在想让这个DLL返回个字符串的数组,请问应该怎么写啊?
在C++那端定义成 string* Getstr(); 可以吗?那在C#这边要怎么写呢?
我写了 [DllImport("D:\\Ata.dll", EntryPoint = "Getstr",CharSet = CharSet.Auto, CallingConvention =CallingConvention.StdCall)]
public unsafe static extern string[] Getstr(); 但结果报
无法封送处理“return value”: 无效的托管/非托管类型组合

用public unsafe static extern string* Getstr(); 说
无法获取托管类型(“string”)的地址和大小,或无法声明指向它的指针

请问应该怎么解决啊?谢谢了!
...全文
1442 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
返回字符串数组 由参数返回SafeArray类型的VARIANT
void GetStr(VARIANT* var);
其中var中放一个BSTR类型的1维数组。
lake_cx 2008-04-08
  • 打赏
  • 举报
回复
楼主要的是字符串数组,应该是LPSTR *(char**)类型,但是用返回值似乎行不同,因为无法判断数组长度
建议楼主返回字符串,用特殊字符进行分割,C++中返回char*,封送成C#的时候直接返回string,然后进行分割得了
  • 打赏
  • 举报
回复
你先确定你的C++的代码是对的,是不是返回局部变量?

是这样写的么?
char* getstr()
{
char sz[32]="asduifhsdfafd";
return sz;
}
要是类似这样的写法,C#用何种方式都不可能调用成功的。要成功只能说是运气
hxn8203 2008-04-08
  • 打赏
  • 举报
回复
回10楼的,我用了
Marshal.Copy(RefComm.Getstr(bytes), bytes, 0, 300);
但好象如果string[]中或一string的长度超过16,它在内存中的位置会有变化。
hxn8203 2008-04-08
  • 打赏
  • 举报
回复
回9楼的,对你说的,实在不是很理解。
10楼的,用Marshal.Copy的话,必须事先知道返回的数组的大小,是吧?
hxn8203 2008-04-08
  • 打赏
  • 举报
回复
其实想要返回的是一个类似

L H W
1 10 20 25
2 20 20 25
3 30 20 25
4 20 25 30

的二维表,其实列数、列名、行数都不确定。
hxn8203 2008-04-08
  • 打赏
  • 举报
回复
谢谢几位,回akirya,真不好意思,被你13楼说中了。
这个在赶进度,就先取了个折中的办法,在C++里把字符串数组的值写到文本文件里,再让C#去读,先将就了。
  • 打赏
  • 举报
回复
返回到IntPtr
然后用
Marshal.Copy(IntPtr source,
char[] destination,
int startIndex,
int length
) 复制出去.
最好一行写完

Marshal.Copy( Getstr() , ..... );这样写
xudeli1979 2008-04-07
  • 打赏
  • 举报
回复
你要把数组的内容,拷贝到你的那个返回地址里去,他才能到stringbuilder里,你先,返回指针个指针,成功后再试一维的,在试二维的,一点一点来,应该没问题
hxn8203 2008-04-07
  • 打赏
  • 举报
回复
我在C#定义那用了

[DllImport("D:\\Add_to_assembly\\Debug\\Ata.dll", EntryPoint = "Get_bom",CharSet =CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern StringBuilder Getstr();

返回的好象是个数组,但

StringBuilder pt;
pt = RefComm.Getstr();
MessageBox.Show(pt[0].ToString());

打出的是乱码,我以前没有用过StringBuilder ,不好意思。。
hxn8203 2008-04-07
  • 打赏
  • 举报
回复
6楼,麻烦能说的详细些吗?
xudeli1979 2008-04-07
  • 打赏
  • 举报
回复
用输出参数,或用stringbuilder(在调用声明里)
hxn8203 2008-04-07
  • 打赏
  • 举报
回复
是 string[] Getstr();吗?
报语法错误。
debug1984 2008-04-07
  • 打赏
  • 举报
回复
简单层面上讲 C++里数组和指针可以替换的,你在C++里函数返回类型改成 string[] 试下。
hxn8203 2008-04-07
  • 打赏
  • 举报
回复
c++的dll是做的二次开发,只支持C++....
hxn8203 2008-04-07
  • 打赏
  • 举报
回复
其实代码还没完全定,但要求是要返回个string的数组。或者char的两维数组也可以。
healer_kx 2008-04-07
  • 打赏
  • 举报
回复
我想看你的DLL里面的C/C++代码, DLL应该以输出C stdcall的函数为准, 其他形式的接口似乎是不可以调用的。

110,544

社区成员

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

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

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