C#專案需要呼叫C++元件DLL函式:
char SetPar (char *P, long size)
P:引數
size:引數長度
回傳:1 →成功、 0 →失敗、-1 →忙
我寫的C#:
//定義結構體
[StructLayout(LayoutKind.Sequential)]
public struct Par
{
[MarshalAs(UnmanagedType.ByValArray,SizeConst =2)]
public byte[] aa;
public byte bb;
public float cc;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
public Int32[] dd;
}
參考DLL
[DllImport("TEST.DLL", EntryPoint = "SetPar", CallingConvention = CallingConvention.Cdecl)]
public extern static int SetPar(Par par1,long size);
呼叫函式
private void btnSetPa_Click(object sender, EventArgs e)
{
int ret=1;
Par P=new Par();
P.aa=new byte(2);
P.aa[0]=1;
P.aa[1]=1;
P.bb=1;
P.cc=2.0;
P.dd=new byte(8);
P.dd[0]=1000;
P.dd[1]=200;
int num=sizeof()
ret = SetParameter(ptr, 15);
switch (ret)
{
case 1:
msg = "引數設定成功!";
break;
case 0:
msg = "引數設定失敗!";
break;
case -1:
msg = "系統忙!\r\n";
break;
default:
msg = "未知錯誤!\r\n";
break;
}
txtInfo.Text = msg;
}
按上邊的寫法,能回傳 1,但是引數沒有傳進去(用getPar取出引數,發現引數沒有變化);
改成:
public extern static int SetPar(ref Par par1,long size);
ret = SetParameter(ref ptr, 15);
引數能傳進去,但回傳未知錯誤。
請問大神這是怎么回事?c#呼叫c++指標函式始終搞不明白~
uj5u.com熱心網友回復:
頂一下,等大神慷慨指導~uj5u.com熱心網友回復:
你可以對結構體定義為unsafe,引數你用結構體就可以了,結構體有位元組對齊,char*則沒有位元組對齊。傳過去會錯位。ret = SetParameter(ptr, 15);
ptr在哪,代碼貼錯了?
uj5u.com熱心網友回復:
貼錯了,ret = SetParameter(ref p, 15);
uj5u.com熱心網友回復:
ret = SetParameter(p, 16);這樣試試
[StructLayout(LayoutKind.Sequential)]
public struct Par
{
[MarshalAs(UnmanagedType.ByValArray,SizeConst =2)]
public byte[] aa;//2位元組
public byte bb;//1位元組
public float cc;//4位元組,累計到這里7位元組,位元組對齊到8位元組
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
public Int32[] dd;//4*2位元組
}
整個是16位元組
uj5u.com熱心網友回復:
我看了一下ret = SetParameter(ref p, 15)的回傳值,ret=513
把public extern static int SetPar(Par par1,long size);改成public extern static sbyte SetPar(Par par1,long size);
回傳的ret正好=1,看來還是資料型別沒搞對!
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/276491.html
標籤:C#
上一篇:c#表單程式設計
