在C++中定义了两个结构,
struct a
{
int16 tt;
}str_astruct b
{
str_a *ss;
}问一下,我在c#里所传的对应参数的结构体该怎么写?
如果b.str_a不是一个指针的话 我传过去是对的,但是如果是指针的话,我传过去老说参数结构不对!
struct a
{
int16 tt;
}str_astruct b
{
str_a *ss;
}问一下,我在c#里所传的对应参数的结构体该怎么写?
如果b.str_a不是一个指针的话 我传过去是对的,但是如果是指针的话,我传过去老说参数结构不对!
解决方案 »
- 关于RDLC纸张设置的问题
- c# ToString 将'.'转换为了',' 的问题
- 我做了一个activex,然后又做了一个安装包,但使用时需要数字签名才能安装,不知道谁能告诉我怎么给安装包加签名。
- 如何读取数据库里的内容?
- c#调用vc++ 的dll的问题
- C# SqlParameter 能用在SQl语句:select top 2 id from ArticleInfo 中的“2”吗
- 接口类型的变量不用new一下(实例化)吗?
- 请问,关于DataTable
- 关于数据传递的问题,大家帮我看看代码什么地方有错? 急!
- 求C#将DataGridView中的数据保存为EXCEL的方法,要有SaveFileDialog的,谢谢
- 请教一个动态添加label位置的问题,请来看看,谢谢
- CSDN那里改用户名啊?
c++写的dll在c#里面调用的话每种类型对应参见下链接
http://hi.baidu.com/itlike/blog/item/0feb0eed50df08d3b21cb170.html
用 IntPtr sp代替 str_a ss=new str_a();
IntPtr sp = Marshal.AllocCoTaskMem(Marshal.SizeOf(ss));
Marshal.StructureToPtr(ss, sp, false);
struct b
{
IntPtr sp;
}然后在
str_a ss=new str_a();
IntPtr sp = Marshal.AllocCoTaskMem(Marshal.SizeOf(ss));
Marshal.StructureToPtr(ss, sp, false);试试
上面那位说的办法,我的参数比较多,不知道怎么用?
typedef struct Time_Str
{
int16 YearData;
int16 MonthData;
int16 DayData;
int16 HourData;
int16 MinuteData;
int16 Second;
}Str_TimePara;//已十进制最后两位为小数点后两位。
//停车出入数据
typedef struct Str_ParkData
{
int16 UserType;
int16 CarType;
int16 InOutCounter;
Str_TimePara *GuestInOut;
}StrParkingRecData;
如果是这样的话,麻烦你写一下怎么用你的mashall,谢谢
{
int16 UserType;
int16 CarType;
int16 InOutCounter;
IntPtr GuestInOut; //c#中指针用IntPtr}StrParkingRecData; StrParkingRecData aa=new StrParkingRecData();函数调用完了 你想获得aa中Str_TimePara *GuestInOut 这个结构体的时候
IntPtr oo= aa.GuestInOut
Str_TimePara str_timePara = Marshal.PtrToStructure(oo, typeof(Str_TimePara));
就将 oo转换成 Str_TimePara类型的结构体了
一.先将DLL文件拷入C:\WINDOWS\SYSTEM32目录下.
二.若需注册:regsvr32 DLL文件名,或是直接打开DLL文件,打开方式选择regsvr32
三.新建网站,
导包:using System.Runtime.InteropServices;
// 读取心率参数,这里必须选择一个entrypoint作为程序的入口点
[DllImport("JTParam_dll.dll",EntryPoint="?Get_HR@CJTParameter@@QAEHXZ")]
public static extern int Get_HR(); this.Label1.Text = Get_HR().ToString();
四.DLLIMPORT的第二个参数需要用到 dumpbin /exports DLL文件名这种方式获取到
五.dumpbin在vc6.0的\VC6CN\VC98\BIN目录下
它需要用到的一个MSPDB60.DLL和LINK.EXE一同拷进C:\WINDOWS\SYSTEM32即可
打散写就简单了,你看下API里面与c#里面的类型对应,直接调用就可以了。
感觉想值没有赋进去一样。
有个问题,像你这样写,我什么时候给GuestInOut赋值呢?
你是要在调用之前就给GuestInOut赋值的话 因为typedef struct Str_ParkData
{
int16 UserType;
int16 CarType;
int16 InOutCounter;
IntPtr GuestInOut; //c#中指针用IntPtr}StrParkingRecData; 中定义的是IntPtr 类型
你先初始话这个结构体
typedef struct Time_Str
{
int16 YearData;
int16 MonthData;
int16 DayData;
int16 HourData;
int16 MinuteData;
int16 Second;
}Str_TimePara;
Str_TimePara str=new Str_TimePara();
str.YearData=....
str.MonthData=.....
完了以后 你把这个str结构体对象在转换成intptr
IntPtr sp = Marshal.AllocCoTaskMem(Marshal.SizeOf(str));
Marshal.StructureToPtr(str, sp, false); 这样在把sp赋值给typedef struct Str_ParkData
{
int16 UserType;
int16 CarType;
int16 InOutCounter;
IntPtr GuestInOut; //c#中指针用IntPtr}StrParkingRecData 中的IntPtr GuestInOut; 如 StrParkingRecData recData=new StrParkingRecData();
recData.UserType=....
recData.GuestInOut=sp;
如何只是结构中有结构的话,不用intptr也可以直接赋上去传,现在就是结构中有结构数组。
麻烦楼上的看看有没有办法传struct[],谢谢啦!
c#中这样定义
struct b
{
IntPtr sp;
} 然后在
str_a ss=new str_a();
IntPtr sp = Marshal.AllocCoTaskMem(Marshal.SizeOf(ss));
Marshal.StructureToPtr(ss, sp, false);