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");
}