C++程序进程通信共享内存设计架构与实现细节

1.主程序(C#.exe程序)

window_loaded()

主程序启动时win_loaded()函数调用

DataDll.ImportDll

ImportDll主要干两件事:加载动态库和获取函数指针

1.加载动态库

 private IntPtr hLib;
 hLib = Win32Native.LoadLibrary(DLLPath);

2.获取函数指针

获取函数指针1:.声明动态库导出函数

 public delegate Boolean fn_InitMappingEx(int oct_max_buf,
                              int max_video_count, int video_width, int video_height, Byte video_bitcount,
                              int eye_ground_10x10_width, int eye_ground_10x10_height, Byte eye_ground_10x10_bitcount,
                              int eye_ground_6x6_width, int eye_ground_6x6_height, Byte eye_ground_6x6_bitcount);

获取函数指针:2:获取函数指针

 public static fn_InitMappingEx pfnInitMappingEx;
 pfnInitMappingEx = (fn_InitMappingEx)_dataDll.Invoke("InitMappingEx", typeof(fn_InitMappingEx));
  //将要执行的函数转换为委托        
        public Delegate Invoke(String APIName, Type t)
        {
            IntPtr api = Win32Native.GetProcAddress(hLib, APIName);
            if (api == IntPtr.Zero)
            {
                int iErrCode = Win32Native.GetLastError();
                MessageBox.Show("dll-invoke error.\n\nGetProcAddress: " + APIName + " Error. \nCode: " + iErrCode.ToString(),
                    "ERROR", MessageBoxButton.OK, MessageBoxImage.Error);
            }

            return (Delegate)Marshal.GetDelegateForFunctionPointer(api, t);
        }

 DataDll.pfnInitMappingEx

仅开机初始化一次即可,一般由主界面调用

设置采集程序句柄

            int pattern = -1;
            int data_id = -1;
            int maxcount = DataDll.pfnGetPatternMemIdMappingMaxCount(); //获取ID列表总长度
            for (int i = 0; i < maxcount; i++) // 遍历ID列表以获取有效的data_id
            {
                if (DataDll.pfnLockPatternMemIdMapping(i)) // 先锁定以防止多进程或多线程冲突
                {
                    if (DataDll.pfnGetPatternMemIdMapping(ref pattern, ref data_id, i)) // pattern != 0表示对应的data_id有效
                    {
                        // 设置当前共享内存ID为data_id
                        DataDll.pfnSetCurrentDataId(data_id);
                        LogLog.Log("data_id = " + data_id + " SetMainWindow handle");
                        DataDll.pfnInitMapping();
                        DataDll.pfnSetMainWindow(handle);
                        DataDll.pfnExitMapping();
                    }
                    else
                    {
                        //获取失败或者对应的data_id无效
                    }

                    DataDll.pfnUnLockPatternMemIdMapping(i); //释放锁定
                }


            }

window_closing

  private void UnInitMem()
        {
            int pattern = -1;
            int data_id = -1;
            int maxcount = DataDll.pfnGetPatternMemIdMappingMaxCount(); //获取ID列表总长度
            for (int i = 0; i < maxcount; i++) // 遍历ID列表以获取有效的data_id
            {
                if (DataDll.pfnLockPatternMemIdMapping(i)) // 先锁定以防止多进程或多线程冲突
                {
                    if (DataDll.pfnGetPatternMemIdMapping(ref pattern, ref data_id, i)) // pattern != 0表示对应的data_id有效
                    {
                        DataDll.pfnSetCurrentDataId(i);
                        DataDll.pfnExitMapping();
                    }
                    DataDll.pfnUnLockPatternMemIdMapping(i);

                }
            }
        }
 DataDll.pfnUnInitMappingEx();

  释放所有共享内存,由主界面关闭时调用

2.采集程序

 

3.分析程序

启动

InitEnvironment

         if (DataDll.ImportDll(dll_path))
                {
                    DataDll.pfnSetCurrentDataId(AnalyserCommonParameter.CurrentDataid);
                    //true表示可以修改
                    if (!DataDll.pfnInitMapping() || !DataDll.pfnInitDBLib(true))
                    {
                        LogLog.Log("DataDll.ImportDll(dll_path) = " + DataDll.ImportDll(dll_path).ToString());
                        LogLog.Log("DataDll.pfnInitMapping() = " + DataDll.pfnInitMapping().ToString());
                        LogLog.Log("DataDll.pfnInitDBLib(true) = " + DataDll.pfnInitDBLib(true).ToString());
                        MessageBox.Show("Loading OSEDATA.DLL failed.");
                        LogLog.Log("Loading OSEDATA.DLL failed.");
                        return false;
                    }
                    LogLog.Log("Loading OSEDATA.DLL succ");
                }

猜你喜欢

转载自blog.csdn.net/haimianjie2012/article/details/109075147