有一动态库中,一函数申明如下
void* StartICDMCommand(void*,int,int, void *, int);
在C#里
 [DllImport("D:\\Edm\\dll5k.dll", CharSet = CharSet.Ansi)]
public static extern IntPtr StartICDMCommand(IntPtr device,int Address,int cmd, IntPtr Param, int size);//如果在c++里
int cmd=28;
int nRevCount=200;
StartICDMCommand(device,5,cmd,(void*)&nRevCount,sizeof(int));
这样可以成功与设备通信
我在c#里StartICDMCommand(device,5,cmd,new IntPtr(200),sizeof(int));
失败
请问要在C#里要怎样才能实现上面功能(C++)

解决方案 »

  1.   

    intptr(200) 代表什么????
    intptr 只是相当于指针,
    你需要
    marshal.AllocTaskMem(200)
      

  2.   

    public IntPtr(
    int value
    )参数value
        类型:System.Int32
        32 位有符号的整数中包含的指针或句柄。 上面我的回复,有些错Marshal.AllocHGlobal
      

  3.   

    我亮了,
    int pm=200;
    StartICDMCommand(device,5,cmd,new (IntPtr)pm,sizeof(int));
      

  4.   

    (intptr)200 这样不行的.程序崩溃(尝试读取写入保护的内存)//Marshal.AllocHGlobal虽然不报错,可是得不到数据.卡在那里
    其实那是考勤的动态库,向考勤机发送读取命令,每次读取200行.
    在C++里完全可以实现.C#老是报错...
      

  5.   

    连接设备肯定是正常的,
    在C#发送广播校时
    StartICDMCommand(device,0,1,IntPtr.Zero,0);
    都OK
      

  6.   

    StartICDMCommand(device,5,cmd, ref pm,sizeof(int));
    声明的时候,在加个ref试试
      

  7.   

    这是个输出参数,用out int试试
      

  8.   

    或者
    int a = 200;
    Intptr ptr;
    Marshal.StructureToPtr (a,ptr,true);
      

  9.   

    不能那样写的.
    void* Param
    不一定是int类型的,当命令字不同,参数传递,有的是整数,有的是结构体等
      

  10.   

    那你就写object param,
    装箱,拆箱
      

  11.   

    那就用9楼的方法
    Marshal.structuretoptr
      

  12.   

    给你搞个通用的:Type paraType=形参变量.GetType();Int32 size = Marshal.SizeOf(paraType);
    IntPtr buffer = Marshal.AllocHGlobal(size);Marshal.StructureToPtr (形参变量,buffer ,true);。。
      

  13.   

    定义个int,然后ref即可。[DllImport("D:\\Edm\\dll5k.dll", CharSet = CharSet.Ansi)]
    public static extern IntPtr StartICDMCommand(IntPtr device,int Address,int cmd, ref int Param, int size);