• 全部
  • C#综合技术
  • C#互联网桌面应用
  • AppLauncher
  • WinForm&WPF
  • C#开发新技术
  • 问答

关于c# 调用C++dll,坐等强人出现!

cdreams 2011-04-23 06:44:27
我想调用一个C++DLL文件里一个函数,函数原型如下:
generate_container(int quantity, int destination, int weight,int ** Container)
其中的最后一个形参是要用来输出的,我想问的是,在c#声明这个函数时,最后一个参数应该如何声明?
我还要调用另一个函数,里面的参数有四维整型指针变量,更不知道应该如何弄了.

大家帮帮忙,这东西比较急,我学C#时间不长,这东西弄了好长时间了,谢谢啦!
...全文
292 点赞 收藏 31
写回复
31 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
rabbitlzx 2011-05-04
[Quote=引用 24 楼 fjcfjcfjcfjc 的回复:]

引用 20 楼 rabbitlzx 的回复:
引用 19 楼 fjcfjcfjcfjc 的回复:

引用 14 楼 rabbitlzx 的回复:
out IntPtr

具体怎么操作啊?试了好久,都写不对啊!



[DllImport("XXXX.dll")]
public static void generate_container(int quantity, int ……
[/Quote]

这是从IntPtr中读取到一维数组,二维的就是两层遍历
private void HandleReturnedErrorCodes(IntPtr errors, int count)
{
IntPtr arrayPointer = Marshal.ReadIntPtr(errors);
int[] errorCodes = new int[count];
int errorValue = 0;
for (int i = 0; i < count; ++i)
{
errorValue = Marshal.ReadInt32(arrayPointer, i * Marshal.SizeOf(typeof(Int32)));
errorCodes[i] = errorValue;
}
}
回复
cdreams 2011-04-29
高手在哪里啊??????????????????????????
回复
cdreams 2011-04-27
郁闷啊,明天又要开会了,连续好几个星期都跟老师说没弄出来,我都不好意思继续说没弄出来了!!!我的救星在哪里哦!!!!!!!!!!!!!
回复
cdreams 2011-04-27
[Quote=引用 27 楼 flywei123 的回复:]
引用 3 楼 xiehuijianlove 的回复:
generate_container(int quantity, int destination, int weight,out int Container)
[/Quote]
呵呵,这个对于一维指针倒是可以的,二维就不行咯!
回复
flywei123 2011-04-27
引用 3 楼 xiehuijianlove 的回复:
generate_container(int quantity, int destination, int weight,out int Container)


回复
cdreams 2011-04-27
[Quote=引用 22 楼 mjp1234airen4385 的回复:]
这个东西需要看dll是如何写的了。
问清楚最后一个参数是干什么的。
在dll内部是如果处理的。
最后你就知道如何定义和传入参数了。
[/Quote]
那个二维指针是用来返回一个二维数组的,当然DLL文件中对它赋了值。
看着你和你楼下那位仁兄的图像,真是纠结呀!呵呵
回复
cdreams 2011-04-27
[Quote=引用 20 楼 rabbitlzx 的回复:]
引用 19 楼 fjcfjcfjcfjc 的回复:

引用 14 楼 rabbitlzx 的回复:
out IntPtr

具体怎么操作啊?试了好久,都写不对啊!



[DllImport("XXXX.dll")]
public static void generate_container(int quantity, int destination, int weight, ……
[/Quote]

那个二维指针是用来返回一个二维数组的,那按你所说的方法调用后,怎样才能把这个数组的值输出来呢?假如这个数组是5*5的。
回复
visir 2011-04-27
听说用ref int[]可以, 呵呵
回复
mjp1234airen4385 2011-04-27
这个东西需要看dll是如何写的了。
问清楚最后一个参数是干什么的。
在dll内部是如果处理的。
最后你就知道如何定义和传入参数了。
回复
西门喷血 2011-04-27
[DllImport("kernel32.dll")]

public static extern int GetProcAddress(int hModule, string lpProcName);
这是调用系统API的
C++的雷同
回复
rabbitlzx 2011-04-27
[Quote=引用 19 楼 fjcfjcfjcfjc 的回复:]

引用 14 楼 rabbitlzx 的回复:
out IntPtr

具体怎么操作啊?试了好久,都写不对啊!
[/Quote]


[DllImport("XXXX.dll")]
public static void generate_container(int quantity, int destination, int weight, out IntPtr Container)


调用时
IntPtr container = Marshal.AllocCoTaskMem(Marshal.SizeOf(typeof(Int32)));
generate_container( ..., out container);


回复
cdreams 2011-04-26
[Quote=引用 14 楼 rabbitlzx 的回复:]
out IntPtr
[/Quote]
具体怎么操作啊?试了好久,都写不对啊!
回复
cdreams 2011-04-26
[Quote=引用 10 楼 wangrui0610 的回复:]
int 对应 C#中 byte
参数写法:out byte[][] Container
[/Quote]
呵呵,谢谢啦,数组应该是不行的,我都试过了
回复
cdreams 2011-04-26
[Quote=引用 13 楼 csrwgs 的回复:]
拿分

把指针转换成IntPTR
用Marshal.UseUnsafe....
[/Quote]
大哥,能说具体点吗?
回复
showjancn 2011-04-25
好好研究一下“IntPtr” C#的这个类型,可以解决大部分从C++库中的转换问题。
回复
rabbitlzx 2011-04-25
out IntPtr
回复
csrwgs 2011-04-25
拿分

把指针转换成IntPTR
用Marshal.UseUnsafe....
回复
shrinerain 2011-04-25
[Quote=引用 10 楼 wangrui0610 的回复:]
int 对应 C#中 byte
参数写法:out byte[][] Container
[/Quote]

-_-b
回复
pluojie8 2011-04-25
sv2005在哪里下载好点
回复
大笨蛋 2011-04-25
int 对应 C#中 byte
参数写法:out byte[][] Container
回复
加载更多回复
相关推荐
综教楼后的那个坑用双向链表实现 描述   在 LIT 综教楼后有一个深坑,关于这个坑的来历,有很多种不同的说法。其中一种说法是,在很多年以前,这个坑就已经在那里了。这种说法也被大多数人认可,这是因为该坑有一种特别的结构,想要人工建造是有相当困难的。   从横截面图来看,坑底成阶梯状,由从左至右的 1..N 个的平面构成(其中 1 ≤ N ≤ 100,000),如图:    *            * :    *            * :    *            * 8    *    **      * 7    *    **      * 6    *    **      * 5    *    ********* 4 <- 高度    *    ********* 3    ************** 2    ************** 1 平面 |  1  |2|   3    | 每个平面 i 可以用两个数字来描述,即它的宽度 Wi 和高度 Hi,其中 1 ≤ Wi ≤ 1,000、1 ≤ Hi ≤ 1,000,000,而这个坑最特别的地方在于坑底每个平面的高度都是不同的。每到夏天,雨水会把坑填满,而在其它的季节,则需要通过人工灌水的方式把坑填满。灌水点设在坑底位置最低的那个平面,每分钟灌水量为一个单位(即高度和宽度均为 1)。随着水位的增长,水自然会向其它平面扩散,当水将某平面覆盖且水高达到一个单位时,就认为该平面被水覆盖了。   请你计算每个平面被水覆盖的时间。    灌水 水满后自动扩散 | | * | * * | * * * * V * * V * * * * * * .... * *~~~~~~~~~~~~* * ** * *~~~~** : * *~~~~**~~~~~~* * ** * *~~~~** : * *~~~~**~~~~~~* * ** * *~~~~**~~~~~~* *~~~~**~~~~~~* * ********* *~~~~********* *~~~~********* *~~~~********* *~~~~********* *~~~~********* ************** ************** ************** ************** ************** **************    4 分钟后    26 分钟后        50 分钟后    平面 1 被水覆盖     平面 3 被水覆盖    平面 2 被水覆盖输入   输入的第一行是一个整数 N,表示平面的数量。从第二行开始的 N 行上分别有两个整数,分别表示平面的宽度和高度。 输出   输出每个平面被水覆盖的时间。
发帖
C#
创建于2007-09-28

10.5w+

社区成员

.NET技术 C#
申请成为版主
帖子事件
创建了帖子
2011-04-23 06:44
社区公告

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