在C++中定义了两个结构,
struct a
{
    int16 tt;
}str_astruct b
{
  str_a *ss;
}问一下,我在c#里所传的对应参数的结构体该怎么写?
如果b.str_a不是一个指针的话 我传过去是对的,但是如果是指针的话,我传过去老说参数结构不对!

解决方案 »

  1.   

    api里的结构--->对应c#中的结构或类.用 StructLayout
    c++写的dll在c#里面调用的话每种类型对应参见下链接
    http://hi.baidu.com/itlike/blog/item/0feb0eed50df08d3b21cb170.html
      

  2.   

    str_a *ss; 
    用 IntPtr sp代替  str_a  ss=new str_a();
    IntPtr sp = Marshal.AllocCoTaskMem(Marshal.SizeOf(ss));
    Marshal.StructureToPtr(ss, sp, false);
      

  3.   

    c#中这样定义
    struct b
    {
      IntPtr sp;
    }然后在 
    str_a  ss=new str_a();
    IntPtr sp = Marshal.AllocCoTaskMem(Marshal.SizeOf(ss));
    Marshal.StructureToPtr(ss, sp, false);试试
      

  4.   

    我现在也能单独传,结构,结构数组,结构里带结构都可以,就是这个结构里有结构数组不行?
    上面那位说的办法,我的参数比较多,不知道怎么用?
    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,谢谢
      

  5.   

    typedef struct Str_ParkData
    {
    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类型的结构体了
      

  6.   

    1.c#读取c++的dll(详见doctortest)

    一.先将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即可
      

  7.   


    打散写就简单了,你看下API里面与c#里面的类型对应,直接调用就可以了。
      

  8.   

    按照你那样写了,现在是不报错了,但是c++里所得到的参数其他的都对,就是Str_TimePara里每个参数都不对,报的是DayData = CXX0030: Error: expression cannot be evaluated。
    感觉想值没有赋进去一样。
    有个问题,像你这样写,我什么时候给GuestInOut赋值呢?
      

  9.   


    你是要在调用之前就给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;
      

  10.   

    试过了,如果Str_TimePara 是个结构的话,他转换成intptr不会错,但是如果是Str_TimePara[]的话,就会报错,“类型“TRHParkingSystem.Win.Common.Routines.SystemStruct+Time_Str[]”不能作为非托管结构进行封送处理;无法计算有意义的大小或偏移量。”
    如何只是结构中有结构的话,不用intptr也可以直接赋上去传,现在就是结构中有结构数组。
    麻烦楼上的看看有没有办法传struct[],谢谢啦!
      

  11.   

    C++好象跟C#不一样反正
    c#中这样定义 
    struct b 

      IntPtr sp; 
    } 然后在 
    str_a  ss=new str_a(); 
    IntPtr sp = Marshal.AllocCoTaskMem(Marshal.SizeOf(ss)); 
    Marshal.StructureToPtr(ss, sp, false);