我要实现一个远程开门的一个功能,门禁人家的接口是
6 ControlDevice 
[函数] int ControlDevice(HANDLE handle, LONG OperationID, LONG Param1, LONG Param2, LONG Param3, LONG Param4, const char *Options) 
[功能] 控制控制器动作。
 [参数说明]
 handle [in] 由 Connect()成功返回的句柄;
 OperationID [in] 操作内容:1 表示锁输出或者辅助输出,2 表示取消报警,3 重启设备,4 启用和 禁用常开(这里的禁用常开包括首开常开、连续五次卡启用的常开、远程启用的常开)。 
Param1 [in]  当 OperationID 为输出操作时,若 Param2 为门输出,此参数表示设备中门 的编号,若 Param2 为辅助输出,此参数表示设备中辅助输出口的编号,详细请参 见附表三;
当 OperationID 为取消报警时,默认值为 0;
 Param2 [in] 当OperationID为输出操作时,此参数表示设备输出点地址类型(1:锁输出, 2: 辅助输出),详细请参见附表三;当OperationID为取消报警时,默认值为0;当 OperationID 为4,即常开时,该参数表示是常开启用还是禁用常开(0:禁用;1:启用);
 Param3 [in] 当 OperationID 为输出操作时,此参数表示开门时间(0 表示关,255 表示 常开,取值范围为 1~60(秒)),默认值为 0;
 Param4 [in] 预留之用,默认为 0; Option [in] 默认为空,扩展之用; [返回值] 返回为 0 或者正数时,表示成功;返回负数时表示失败,错误代码的信息请参 见附表五。
 [示例] Python : # 开编号为 1 的门 6 秒
 operation_id = 1 door_id = 1 address_type = 2 door_action = 6 ret = self.commpro.ControlDevice(self.hcommpro, operation_id, door_id, address_type, door_action, 0, ‘’) 
c#:使编号为 2 的门常开
 int ret = 0;
 int operid = 1;
 int doorid = 2;
 int addresstype = 0; 
int dooraction = 255; 
ret = ControlDevice(h, operid, doorid, addresstype, dooraction, 0, ""); 我是C#,我调用报错,参数在调试窗口显示也都没错    求大神指导

解决方案 »

  1.   

    你导入ControlDevice出的问题
      

  2.   

    定义的方法
      /// <summary>
            /// 设置数据到设备,用于设置时间段、用户信息、假日设置、等数据,数据可以是一条记录,也可以是多条记录。
            /// </summary>
            /// <param name="Handle">[in] 由Connect()成功返回的句柄;</param>
            /// <param name="TableName">[in] 数据表名,目前可使用表请参见附表四</param>
            /// <param name="Data">[in] 数据记录表示,数据是文本格式的,多条记录之间用\r\n分隔,各个“字段=值”对之间用\t分隔;</param>
            /// <param name="Options">[in] 默认为空,扩展之用;</param>
            /// <returns>返回为0或者正数时,表示操作成功;返回负数时表示失败,错误代码的信息请参见附表五。</returns>
            [DllImport(@"plcommpro.dll", EntryPoint = "SetDeviceData", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
            public extern static int SetDeviceData(int Handle, string TableName, string Data, string Options);
        /// <returns>返回为0或者正数时,表示成功;返回负数时表示失败,错误代码的信息请参见附表五。</returns>
            public  int ControlDevice(int Handle, int OperationID, int Param1, int Param2, int Param3, int Param4, string Options)
            {
                return PullSDK.ControlDevice( Handle, OperationID,  Param1,  Param2,  Param3,  Param4,  Options);
            }
      

  3.   


    不好意思,粘错了
      /// 控制控制器动作。
            /// </summary>
            /// <param name="Handle">[in] 由Connect()成功返回的句柄;</param>
            /// <param name="OperationID">in] 操作内容,1表示输出操作,2表示取消报警,3表示重启设备;</param>
            /// <param name="Param1">[in] 当OperationID为输出操作时,此参数表示设备中门的ID号, 详细请参见附表三;
            /// 当OperationID为取消报警时,默认值为0;
            /// 当OperationID为重启设备时,默认值为0;</param>
            /// <param name="Param2">[in] 当OperationID为输出操作时,此参数表示设备输出点地址,详细请参见附表三;
            /// 当OperationID为取消报警时,默认值为0;
            /// 当OperationID为重启设备时,默认值为0;</param>
            /// <param name="Param3">[in]  当OperationID为输出操作时,此参数表示开门时间(0表示关,255表示常开,取值范围为1~60(秒)),默认值为0;
            /// 当OperationID为重启设备时,默认值为0;</param>
            /// <param name="Param4">[in] 预留之用,默认为0;</param>
            /// <param name="Options">in] 默认为空,扩展之用;</param>
            /// <returns>返回为0或者正数时,表示成功;返回负数时表示失败,错误代码的信息请参见附表五。</returns>
            [DllImport(@"plcommpro.dll", EntryPoint = "ControlDevice", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
            public extern static int ControlDevice(int Handle, long OperationID, int Param1, int Param2, int Param3, int Param4, string Options);  /// <returns>返回为0或者正数时,表示成功;返回负数时表示失败,错误代码的信息请参见附表五。</returns>
            public  int ControlDevice(int Handle, int OperationID, int Param1, int Param2, int Param3, int Param4, string Options)
            {
                return PullSDK.ControlDevice( Handle, OperationID,  Param1,  Param2,  Param3,  Param4,  Options);
            }
      

  4.   

    第一个参数换成IntPtr试试
      

  5.   


    不行,会报错,应为标注的方法的第一个参数就是int类型的,返回句柄的那个方法返回值也是int类型的
      

  6.   

    不懂这些,我搜的 Marshal.ReleaseComObject()方法好像也不能用,不知道该怎么修改