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);//最后经过打印语句检验,值完全收到并解析成功;