【山之魂】高分求助:C++怎么传递列表给C#?

山之魂2 2012-08-07 10:12:37
本人这几天在做一个项目,现有一个DICOM查询功能的C++DLL,其中有导出类(导出类,不是导出函数,有源代码),
我的工作是用C#调用这个C++将查询到的患者列表显示出来(我是做C#的老菜鸟,C++完全不懂)。
现在遇到的问题是,导出类的函数中要用到类成员对象,但是C#只能对其进行静态调用,无法初始化C++类对象。
我想到的方法是将C++导出类再进行封装,用一个导出函数实现查询功能,
又遇到一个问题,C++用什么返回类型来返回患者列表信息?
C++没有array,ArrayList什么的,甚至不能返回数组(只能返回数组的指针,但是C#不支持指针)。
查过很多资料都没有办法解决。
请各位C++、C#的大虾帮忙,非常感谢。
时间比较紧。
分我不会吝惜的,近期发的帖子都是200分的,比如
http://topic.csdn.net/u/20120724/21/995f94f2-aa80-43ca-96cf-79e822bc33d5.html?seed=2130642648&r=79335479#r_79335479
...全文
1398 66 打赏 收藏 转发到动态 举报
写回复
用AI写文章
66 条回复
切换为时间正序
请发表友善的回复…
发表回复
山之魂2 2013-10-11
  • 打赏
  • 举报
回复
对不起各位大虾,原单位上网不方便,一直没有结贴,在此致歉。
asdss 2012-08-11
  • 打赏
  • 举报
回复
[Quote=引用 62 楼 的回复:]

直接用 swprintf 把char * 类型含有汉字的数据传进去,最后得到一堆乱码

用 mbstowcs_s 因为要给C#调用所以内存越界,

最后用 MultiByteToWideChar 解决了,不过据说这个只能在windows下使用。我们的软件据说是要支持其他系统的……

问题基本都得到解决,有空结贴,
再次感谢各位大虾!
[/Quote]

那你可以试试iconv
在http://www.gnu.org/software/libiconv/#downloading下载
gnu协议的,有源码
asdss 2012-08-11
  • 打赏
  • 举报
回复
[Quote=引用 59 楼 的回复:]

回 56楼,我做了4年C#了不过技术还是很菜。

另外,我在VS2005中没有找到如何建立 托管C++类库……

目前尚余的问题:
我的数据在C++里面是 char * 类型的,要让中文能显示,我要用 wchar_t 传出去,
请问下怎么把 char * 转换为 wchar_t* ??
[/Quote]

在新建项目里Visual C++ -> CLR 里面有个“类库”项目。
我用的08的,按道理05的也应该有的
alwaysrun 2012-08-10
  • 打赏
  • 举报
回复
用C++ Interop:实用托管C++,对非托管C++进行封装。
山之魂2 2012-08-10
  • 打赏
  • 举报
回复
前面名字的中文显示出来了,但是后面多了几个乱码,包含四五个框框和类似9的字符
山之魂2 2012-08-10
  • 打赏
  • 举报
回复
直接用 swprintf 把char * 类型含有汉字的数据传进去,最后得到一堆乱码

用 mbstowcs_s 因为要给C#调用所以内存越界,

最后用 MultiByteToWideChar 解决了,不过据说这个只能在windows下使用。我们的软件据说是要支持其他系统的……

问题基本都得到解决,有空结贴,
再次感谢各位大虾!
wenbin 2012-08-10
  • 打赏
  • 举报
回复
[Quote=引用 59 楼 的回复:]

我的数据在C++里面是 char * 类型的,要让中文能显示,我要用 wchar_t 传出去,
请问下怎么把 char * 转换为 wchar_t* ??
[/Quote]

char szA[100]; //An ANSI string buffer
WCHAR szW[100]; //A Unicode string buffer

//Normal sprintf:all strings are ANSI
sprintf(szA, "%s","ANSI Str");

//Converts Unicode string to ANSI
sprintf(szA,"%S",L"Unicode Str");

//Normal swprintf:all strings are Unicode
swprintf(szW,L"%s",L"Unicode Str");

//Converts ANSI string to Unicode
swprintf(szW,L"%S", "ANSI Str");

以上代码来自 windows核心编程
E次奥 2012-08-10
  • 打赏
  • 举报
回复
返回字符串。接口调用,根据固定的符号分割。
山之魂2 2012-08-10
  • 打赏
  • 举报
回复
回 56楼,我做了4年C#了不过技术还是很菜。

另外,我在VS2005中没有找到如何建立 托管C++类库……

目前尚余的问题:
我的数据在C++里面是 char * 类型的,要让中文能显示,我要用 wchar_t 传出去,
请问下怎么把 char * 转换为 wchar_t* ??
iyomumx 2012-08-09
  • 打赏
  • 举报
回复
char和wchar用winapi WideCharToMultiByte 转换

char * =b->c->getcurrent()
这句完全不能过编译吧……
foxsofter_001 2012-08-09
  • 打赏
  • 举报
回复
不能连续回复,给你找了个,应该可以解决你的问题,搜索“如何通过P/Invoke返回Struct和String Array
foxsofter 2012-08-09
  • 打赏
  • 举报
回复
忘了说了,你要返回的是一个空指针,当然要报错了。。。
foxsofter 2012-08-09
  • 打赏
  • 举报
回复
函数少写了什么哦。。。。
另外是想返回一个struct的指针是吗?这个还是不能满足的要返回一个列表的需求啊。。。
foxsofter 2012-08-09
  • 打赏
  • 举报
回复
因为那个A的getInfo()函数的逻辑,怎么会是这样的啊。。

int getInfo( )
{
char * =b->c->getcurrent()
}
山之魂2 2012-08-09
  • 打赏
  • 举报
回复
报告一下进展情况:
中文不能传送的问题,在把 ArraySubType = UnmanagedType.LPStr, 改成 BSTR,char 改成wchar,_sprintf 改成_swprintf 之后解决了。
C#调用得不到结果是因为 C#用string类型传入参数,C++用char * 接收时获取不到。改用
上面的传字符串数组的方法传进去了。
谢谢各位了!

现在还有点问题:
一是char 和wchar 的转换, 一个 char * const 类型的数据,怎么把它取出来?

二是C#调用的C++函数 在取char * const 类型的值总是提示 尝试读取或者写入受保护的内存,
结构如下:

C++
__declspec(dllexport) class A
{
B *b;
int getInfo( )
{
char * =b->c->getcurrent()
}

}

class B
{
C *c;
}

class C
{
D *d;

getcurrent()
{
return d;
}

}

struct D
{
char * e;
}

我在用C#调用 A的getInfo( ) 函数时,总是报“尝试读取或者写入受保护的内存”。

哪位大虾给点提示,万分感激!
foxsofter 2012-08-09
  • 打赏
  • 举报
回复
楼主请考虑用Google.Protocolbuffer来实现,这个比xml的序列化快太多了
yanasdf789 2012-08-09
  • 打赏
  • 举报
回复
用 gsoap 很好用 ,如果不想用dll
饭饭000 2012-08-09
  • 打赏
  • 举报
回复
对于不懂C++的菜鸟,建议请使用XML把数据进行序列化,那么c#和C++转化就找到桥梁了
deping_chen 2012-08-09
  • 打赏
  • 举报
回复
很显然,答案就是用C++/CLI进行封装非托管C++类,然后再用C#调用。
deping_chen 2012-08-09
  • 打赏
  • 举报
回复
我是做C#的老菜鸟。什么意思?
加载更多回复(46)

110,536

社区成员

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

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

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