我在调用C++的DLL,要设置一个回掉函数;我使用的时候,单独窗体的时候没问题;但当我打开两个以上窗体时,发现回掉通知窗体消息时,有些混乱;谁知道问题在那的?

解决方案 »

  1.   

    您需要注意几点
    1。回掉的窗体句柄handle
    2.消息的类型
    3.参数您说的问题应该是第一种
      

  2.   


    回掉函数没有需要句柄handle,C++的DLL中有个void*类型的参数,对应到C#这边传递个委托过去,这个时候及没得句炳、消息类型和参数设置这么说是DLL有问题了?
      

  3.   

        public class Channel
        {
            public UInt32 Handler;         //设置回调函数   
            private EsrFunc esr;        public Channel()
            { 
                this.esr = new EsrFunc(ESR);
            }        /// <summary>
            /// 消息接受函数
            /// </summary> 
            public static void ESR(uint esrParam)
            {
                TBarMessage.LogAdd("收到事件" + System.DateTime.Now.ToString("yyyyMMdd mm:hh:ss") + "--" + esrParam.ToString());
            }
            /// <summary>
            /// 建立连接
            /// </summary> 
            public int OpenStream()
            {
                int iState;            iState = CommLib.OpenStream(ref Handler);            if (iState == 0)
                {
                    this.SetESR(Handler);
                }
                return iState;
            }        /// <summary>
            /// 设置回调
            /// </summary> 
            public void SetESR(uint esrParam)
            {
                if (this.esr != null)
                {
                    int iState = CommLib.SetESR(Handler, this.esr, esrParam);
                    return iState;
                }
            }
        }    //自定义委托
        [UnmanagedFunctionPointer(CallingConvention.Winapi)]
        public delegate void EsrFunc(uint esrParam);    public static class CommLib
        {
            [DllImport("ApiSelf.dll", CharSet = CharSet.Ansi, EntryPoint = "OpenStream")]
            public static extern int OpenStream(ref uint Handle);
            [DllImport("ApiSelf.dll", CharSet = CharSet.Ansi, EntryPoint = "SetESR")]
            public static extern int SetESR(uint acsHandle, EsrFunc esr, uint esrParam);
        }这是一部分代码
    C++typedef void (*EsrFunc) (unsigned long esrParam);typedef unsigned long  Handle_t;
    RetCode_t __stdcall OpenStream (Handle_t     *acsHandle);
    RetCode_t __stdcall acsSetESR (
        Handle_t     acsHandle,
        EsrFunc         esr,
        unsigned long   esrParam);