最近做硬件接口的调用,对方是C++,我用的C#调用,前几天整的大部分方法能调用了,但是现在卡在c++返回结构了。C++结构声明 ,人家之给我这个,说是返回这个结构typedef struct ITEMDATA
{
char strCellName[MAX_PATH];
double fLeft;
double fTop;
double nWidth;
double nHeight;
}ITEMDATA,*PITEMDATA;C# public struct ITEMDATA
{
public string strCellName;
public double fLeft;
public double fTop;
public double nWidth;
public double nHeight;
}
我是这样定义的,但是接受返回结构的时候 提示 "方法的类型签名与 PInvoke 不兼容。"还有就是顺便问下看见别的朋友大概是这样写, 前面[]是不是必须要加? [StructLayout(LayoutKind.Sequential)]
public struct ITEMDATA
{
[MarshalAs(UnmanagedType.ByValTStr , SizeConst = 255)]
public string strCellName;
[MarshalAs(UnmanagedType.R4)]
public double fLeft;
[MarshalAs(UnmanagedType.R4)]
public double fTop;
[MarshalAs(UnmanagedType.R4)]
public double nWidth;
[MarshalAs(UnmanagedType.R4)]
public double nHeight;
}
期待高手解决,已经卡了我2个小时,时间紧迫啊。100分在线等,解决立刻给分了。
{
char strCellName[MAX_PATH];
double fLeft;
double fTop;
double nWidth;
double nHeight;
}ITEMDATA,*PITEMDATA;C# public struct ITEMDATA
{
public string strCellName;
public double fLeft;
public double fTop;
public double nWidth;
public double nHeight;
}
我是这样定义的,但是接受返回结构的时候 提示 "方法的类型签名与 PInvoke 不兼容。"还有就是顺便问下看见别的朋友大概是这样写, 前面[]是不是必须要加? [StructLayout(LayoutKind.Sequential)]
public struct ITEMDATA
{
[MarshalAs(UnmanagedType.ByValTStr , SizeConst = 255)]
public string strCellName;
[MarshalAs(UnmanagedType.R4)]
public double fLeft;
[MarshalAs(UnmanagedType.R4)]
public double fTop;
[MarshalAs(UnmanagedType.R4)]
public double nWidth;
[MarshalAs(UnmanagedType.R4)]
public double nHeight;
}
期待高手解决,已经卡了我2个小时,时间紧迫啊。100分在线等,解决立刻给分了。
解决方案 »
- 创建文件夹及判断文件夹大小
- 用Graphics画图时画不出来
- 一个编解码问题
- 类间引用后,不能执行其方法,请指点如何调整....
- 如何改变位图的dpi和大小,我的代码总是异常报出(GDI+)
- 谁有好的多线程例子呀,麻烦各位网友提供几个比较好的多线程学习源码
- 如何获取HTML页面的JS函数的值?然后返回?
- Winform的DataGridView中添加两个RadioButton
- 关于一个页面数据分别存入两张表的问题
- XML 问题
- winform 中DataGridBoolColumn 的truevalue和falsevalue设置无用
- ASP.NET Web应用程序和ASP.NET Web服务的区别
改为public char[] strCellName;
试试
public char[] strCellName;已经如上定义仍然出现 "方法的类型签名与 PInvoke 不兼容。" 对方一直是做C++的,他那边是不是也要注意什么?
{
[MarshalAs(UnmanagedType.ByValTStr , SizeConst =这里为那个输出参数的大小,此处为常量)]
public string strCellName;
}
是不是因为你的MAX_PATH的原因,那个传出的实际参数是多少
////////////////结构////////////////
public struct ITEMDATA
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 5)]
public string strCellName;
[MarshalAs(UnmanagedType.R4)]
public double fLeft;
[MarshalAs(UnmanagedType.R4)]
public double fTop;
[MarshalAs(UnmanagedType.R4)]
public double nWidth;
[MarshalAs(UnmanagedType.R4)]
public double nHeight;
}
//////////////////测试的////////////
class test1
{
[DllImport("TEMPL.dll", EntryPoint="GetEveryChangeCellName")]
public static extern ITEMDATA GetEveryChangeCellName(int i);
}
////////////////调用///////////////////
private void button10_Click(object sender, System.EventArgs e)
{
ITEMDATA itemdata = test1.GetEveryChangeCellName(1);
MessageBox.Show(itemdata.nHeight.ToString());
}
public struct ITEMDATA {
public const int MAX_PATH= 那个字符数组的大小;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst=MAX_PATH)]
public string strCellName; MarshalAs(UnmanagedType.R8)]
public double fLeft;
MarshalAs(UnmanagedType.R8)]
public double fTop;
MarshalAs(UnmanagedType.R8)]
public double nWidth;
MarshalAs(UnmanagedType.R8)]
public double nHeight; }
MarshalAs(UnmanagedType.R4)] float
MarshalAs(UnmanagedType.R8)] double
{
public fixed byte strCellName[MAX_PATH];
public double fLeft;
public double fTop;
public double nWidth;
public double nHeight;
}
unsafe public struct ITEMDATA
{
public fixed byte strCellName[MAX_PATH];
public double fLeft;
public double fTop;
public double nWidth;
public double nHeight;
}
你试试吧,我没有时间做试验了.让C++那边改一下,多一个参数.你这儿,C#改一下,多传一个引用的参数.