请选择 进入手机版 | 继续访问电脑版

查看: 178|回复: 2

调用c++Dll文件传递struct引用参数的问题

[复制链接]

1

主题

4

帖子

65

贡献

初级UU族—2级

Rank: 2

积分
65
发表于 2017-5-18 09:17:04 | 显示全部楼层 |阅读模式
大家好,
我最近做的一个项目中会用到甲方提供的C++编写的DLL文件,调用返回值为int,bool类型的方法时没问题,但有一个方法的参数是struct类型的引用参数,我在网上找了很久解决方案,都没成功,请大家帮忙看看,谢谢!
C++中的函数定义为:
[C++] 纯文本查看 复制代码
ALGOLDLL_API int fun1(structA &str);


结构体定义为
[C++] 纯文本查看 复制代码
struct structA
{
	double alpha;
	double beta;
};



fun1处理过后会改变参数结构体str的值,我就是要获取这些值。
C#中我主要尝试过以下两种方法:
1.使用ref:
//定义相同的结构体
[StructLayout(LayoutKind.Sequential)]
[C#] 纯文本查看 复制代码
public struct structA
{
double alpha;
double beta;
}



//引入DLL文件
[C#] 纯文本查看 复制代码
[DllImport("Dll")]
    public static extern int fun1(ref structA a);



//调用
[C#] 纯文本查看 复制代码
structA a = new structA();
fun1(ref a);
Debug.Log(a.ahpha);



2.使用IntPtr:
//定义结构体部分同上

//引入DLL文件
[C#] 纯文本查看 复制代码
[DllImport("Dll")]
public static extern int fun1(IntPtr ptr);


//调用
[C#] 纯文本查看 复制代码
structA a = new structA();
IntPtr ptr = Marshal.AllocHGlobal(Marshal.SizeOf(a));
Marshal.StructureToPtr(a, ptr, false);
fun1(ptr);
structA b= (structA)Marshal.PtrToStructure(ptr, typeof(structA));
Debug.Log(data.alpha);
 Marshal.FreeHGlobal(ptr);


1

主题

4

帖子

65

贡献

初级UU族—2级

Rank: 2

积分
65
 楼主| 发表于 2017-5-18 09:22:50 | 显示全部楼层
帖子发了不能再次编辑
修正下两点错误:
1.声明结构体时有[StructLayout(LayoutKind.Sequential)],一时大意没放进代码块里;
2.最后一段C#代码中的Debug.Log(data.alpha);应为Debug.Log(b.alpha);

1

主题

4

帖子

65

贡献

初级UU族—2级

Rank: 2

积分
65
 楼主| 发表于 2017-5-20 01:37:31 | 显示全部楼层
问题已经解决,原因不在调用方法不对,而是我忽视了甲方提供的一个配置文件,放入正确路径下即可。
谢谢大家!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表