C# 調用C結構體

 C++dll函數代碼如下:

結構體原形:
typedef struct MY_DATA
{
int DataFlag;
char *DataBuff;
} MY_DATATYPE;

結構體變量聲明賦值:
MY_DATATYPE msd;
msd.DataFlag = MY_EMPTY;
msd.DataBuff = (char*)malloc(MYTMPBUFFSIZE*sizeof(char));
ZeroMemory(msd.DataBuff,MYTMPBUFFSIZE*sizeof(char));

導出函數原形:

 MY_DATATYPE SendBuffTo()
  {
  return msd;
  }
首先改C#結構體如下:

public struct MY_DATA
  {
  public int DataFlag;
  public IntPtr Databuff;//注意,我並非將委託的類型改爲IntPtr,而將string類結構成員變量改爲IntPtr;
  };

委任代碼不變:
public delegate MY_DATA SendBuffTo();

調用代碼也不變:
SendBuffTo sbt = (SendBuffTo)DllWrap.GetDelegateFromInt(FunSenBuf, typeof(SendBuffTo));

mssd = sbt();//首先將C++的函數返回值讀出,mssd是我聲明過的C#中MY_DATA結構體變量;
string str = System.Runtime.InteropServices.Marshal.PtrToStringAnsi(mssd.Databuff);//關鍵語句:將之前定義的IntPtr成員變量 Buff轉換下,試過UNICODE,翻出來是問號,ANSI正確;
Console.WriteLine(str);
Console.WriteLine(mssd.DataFlag);//最後經過打印語句檢驗,值完全收到並解析成功;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章