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#中结构体定义代码:
[StructLayout(LayoutKind.Sequential,CharSet=CharSet.Ansi)]
public struct MY_DATA
{
public Int32 Flag;
public String buff;
};相应导出函数的委任声明:
public delegate MY_DATA SendBuffTo();我只列出了问题代码段,因为C#中loadlibrary,getprocaddress都是好的,直到调GetDelegateForFunctionPointer这报错了;C#委任代码原形:
public static Delegate GetDelegateFromInt(int address, Type t)
{
if (address == 0)
return null;
else
{
try
{
return Marshal.GetDelegateForFunctionPointer(new IntPtr(address), t);
}
catch (Exception e)
{
Console.WriteLine(e); return null;
}
}
}C#中调用此委任函数如下:
SendBuffTo sbt = (SendBuffTo)DllWrap.GetDelegateFromInt(FunSenBuf, typeof(SendBuffTo));网上说的类型基本都试了,哭啊,都不行,太恶心了,哪位大侠救救我啊
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#中结构体定义代码:
[StructLayout(LayoutKind.Sequential,CharSet=CharSet.Ansi)]
public struct MY_DATA
{
public Int32 Flag;
public String buff;
};相应导出函数的委任声明:
public delegate MY_DATA SendBuffTo();我只列出了问题代码段,因为C#中loadlibrary,getprocaddress都是好的,直到调GetDelegateForFunctionPointer这报错了;C#委任代码原形:
public static Delegate GetDelegateFromInt(int address, Type t)
{
if (address == 0)
return null;
else
{
try
{
return Marshal.GetDelegateForFunctionPointer(new IntPtr(address), t);
}
catch (Exception e)
{
Console.WriteLine(e); return null;
}
}
}C#中调用此委任函数如下:
SendBuffTo sbt = (SendBuffTo)DllWrap.GetDelegateFromInt(FunSenBuf, typeof(SendBuffTo));网上说的类型基本都试了,哭啊,都不行,太恶心了,哪位大侠救救我啊
解决方案 »
- word/excel的页眉插入图片的问题
- 如何修改dll中的资源文件
- C#写入Access DB字段,一个大数据文件问题!
- svn版本控制器 制作证书
- c# 点击按钮打开一个form后,textbox自动获得焦点。
- 悲剧出现了,关于Linq,有图有真相。。。
- c# .net(winform)中定义了水晶报表问题
- 没想明白,屏蔽基类的相关属性
- (有没有人可以帮我啊!)关于使用httpwebrequest抓网页用streamreader.readtoend()读网页内容时有些网页会导致cpu100%并死机?
- 请教下C#与C++在图像处理上的比较
- 簡體C#2005開發的winFrom多窗體程序,如何快速轉爲繁體C#2005程序?
- 请教大家,为什么要有ArrayList这个怪物存在?
这样看调用是否成功
为什么啊那我怎么得到结构体变量的值啊??还请再赐教呢
md=(MY_DATA)System.Runtime.InteropServices.Marshal.PtrToStructure(i, typeof(MY_DATA));
md就是你想返回的结构体,i是你调用DLL返回的指向一个MY_DATA结构体的指针
,是IntPtr类型的因为这个DLL返回的是一个结构体,而这个结构体的大小是大于你所使用的INT,DOUBLE类型的大小,一旦你使用的大小超过这个结构体的大小就会报错的
{
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);//最后经过打印语句检验,值完全收到并解析成功;再次感谢大侠的支持啊,小弟拜谢ING~~~~感动死了,总算解决了。啊。。哈哈哈哈哈~~~
希望对遇到同样问题的人有帮助。。
我也遇到了同样的问题,折腾了一天,看到此贴,终于解决了问题 。就是下面这句:
string str = System.Runtime.InteropServices.Marshal.PtrToStringAnsi(mssd.Databuff);