我写了一个activex,调用方法可以,但是事件在一台机器上用vb可以有返回,另外一个机器上没有,没有返回的那个机器在tstcon32中有返回,请问谁碰到过这种问题,折磨我1周了。activex用c#写的,另外一个开发人员用vb6调用。

解决方案 »

  1.   

    要看问题出在哪?是C#还是VB?我只能估计是C#的代码问题,也不能具体回答你什么。
    这样要人帮你瞎猜很难猜的,你应该整理好要问的东西好好问。
    反正我从你题目所能了解到的就是“你有一个C#开发的组件,然后VB调用,最后是有问题了,然后叫别人猜你的问题在哪”。
    你的控件主要要实现什么功能?什么时候哪里出现了问题?你的环境因素是怎样?你可以肯定哪里没问题?你估计哪里有问题?
    你估计出问题的地方具体情况是怎样?......
    呵呵,好像是我在问你问题。
      

  2.   

    如果方便的话,请把那个activex放在网上,让大家都来测试一下,也许能发现问题,瞎猜咋行?
      

  3.   

    SupermanKing 程序是参照红马那个程序写的,只是多加了些事件响应,全部代码挺多的贴一部分吧
    下面的代码是activex的声明中的一部分
        [ComVisible(false)]
        public delegate void DeviceError(string 设备名称);
        [ComVisible(false)]
        public delegate void DeviceRunning(string 设备名称);    #region 主体类接口
        [Guid("FF1359CB-A77A-4aeb-9840-1FF989CF02CF"), InterfaceType(ComInterfaceType.InterfaceIsDual)]
        public interface Ir_Interface
        {
            void FireDevComUsed(string param);       //4.3   设备串口被占用
            void FireDeviceRuned(string param);      //4.6   设备已运行
       }
        #endregion    #region 这里添加事件
        [Guid("A67FF4CD-44A0-404f-9FFA-319E88958602"), InterfaceType(ComInterfaceType.InterfaceIsDual)]
        public interface IDeviceRunEvents
        {
            [DispIdAttribute(4)]
            void DevComUsed(string DeviceName);
            [DispIdAttribute(6)]
            void IdentifyDevUsed(string DeviceName);
        }
        #endregion    #region 主体类
        [Guid("2AD88D09-C8FA-4e63-9040-A300226DB381")]  //guid.
        [ClassInterface(ClassInterfaceType.AutoDispatch)]  //必须的,否则无法调用 
        [ComSourceInterfaces(typeof(IDeviceRunEvents))]
        [ProgId("Machine.DeviceRun")]   //控件名    public class EventObj :Ir_Interface
        {
            #region  事件定义        #region 设备状态事件
            /// <summary> 4.3   设备串口被占用
            /// 传动串口被占用
            /// </summary>
            public event DeviceError DevComUsed;
            /// <summary> 4.6   设备已运行
            /// 发卡设备已运行
            /// </summary>
            #endregion
            #endregion        #region 事件体,执行com事件
             public void FireDevComUsed(string param)
            {
                if (DevComUsed != null)
                    DevComUsed(param);
            }
            public void FireDeviceRuned(string DeviceName)
            {
                if (DeviceRuned != null)
                    DeviceRuned(DeviceName);
            }
              #endregion
        }
        #endregion    #endregion
      
          [GuidAttribute("F321BAC9-5019-4c6f-BADF-8D104A499870")]
        [InterfaceTypeAttribute(ComInterfaceType.InterfaceIsDual)]
        public interface ISharpCOMInterface
        {
               EventObj ObjDevComUsed
            {
                get;
                set;
            }
              EventObj ObjDeviceRuned
            {
                get;
                set;
            }
             void SetConfig();
            void SetConfig(string File);
            void Init();
            void next()
          }    [GuidAttribute("03018F99-263B-417e-94F3-F367471F6679"),
        InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIDispatch)]
        public interface ICSharpCOMEvents
        {
              [DispIdAttribute(3)]
            void DevComUsed(string DeviceName);
             [DispIdAttribute(6)]
            void DeviceRuned(string DeviceName);    }    [Guid("7F8DF713-8277-478c-8288-12E96DFEBC69")] 
        [ClassInterface(ClassInterfaceType.None )]
        [ComSourceInterfacesAttribute(typeof(Machine.ICSharpCOMEvents))]
        [ProgIdAttribute("Machine.DeviceRun_2")]  //控件名
        public partial class DeviceRun_2 : UserControl, ISharpCOMInterface
        {        #region  .net事件定义
               #region 设备状态事件
            [Category("Action")]
            /// <summary> 4.3   设备串口被占用
            /// 传动串口被占用
            /// </summary>
            public event DeviceError DevComUsed;
            [Category("Action")]
            /// <summary> 4.6   设备已运行
            /// 发卡设备已运行
            /// </summary>
            public event DeviceRunning DeviceRuned;        #endregion
            #endregion
        }
    }//下面的代码是执行过程中的一部分,也就是当执行到这里时调用上层程序中的事件函数(见下面vb代码)                if(DeviceRuned !=null )
                        DeviceRuned(DeviceName);            //通知设备开始运行//这里是vb代码
    Private Sub DeviceRun_21_DeviceRuned(ByVal DeviceName As String)
        '已经开始发行流程事件通知,
        msgbox "运行了"
    End Sub
      

  4.   

    很可能是那台机器上没有framework.这个东西我做过,不过做ActiveX还是不要用C#。