调用总是报错。快急死了啊~~~~。附件里有我写的调用程序,里面有那个DLL文件
这是那个函数的说明:
---------------------------------------------------------------------------------------------------------------------------------
long LEDAPI LED_Open(const PDeviceParam param, long Notify, long Window, long Message);
该函数打开一个指定的通讯设备
参数:
param:
   一个设备参数指针,该结构如下定义:
typedef struct DEVICEPARAM{
   long  devType;                  //device type
   long  speed;                    //speed only use for rs232
   long  locPort;                   //rs232: COM port   UDP: local port
   long  rmtPort;                   //remote port  only use for UDP
   long  reserved[8];
}TDeviceParam;
   typedef  TDeviceParam * PDeviceParam;
  
   devType:
      0:  通讯设备为RS-232
      1:   通讯设备为UDP
   Speed:
       仅对RS-232有效,一般情况下主板的速度为 SBR_57600     
   locPort:
       对RS-232设备,该参数为串口号
       对UDP设备,该参数为本地端口号,一般该值为大于1024的数字
   Remote:
       仅对UDP方式有效,主板的固定端口为: 6666
  reserved:
       系统保留Notify:
  是否产生通知消息
  1=产生通知消息
  0=不产生通知消息
window:
  接收通知消息的窗口句柄
Message:
  消息标识
------------------------------------------------------------------------------------------------------------------------------我是这样调用的
-------------------------------------------------------------------------------------------------------------------------------
       public struct LEDDevice    //数据结构
        {
            public long devType;        //设备类型:0(通讯设备为RS-232);1(通讯设备为UDP)
            public long speed;           //波特率:仅对RS-232有效,一般情况下主板的速度为 57600
            public long locPort;       //端口号:对RS-232设备,该参数为串口号;对UDP设备,该参数为本地端口号,一般该值为大于1024的数字
            public long rmtPort;        //仅对UDP方式有效,主板的固定端口为: 6666
            [MarshalAs(System.Runtime.InteropServices.UnmanagedType.ByValArray, SizeConst = 5)]
            public long[] reserved;    //系统保留
        }        /////////////////////////////函数声明
        [DllImport("LEDSender.dll", EntryPoint = "LED_Open", CharSet = CharSet.Unicode)]
        public static extern int LED_Open(LEDDevice param, long Notify, long Window, long Message);        private void Form1_Load(object sender, EventArgs e)
        {
            LEDDevice param;
            //初始化设备类型参数
            param.devType = 1;//COM方式
            param.speed = 57600;//波特率
            param.locPort = 5;//串口号
            param.rmtPort = 6666;
            param.reserved = new long[] { };            int result = LED_Open(param, 1, 1, 1);/////调用
        }
-------------------------------------------------------------------------------------------------------------------------------请问函数中的各个变量该如何来赋值呢?万分感谢啊!!!

解决方案 »

  1.   

      public static extern int LED_Open(LEDDevice param, long Notify, long Window, long Message); 第一个传结构,第二个传数字,第三个传窗口句柄即Handle,最后一个是它自定义的Message,整数,去找相应的数值,应该在预编译文件里面
      

  2.   

    dll放在system32(xp)了吗
    你报的什么错都没说
      

  3.   

    DLL需要放在SYSTEM32里面么?
    报异常:
    尝试读取或写入受保护的内存。这通常指示其他内存已损坏。
      

  4.   

    调用是没错的,输入的参数范围什么你问问给你dll的人吧,
      

  5.   


    你要用marshal,读一下相关资料参数范围,应该在头文件里面有
    比如那个message,应该在头文件中定义有:#define msg_ok 10000 + 24