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);//最後經過打印語句檢驗,值完全收到並解析成功;
結構體原形:
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);//最後經過打印語句檢驗,值完全收到並解析成功;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.