소스 검색

基本完红老鼠dll对接工作;

Jeff 5 년 전
부모
커밋
aa16812382

+ 132 - 7
VideoCapture/VideoCapture/Global.cpp

@@ -7,6 +7,135 @@
 #include <WinIoCtl.h>
 #pragma comment(lib, "SetupAPI.lib")
 
+
+//////////////////////////////////////////////////////////////////////////
+// dll相关;
+HMODULE g_hdll = NULL;
+irc_IsAppRunning g_IsAppRunning = NULL;
+irc_StartIRApp g_StartIRApp = NULL;
+irc_CloseApp g_CloseApp = NULL;
+irc_Connect g_Connect = NULL;
+irc_loadSignalDataSet g_loadSignalDataSet = NULL;
+irc_getDeviceNames g_getDeviceNames = NULL;
+irc_getSignalsName g_getSignalsName = NULL;
+irc_sendSignal g_sendSignal = NULL;
+irc_sendSignals g_sendSignals = NULL;
+irc_sendRepeatsSignal g_sendRepeatsSignal = NULL;
+int g_nIRControl = 0;
+
+BOOL LoadLogLibarary()
+{
+	if (g_hdll == NULL)
+	{
+		g_hdll = (HMODULE)LoadLibrary(_T("IRControl.dll"));
+		if (!g_hdll)
+			return FALSE;
+	}
+
+	g_sendRepeatsSignal = (irc_sendRepeatsSignal)GetProcAddress(g_hdll, "sendRepeatsSignal");
+	if (!g_sendRepeatsSignal)
+	{
+		FreeLogLibarary();
+		return FALSE;
+	}
+
+	g_sendSignals = (irc_sendSignals)GetProcAddress(g_hdll, "sendSignals");
+	if (!g_sendSignals)
+	{
+		FreeLogLibarary();
+		return FALSE;
+	}
+
+	g_sendSignal = (irc_sendSignal)GetProcAddress(g_hdll, "sendSignal");
+	if (!g_sendSignal)
+	{
+		FreeLogLibarary();
+		return FALSE;
+	}
+
+	g_loadSignalDataSet = (irc_loadSignalDataSet)GetProcAddress(g_hdll, "loadSignalDataSet");
+	if (!g_loadSignalDataSet)
+	{
+		FreeLogLibarary();
+		return FALSE;
+	}
+
+	g_IsAppRunning = (irc_IsAppRunning)GetProcAddress(g_hdll, "IsAppRunning");
+	if (!g_IsAppRunning)
+	{
+		FreeLogLibarary();
+		return FALSE;
+	}
+
+	g_StartIRApp = (irc_StartIRApp)GetProcAddress(g_hdll, "StartIRApp");
+	if (!g_StartIRApp)
+	{
+		FreeLogLibarary();
+		return FALSE;
+	}
+
+	g_CloseApp = (irc_CloseApp)GetProcAddress(g_hdll, "CloseApp");
+	if (!g_CloseApp)
+	{
+		FreeLogLibarary();
+		return FALSE;
+	}
+
+	g_getDeviceNames = (irc_getDeviceNames)GetProcAddress(g_hdll, "getDeviceNames");
+	if (!g_getDeviceNames)
+	{
+		FreeLogLibarary();
+		return FALSE;
+	}
+
+	g_Connect = (irc_Connect)GetProcAddress(g_hdll, "Connect");
+	if (!g_Connect)
+	{
+		FreeLogLibarary();
+		return FALSE;
+	}
+
+	g_getSignalsName = (irc_getSignalsName)GetProcAddress(g_hdll, "getSignalsName");
+	if (!g_getSignalsName)
+	{
+		FreeLogLibarary();
+		return FALSE;
+	}
+
+	// 导出全局变量;
+	g_nIRControl = *(int*)GetProcAddress(g_hdll, "nIRControl");
+	if (!g_CloseApp)
+	{
+		FreeLogLibarary();
+		return FALSE;
+	}
+
+
+	return TRUE;
+}
+
+void FreeLogLibarary()
+{
+	if (g_hdll)
+	{
+		if (FreeLibrary(g_hdll))
+		{
+			g_hdll = NULL;
+			g_IsAppRunning = NULL;
+			g_StartIRApp = NULL;
+			g_CloseApp = NULL;
+			g_Connect = NULL;
+			g_getDeviceNames = NULL;
+			g_getSignalsName = NULL;
+			g_loadSignalDataSet = NULL;
+			g_sendSignal = NULL;
+			g_sendSignals = NULL;
+			g_sendRepeatsSignal = NULL;
+		}
+	}
+}
+//////////////////////////////////////////////////////////////////////////
+
 namespace Global
 {
 	//////////////////////////////////////////////////////////////////////////
@@ -90,18 +219,14 @@ namespace Global
 	{
 		TCHAR szConfigpath[MAX_PATH] = { 0 };
 		_stprintf_s(szConfigpath, _T("%sConfig.ini"), Global::g_szCurModuleDir);
+		_tcscpy_s(g_szConfig, szConfigpath);
 
 		TCHAR szValue[MAX_PATH] = { 0 };
 		// 读取配置内容;
-		g_Config.usetype = GetPrivateProfileInt(_T("ir-device"), _T("use-rat"), 0, szConfigpath);
 		g_Config.bGenerics = GetPrivateProfileInt(_T("ir-device"), _T("generics"), 0, szConfigpath);
 
-		GetPrivateProfileString(_T("ir-device"), _T("redrat3"), NULL, szValue, MAX_PATH, szConfigpath);
-		g_Config.redrat3path = szValue;
-		memset(szValue, 0, MAX_PATH);
-
-		GetPrivateProfileString(_T("ir-device"), _T("redrat4"), NULL, szValue, MAX_PATH, szConfigpath);
-		g_Config.redrat4path = szValue;
+		GetPrivateProfileString(_T("ir-device"), _T("redratpath"), NULL, szValue, MAX_PATH, szConfigpath);
+		g_Config.redratpath = szValue;
 		memset(szValue, 0, MAX_PATH);
 
 		GetPrivateProfileString(_T("ir-device"), _T("signal"), NULL, szValue, MAX_PATH, szConfigpath);

+ 31 - 3
VideoCapture/VideoCapture/Global.h

@@ -21,13 +21,41 @@ typedef string TString;
 typedef wstring TString;
 #endif
 
+//////////////////////////////////////////////////////////////////////////
+// dllÏà¹Ø;
+extern HMODULE g_hdll;
+extern BOOL LoadLogLibarary();
+extern void FreeLogLibarary();
+
+typedef DWORD(*irc_IsAppRunning)(LPCTSTR lpszAppDir);
+typedef bool (*irc_StartIRApp)(LPCTSTR lpszAppDir, LPCTSTR lpSignalXml, DWORD dwPort);
+typedef bool (*irc_CloseApp)();
+typedef bool (*irc_Connect)(LPCTSTR lpServer, int port);
+typedef bool (*irc_loadSignalDataSet)(LPCTSTR lpDatasetXml);
+typedef LPCTSTR(*irc_getDeviceNames)();
+typedef LPCTSTR(*irc_getSignalsName)();
+typedef bool (*irc_sendSignal)(LPCTSTR lpSignal, int send_times, int sleep_time);
+typedef bool (*irc_sendSignals)(LPCTSTR lpSignals, int sleep_time);
+typedef bool (*irc_sendRepeatsSignal)(LPCTSTR lpSignal, int repeat_time);
+
+extern int g_nIRControl;
+extern irc_IsAppRunning g_IsAppRunning;
+extern irc_StartIRApp g_StartIRApp;
+extern irc_CloseApp g_CloseApp;
+extern irc_Connect g_Connect;
+extern irc_getDeviceNames g_getDeviceNames;
+extern irc_getSignalsName g_getSignalsName;
+extern irc_loadSignalDataSet g_loadSignalDataSet;
+extern irc_sendSignal g_sendSignal;
+extern irc_sendSignals g_sendSignals;
+extern irc_sendRepeatsSignal g_sendRepeatsSignal;
+//////////////////////////////////////////////////////////////////////////
+
 namespace Global
 {
 	typedef struct __ST_CONFIG__
 	{
-		int usetype;
-		std::string redrat3path;
-		std::string redrat4path;
+		std::string redratpath;
 		bool bGenerics;
 		std::string signaldir;
 		std::string use_signal;

+ 173 - 181
VideoCapture/VideoCapture/IRControlWnd.cpp

@@ -16,6 +16,7 @@
 #include "Resource.h"
 #include "MainFrm.h"
 #include "VideoCapture.h"
+#include <filehelper.h>
 
 #ifdef _DEBUG
 #undef THIS_FILE
@@ -23,133 +24,6 @@ static char THIS_FILE[] = __FILE__;
 #define new DEBUG_NEW
 #endif
 
-//////////////////////////////////////////////////////////////////////////
-// dll相关;
-HMODULE g_hdll = NULL;
-irc_IsAppRunning g_IsAppRunning = NULL;
-irc_StartIRApp g_StartIRApp = NULL;
-irc_CloseApp g_CloseApp = NULL;
-irc_Connect g_Connect = NULL;
-irc_loadSignalDataSet g_loadSignalDataSet = NULL;
-irc_getDeviceNames g_getDeviceNames = NULL;
-irc_getSignalsName g_getSignalsName = NULL;
-irc_sendSignal g_sendSignal = NULL;
-irc_sendSignals g_sendSignals = NULL;
-irc_sendRepeatsSignal g_sendRepeatsSignal = NULL;
-int g_nIRControl = 0;
-
-BOOL LoadLogLibarary()
-{
-	if (g_hdll == NULL)
-	{
-		g_hdll = (HMODULE)LoadLibrary(_T("IRControl.dll"));
-		if (!g_hdll)
-			return FALSE;
-	}
-
-	g_sendRepeatsSignal = (irc_sendRepeatsSignal)GetProcAddress(g_hdll, "sendRepeatsSignal");
-	if (!g_sendRepeatsSignal)
-	{
-		FreeLogLibarary();
-		return FALSE;
-	}
-
-	g_sendSignals = (irc_sendSignals)GetProcAddress(g_hdll, "sendSignals");
-	if (!g_sendSignals)
-	{
-		FreeLogLibarary();
-		return FALSE;
-	}
-
-	g_sendSignal = (irc_sendSignal)GetProcAddress(g_hdll, "sendSignal");
-	if (!g_sendSignal)
-	{
-		FreeLogLibarary();
-		return FALSE;
-	}
-
-	g_loadSignalDataSet = (irc_loadSignalDataSet)GetProcAddress(g_hdll, "loadSignalDataSet");
-	if (!g_loadSignalDataSet)
-	{
-		FreeLogLibarary();
-		return FALSE;
-	}
-
-	g_IsAppRunning = (irc_IsAppRunning)GetProcAddress(g_hdll, "IsAppRunning");
-	if (!g_IsAppRunning)
-	{
-		FreeLogLibarary();
-		return FALSE;
-	}
-
-	g_StartIRApp = (irc_StartIRApp)GetProcAddress(g_hdll, "StartIRApp");
-	if (!g_StartIRApp)
-	{
-		FreeLogLibarary();
-		return FALSE;
-	}
-
-	g_CloseApp = (irc_CloseApp)GetProcAddress(g_hdll, "CloseApp");
-	if (!g_CloseApp)
-	{
-		FreeLogLibarary();
-		return FALSE;
-	}
-
-	g_getDeviceNames = (irc_getDeviceNames)GetProcAddress(g_hdll, "getDeviceNames");
-	if (!g_getDeviceNames)
-	{
-		FreeLogLibarary();
-		return FALSE;
-	}
-
-	g_Connect = (irc_Connect)GetProcAddress(g_hdll, "Connect");
-	if (!g_Connect)
-	{
-		FreeLogLibarary();
-		return FALSE;
-	}
-
-	g_getSignalsName = (irc_getSignalsName)GetProcAddress(g_hdll, "getSignalsName");
-	if (!g_getSignalsName)
-	{
-		FreeLogLibarary();
-		return FALSE;
-	}
-
-	// 导出全局变量;
-	g_nIRControl = *(int*)GetProcAddress(g_hdll, "nIRControl");
-	if (!g_CloseApp)
-	{
-		FreeLogLibarary();
-		return FALSE;
-	}
-
-
-	return TRUE;
-}
-
-void FreeLogLibarary()
-{
-	if (g_hdll)
-	{
-		if (FreeLibrary(g_hdll))
-		{
-			g_hdll = NULL;
-			g_IsAppRunning = NULL;
-			g_StartIRApp = NULL;
-			g_CloseApp = NULL;
-			g_Connect = NULL;
-			g_getDeviceNames = NULL;
-			g_getSignalsName = NULL;
-			g_loadSignalDataSet = NULL;
-			g_sendSignal = NULL;
-			g_sendSignals = NULL;
-			g_sendRepeatsSignal = NULL;
-		}
-	}
-}
-//////////////////////////////////////////////////////////////////////////
 
 /////////////////////////////////////////////////////////////////////////////
 // CResourceViewBar
@@ -200,8 +74,8 @@ CIRControlWnd::~CIRControlWnd()
 	m_vtBtnInfo.clear();
 }
 
-// 下拉框控件id;
-#define ID_COMBOBOX_DEVICE_TYPE 1
+// 重启进程按钮id;
+#define ID_BUTTON_RESTART_PROC 1
 // 复制框控件id;
 #define ID_CHECKBOX_SIGNAL_TYPE 2
 // 下拉框控件id;
@@ -221,10 +95,16 @@ BEGIN_MESSAGE_MAP(CIRControlWnd, CDockablePane)
 	ON_WM_SETFOCUS()
 	ON_WM_SETTINGCHANGE()
 	ON_WM_PAINT()
-	ON_COMMAND_RANGE(BTNID, BTNID + 100, OnBtnClick)
-	ON_UPDATE_COMMAND_UI_RANGE(BTNID, BTNID + 100, OnBtnUpdate)
+	// 信号按钮;
+	ON_COMMAND_RANGE(BTNID, BTNID + 100, OnSignalBtnClick)
+	ON_UPDATE_COMMAND_UI_RANGE(BTNID, BTNID + 100, OnUpdateSignalBtn)
+	// checkbox
 	ON_UPDATE_COMMAND_UI(ID_CHECKBOX_SIGNAL_TYPE, OnUpdateCheckBox)
-	ON_CBN_SELCHANGE(ID_COMBOBOX_DEVICE_TYPE, &CIRControlWnd::OnCbnSelchangeDeivceType)
+	ON_COMMAND(ID_CHECKBOX_SIGNAL_TYPE, OnCheckBoxClicked)
+	//
+	ON_CBN_SELCHANGE(ID_COMBOBOX_SIGNAL_FILE, &CIRControlWnd::OnCbnSelchangeSignal)
+	ON_UPDATE_COMMAND_UI(ID_BUTTON_RESTART_PROC, OnUpdateBtnRestartProc)
+	ON_COMMAND(ID_BUTTON_RESTART_PROC, OnBtnRestartProcClicked)
 END_MESSAGE_MAP()
 
 /////////////////////////////////////////////////////////////////////////////
@@ -240,9 +120,10 @@ void CIRControlWnd::AdjustLayout()
 	CRect rectClient;
 	GetClientRect(rectClient);
 
-	m_wndObjectCombo.SetWindowPos(nullptr, rectClient.left, rectClient.top + 5, 120, m_nComboHeight + 210, SWP_NOACTIVATE | SWP_NOZORDER);
-	m_wndSignalCheck.SetWindowPos(nullptr, rectClient.left + 125, rectClient.top + 5, 150, m_nComboHeight, SWP_NOACTIVATE | SWP_NOZORDER);
-	m_wndSignalCombo.SetWindowPos(nullptr, rectClient.left, rectClient.top + m_nComboHeight + 10, rectClient.Width(), m_nComboHeight + 210, SWP_NOACTIVATE | SWP_NOZORDER);
+	m_btnRestart.SetWindowPos(nullptr, rectClient.left + 5, rectClient.top + 5, 180, m_nComboHeight, SWP_NOACTIVATE | SWP_NOZORDER);
+	m_wndSignalCheck.SetWindowPos(nullptr, rectClient.left + 190, rectClient.top + 5, 150, m_nComboHeight, SWP_NOACTIVATE | SWP_NOZORDER);
+
+	m_wndSignalCombo.SetWindowPos(nullptr, rectClient.left + 5, rectClient.top + m_nComboHeight + 10, rectClient.Width() - 10, m_nComboHeight + 210, SWP_NOACTIVATE | SWP_NOZORDER);
 #if __PANE_DLG__
 	m_dlgIRControl.SetWindowPos(nullptr, rectClient.left, rectClient.top + m_nComboHeight, rectClient.Width(), rectClient.Height(), SWP_NOACTIVATE | SWP_NOZORDER);
 #endif
@@ -259,7 +140,7 @@ int CIRControlWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)
 	// 创建组合: 
 	const DWORD dwViewStyle = WS_CHILD | WS_VISIBLE | CBS_DROPDOWNLIST | WS_BORDER | CBS_SORT | WS_CLIPSIBLINGS | WS_CLIPCHILDREN;
 
-	if (!m_wndObjectCombo.Create(dwViewStyle, rectDummy, this, ID_COMBOBOX_DEVICE_TYPE))
+	if (!m_btnRestart.Create(_T("重启遥控器服务端进程"), WS_CHILD | WS_VISIBLE, rectDummy, this, ID_BUTTON_RESTART_PROC))
 	{
 		TRACE0("未能创建遥控器组合 \n");
 		return -1;      // 未能创建
@@ -280,18 +161,15 @@ int CIRControlWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)
 	m_wndSignalCheck.m_nFlatStyle = CMFCButton::BUTTONSTYLE_FLAT;
 	m_wndSignalCheck.SizeToContent();
 
-	if (!m_wndSignalCombo.Create(dwViewStyle, rectDummy, this, ID_COMBOBOX_SIGNAL_FILE))
+	if (!m_wndSignalCombo.Create(dwViewStyle| WS_VSCROLL, rectDummy, this, ID_COMBOBOX_SIGNAL_FILE))
 	{
 		TRACE0("未能创建信号集下拉框 \n");
 		return -1;      // 未能创建
 	}
-
-	m_wndObjectCombo.AddString(_T("红老鼠 3.0"));
-	m_wndObjectCombo.AddString(_T("红老鼠 4.0"));
-	m_wndObjectCombo.SetCurSel(Global::g_Config.usetype);
+	LoadSignals();
 
 	CRect rectCombo;
-	m_wndObjectCombo.GetClientRect(&rectCombo);
+	m_wndSignalCombo.GetClientRect(&rectCombo);
 
 	m_nComboHeight = rectCombo.Height();
 #if __PANE_DLG__
@@ -318,14 +196,14 @@ int CIRControlWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)
 	}
 
 	// 启动服务;
-	if (g_IsAppRunning(Global::g_Config.usetype ? Global::g_Config.redrat4path.c_str() : Global::g_Config.redrat3path.c_str()))
+	if (g_IsAppRunning(Global::g_Config.redratpath.c_str()))
 	{
 		TRACE("启动红老鼠进程已运行\r");
 	}
 	else
 	{
 		TRACE("启动红老鼠进程未运行\r");
-		if (g_StartIRApp(Global::g_Config.usetype ? Global::g_Config.redrat4path.c_str() : Global::g_Config.redrat3path.c_str(), (Global::g_Config.signaldir + "\\defualt.xml").c_str(), 40000))
+		if (g_StartIRApp(Global::g_Config.redratpath.c_str(), (Global::g_Config.signaldir + "\\defualt.xml").c_str(), 40000))
 		{
 			TRACE("启动红老鼠进程启动成功\r");
 		}
@@ -336,7 +214,7 @@ int CIRControlWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)
 		}
 	}
 
-	Sleep(1500); // 等待进程启动完全;
+	Sleep(3500); // 等待进程启动完全;
 	// 连接服务器;
 	if (!g_Connect(_T("127.0.0.1"), 40000))
 		AfxMessageBox("连接红老鼠服务端失败,请重启设备!");
@@ -349,7 +227,7 @@ int CIRControlWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)
 	}
 
 	std::string signale = Global::g_Config.bGenerics ? Global::g_Config.signaldir + "\\general\\" : Global::g_Config.signaldir + "\\product\\";
-	signale.append(Global::g_Config.use_signal);
+	signale.append(Global::g_Config.use_signal + ".xml");
 	// 加载指定目录的xml信号集文件;
 	if (!g_loadSignalDataSet(signale.c_str()))
 	{
@@ -423,54 +301,40 @@ void CIRControlWnd::OnSettingChange(UINT uFlags, LPCTSTR lpszSection)
 	//SetPropListFont();
 }
 
-void CIRControlWnd::OnCbnSelchangeDeivceType()
+void CIRControlWnd::OnCbnSelchangeSignal()
 {
-	int nCurSel = m_wndObjectCombo.GetCurSel();
-	if (nCurSel != Global::g_Config.usetype)
+	CString strSignal;
+	int nCurSel = m_wndSignalCombo.GetCurSel();
+	if ( nCurSel != CB_ERR )
 	{
-		Global::g_Config.usetype = nCurSel;
-		// 关闭旧类型进程;
-		if (g_CloseApp)
-			g_CloseApp();
-
-		// 新启动类型进程;
-		if (g_StartIRApp)
+		std::string signalpath;
+		m_wndSignalCombo.GetLBText(nCurSel, strSignal);
+		if ( Global::g_Config.bGenerics )
 		{
-			if (g_StartIRApp(Global::g_Config.usetype ? Global::g_Config.redrat4path.c_str() : Global::g_Config.redrat3path.c_str(), (Global::g_Config.signaldir + "\\defualt.xml").c_str(), 40000))
-			{
-				TRACE("启动红老鼠进程启动成功\r");
-			}
-			else
-			{
-				TRACE("启动红老鼠进程启动失败\r");
-				AfxMessageBox("启动红老鼠进程启动失败!");
-			}
+			signalpath = Global::g_Config.signaldir + "\\general\\";
 		}
-
-		Sleep(1500); // 等待进程启动完全;
-		// 连接服务器;
-		if (!g_Connect(_T("127.0.0.1"), 40000))
-			AfxMessageBox("连接红老鼠服务端失败,请重启设备!");
-
-		// 获取设备列表,以逗号分隔;
-		std::string devices = g_getDeviceNames();
-		if (devices.size() == 0)
+		else
 		{
-			AfxMessageBox("当前无红老鼠设备连接!");
+			signalpath = Global::g_Config.signaldir + "\\product\\";
 		}
 
-		std::string signale = Global::g_Config.bGenerics ? Global::g_Config.signaldir.append("\\general\\") : Global::g_Config.signaldir.append("\\product\\");
-		signale.append(Global::g_Config.use_signal);
+		signalpath.append(strSignal.GetString());
+		signalpath.append(".xml");
+
+		// 切换信号集文件;
 		// 加载指定目录的xml信号集文件;
-		if (!g_loadSignalDataSet(signale.c_str()))
+		if (!g_loadSignalDataSet(signalpath.c_str()))
 		{
 			TRACE("加载信号集文件失败\r");
-			AfxMessageBox("加载信号集文件失败!");
 		}
 		else
 		{
 			TRACE("加载信号集文件成功\r");
 		}
+
+		// 保存到配置文件中;
+		WritePrivateProfileString("ir-device", "use-signal", strSignal.GetString(), Global::g_szConfig);
+
 	}
 }
 
@@ -495,6 +359,45 @@ void CIRControlWnd::SetPropListFont()
 	//m_wndObjectCombo.SetFont(&m_fntPropList);
 }
 
+void CIRControlWnd::LoadSignals()
+{
+	filehelper fh;
+	fh.getfolderfiles((Global::g_Config.signaldir + "\\general\\").c_str(), NULL, &m_vtsignal_gen);
+	fh.getfolderfiles((Global::g_Config.signaldir + "\\product\\").c_str(), NULL, &m_vtsignal_pro);
+
+	// 添加到combobox中;
+	std::string signalpath;
+	if (Global::g_Config.bGenerics )
+	{
+		signalpath = Global::g_Config.signaldir + "\\general\\";
+
+		m_wndSignalCombo.ResetContent();
+		for ( auto it : m_vtsignal_gen)
+		{
+			m_wndSignalCombo.AddString(fh.getfilename(it).c_str());
+		}
+	}
+	else
+	{
+		signalpath = Global::g_Config.signaldir + "\\product\\";
+		m_wndSignalCombo.ResetContent();
+		for (auto it : m_vtsignal_pro)
+		{
+			m_wndSignalCombo.AddString(fh.getfilename(it).c_str());
+		}
+	}	
+
+	signalpath.append(Global::g_Config.use_signal + ".xml");
+	if (!PathFileExists(signalpath.c_str()))
+	{
+		m_wndSignalCombo.SetCurSel(0);
+	}
+	else
+	{
+		m_wndSignalCombo.SelectString(0, Global::g_Config.use_signal.c_str());
+	}
+}
+
 void CIRControlWnd::Loadlayout(std::vector<BtnInfo>& vt)
 {
 	// 解析xml;
@@ -599,7 +502,7 @@ void CIRControlWnd::OnPaint()
 #endif
 }
 
-void CIRControlWnd::OnBtnClick(UINT uId)
+void CIRControlWnd::OnSignalBtnClick(UINT uId)
 {
 	CWnd* pWnd = GetFocus();
 	int id = pWnd->GetDlgCtrlID();
@@ -620,7 +523,7 @@ void CIRControlWnd::OnBtnClick(UINT uId)
 	}
 }
 
-void CIRControlWnd::OnBtnUpdate(CCmdUI* pCmdUI)
+void CIRControlWnd::OnUpdateSignalBtn(CCmdUI* pCmdUI)
 {
 	pCmdUI->Enable();
 }
@@ -629,3 +532,92 @@ void CIRControlWnd::OnUpdateCheckBox(CCmdUI* pCmdUI)
 {
 	pCmdUI->Enable();
 }
+
+void CIRControlWnd::OnCheckBoxClicked()
+{
+	Global::g_Config.bGenerics = m_wndSignalCheck.IsChecked();
+	// 添加到combobox中;
+	std::string signalpath;
+	if (Global::g_Config.bGenerics)
+	{
+		signalpath = Global::g_Config.signaldir + "\\general\\";
+
+		m_wndSignalCombo.ResetContent();
+		for (auto it : m_vtsignal_gen)
+		{
+			m_wndSignalCombo.AddString(filehelper::getfilename(it).c_str());
+		}
+	}
+	else
+	{
+		signalpath = Global::g_Config.signaldir + "\\product\\";
+		m_wndSignalCombo.ResetContent();
+		for (auto it : m_vtsignal_pro)
+		{
+			m_wndSignalCombo.AddString(filehelper::getfilename(it).c_str());
+		}
+	}
+
+	signalpath.append(Global::g_Config.use_signal + ".xml");
+	if (!PathFileExists(signalpath.c_str()))
+	{
+		m_wndSignalCombo.SetCurSel(0);
+	}
+	else
+	{
+		m_wndSignalCombo.SelectString(0, Global::g_Config.use_signal.c_str());
+	}
+
+	WritePrivateProfileString("ir-device", "generics", Global::g_Config.bGenerics ? "1" : "0", Global::g_szConfig);
+}
+
+void CIRControlWnd::OnUpdateBtnRestartProc(CCmdUI* pCmdUI)
+{
+	pCmdUI->Enable(TRUE);
+}
+
+void CIRControlWnd::OnBtnRestartProcClicked()
+{
+	// 关闭旧类型进程;
+	if (g_CloseApp)
+		g_CloseApp();
+
+	// 新启动类型进程;
+	if (g_StartIRApp)
+	{
+		if (g_StartIRApp(Global::g_Config.redratpath.c_str(), (Global::g_Config.signaldir + "\\defualt.xml").c_str(), 40000))
+		{
+			TRACE("启动红老鼠进程启动成功\r");
+		}
+		else
+		{
+			TRACE("启动红老鼠进程启动失败\r");
+			AfxMessageBox("启动红老鼠进程启动失败!");
+		}
+	}
+
+	Sleep(5500); // 等待进程启动完全;
+	// 连接服务器;
+	if (!g_Connect(_T("127.0.0.1"), 40000))
+		AfxMessageBox("连接红老鼠服务端失败,请重启设备!");
+
+	// 获取设备列表,以逗号分隔;
+	std::string devices = g_getDeviceNames();
+	if (devices.size() == 0)
+	{
+		AfxMessageBox("当前无红老鼠设备连接!");
+	}
+
+	std::string signale = Global::g_Config.bGenerics ? Global::g_Config.signaldir + "\\general\\" : Global::g_Config.signaldir + "\\product\\";
+	signale.append(Global::g_Config.use_signal + ".xml");
+	// 加载指定目录的xml信号集文件;
+	if (!g_loadSignalDataSet(signale.c_str()))
+	{
+		TRACE("加载信号集文件失败\r");
+		AfxMessageBox("加载信号集文件失败!");
+	}
+	else
+	{
+		TRACE("加载信号集文件成功\r");
+	}
+}

+ 12 - 35
VideoCapture/VideoCapture/IRControlWnd.h

@@ -12,36 +12,6 @@
 #include "DlgIRControl.h"
 #pragma once
 
-//////////////////////////////////////////////////////////////////////////
-// dll相关;
-extern HMODULE g_hdll;
-extern BOOL LoadLogLibarary();
-extern void FreeLogLibarary();
-
-typedef DWORD(*irc_IsAppRunning)(LPCTSTR lpszAppDir);
-typedef bool (*irc_StartIRApp)(LPCTSTR lpszAppDir, LPCTSTR lpSignalXml, DWORD dwPort);
-typedef bool (*irc_CloseApp)();
-typedef bool (*irc_Connect)(LPCTSTR lpServer, int port);
-typedef bool (*irc_loadSignalDataSet)(LPCTSTR lpDatasetXml);
-typedef LPCTSTR(*irc_getDeviceNames)();
-typedef LPCTSTR(*irc_getSignalsName)();
-typedef bool (*irc_sendSignal)(LPCTSTR lpSignal, int send_times, int sleep_time);
-typedef bool (*irc_sendSignals)(LPCTSTR lpSignals, int sleep_time);
-typedef bool (*irc_sendRepeatsSignal)(LPCTSTR lpSignal, int repeat_time);
-
-extern int g_nIRControl;
-extern irc_IsAppRunning g_IsAppRunning;
-extern irc_StartIRApp g_StartIRApp;
-extern irc_CloseApp g_CloseApp;
-extern irc_Connect g_Connect;
-extern irc_getDeviceNames g_getDeviceNames;
-extern irc_getSignalsName g_getSignalsName;
-extern irc_loadSignalDataSet g_loadSignalDataSet;
-extern irc_sendSignal g_sendSignal;
-extern irc_sendSignals g_sendSignals;
-extern irc_sendRepeatsSignal g_sendRepeatsSignal;
-//////////////////////////////////////////////////////////////////////////
-
 // 按钮id起始值;
 #define BTNID 11000
 
@@ -79,8 +49,8 @@ public:
 
 protected:
 	CFont m_fntPropList;
-	// 遥控器类型;
-	CComboBox m_wndObjectCombo;
+	// 重启服务端进程;
+	CMFCButton m_btnRestart;
 	// 信号集文件;
 	CComboBox m_wndSignalCombo;
 	// 选择通用遥控器;
@@ -114,7 +84,7 @@ protected:
 	afx_msg void OnSetFocus(CWnd* pOldWnd);
 	afx_msg void OnSettingChange(UINT uFlags, LPCTSTR lpszSection);
 	// 下拉框选项变化事件;
-	afx_msg void OnCbnSelchangeDeivceType();
+	afx_msg void OnCbnSelchangeSignal();
 
 	DECLARE_MESSAGE_MAP()
 
@@ -122,14 +92,21 @@ protected:
 
 	int m_nComboHeight;
 public:
+	std::vector<std::string> m_vtsignal_gen;
+	std::vector<std::string> m_vtsignal_pro;
+	void LoadSignals();
 	std::vector<BtnInfo> m_vtBtnInfo;
 	void Loadlayout(std::vector<BtnInfo> &vt);
 	afx_msg void OnPaint();
 	// 单击按钮;
-	afx_msg void OnBtnClick(UINT uId);
+	afx_msg void OnSignalBtnClick(UINT uId);
 	// 更新按钮状态;
-	afx_msg void OnBtnUpdate(CCmdUI* pCmdUI);
+	afx_msg void OnUpdateSignalBtn(CCmdUI* pCmdUI);
 	// 更新checkbox状态;
 	afx_msg void OnUpdateCheckBox(CCmdUI * pCmdUI);
+	afx_msg void OnCheckBoxClicked();
+	// 更新重启按钮状态;
+	afx_msg void OnUpdateBtnRestartProc(CCmdUI* pCmdUI);
+	afx_msg void OnBtnRestartProcClicked();
 };
 

+ 6 - 2
VideoCapture/VideoCapture/VideoCapture.vcxproj

@@ -67,7 +67,7 @@
       <SDLCheck>true</SDLCheck>
       <PreprocessorDefinitions>WIN32;_WINDOWS;_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <PrecompiledHeaderFile>StdAfx.h</PrecompiledHeaderFile>
-      <AdditionalIncludeDirectories>..\UI</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\UI;..\filehelper</AdditionalIncludeDirectories>
     </ClCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -100,7 +100,7 @@ copy "$(SolutionDir)AMESDK.DLL" "$(TargetDir)AMESDK.dll" /y/a</Command>
       <SDLCheck>true</SDLCheck>
       <PreprocessorDefinitions>WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <PrecompiledHeaderFile>StdAfx.h</PrecompiledHeaderFile>
-      <AdditionalIncludeDirectories>..\UI</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\UI;..\filehelper</AdditionalIncludeDirectories>
     </ClCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -140,6 +140,8 @@ copy "$(SolutionDir)AMESDK.DLL" "$(TargetDir)AMESDK.dll" /y/a</Command>
     </PreLinkEvent>
   </ItemDefinitionGroup>
   <ItemGroup>
+    <ClInclude Include="..\filehelper\filehelper.h" />
+    <ClInclude Include="..\filehelper\findfile.h" />
     <ClInclude Include="..\UI\BCMenu.h" />
     <ClInclude Include="..\UI\BtnST.h" />
     <ClInclude Include="..\UI\ComboTreeCtrl.h" />
@@ -175,6 +177,8 @@ copy "$(SolutionDir)AMESDK.DLL" "$(TargetDir)AMESDK.dll" /y/a</Command>
     <ClInclude Include="ViewTree.h" />
   </ItemGroup>
   <ItemGroup>
+    <ClCompile Include="..\filehelper\filehelper.cpp" />
+    <ClCompile Include="..\filehelper\findfile.cpp" />
     <ClCompile Include="..\UI\BCMenu.cpp" />
     <ClCompile Include="..\UI\BtnST.cpp" />
     <ClCompile Include="..\UI\ComboTreeCtrl.cpp" />

+ 15 - 0
VideoCapture/VideoCapture/VideoCapture.vcxproj.filters

@@ -19,6 +19,9 @@
     <Filter Include="UI">
       <UniqueIdentifier>{3d45edde-5892-4d23-95fb-1ab695bc5995}</UniqueIdentifier>
     </Filter>
+    <Filter Include="filehelper">
+      <UniqueIdentifier>{9b86e256-eb85-4250-83d2-dde9a2dc6bc4}</UniqueIdentifier>
+    </Filter>
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="VideoCapture.h">
@@ -120,6 +123,12 @@
     <ClInclude Include="tinyxml2.h">
       <Filter>头文件</Filter>
     </ClInclude>
+    <ClInclude Include="..\filehelper\filehelper.h">
+      <Filter>filehelper</Filter>
+    </ClInclude>
+    <ClInclude Include="..\filehelper\findfile.h">
+      <Filter>filehelper</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="VideoCapture.cpp">
@@ -203,6 +212,12 @@
     <ClCompile Include="tinyxml2.cpp">
       <Filter>源文件</Filter>
     </ClCompile>
+    <ClCompile Include="..\filehelper\filehelper.cpp">
+      <Filter>filehelper</Filter>
+    </ClCompile>
+    <ClCompile Include="..\filehelper\findfile.cpp">
+      <Filter>filehelper</Filter>
+    </ClCompile>
   </ItemGroup>
   <ItemGroup>
     <ResourceCompile Include="VideoCapture.rc">

+ 2 - 8
VideoCapture/VideoCapture/config.ini

@@ -1,12 +1,6 @@
 [ir-device]
-;当前使用类型;
-use-rat=1
-
-;3.0路径
-redrat3=C:\Python27\Tools\redhathub\RedRatHubCmd.exe
-
 ;4.0路径
-redrat4=C:\Python27\Tools\RedRatHub-V4.28\RedRatHubCmd.exe
+redratpath=C:\Python27\Tools\RedRatHub-V4.28\RedRatHubCmd.exe
 
 ;是否使用通用遥控信号
 generics=0
@@ -15,4 +9,4 @@ generics=0
 signal=D:\SAT\resource\RCU
 
 ;使用的信号集;
-use-signal=ARTEL_WZ_RC311_2841.xml
+use-signal=6586_waixie_all

+ 136 - 0
VideoCapture/filehelper/filehelper.cpp

@@ -0,0 +1,136 @@
+#include "stdafx.h"
+#include "filehelper.h"
+#include <shlwapi.h>
+
+// 排序和乱序使用stl;
+#include <cstdlib>
+#include <ctime>
+#include <algorithm>
+// _mkdir头文件;
+#include <direct.h>
+
+int myrandom(int i) { return std::rand() % i; }
+
+filehelper::filehelper(void)
+{
+	
+}
+
+filehelper::~filehelper(void)
+{
+
+}
+
+/************************************************************************/
+/*  函数:[2/21/2017 Jeff];
+/*  描述:;
+/*  参数:;
+/*  	[IN] :;
+/*  	[OUT] :;
+/*  	[IN/OUT] :;
+/*  返回:void;
+/*  注意:;
+/*  示例:;
+/*
+/*  修改:;
+/*  日期:;
+/*  内容:;
+/************************************************************************/
+void filehelper::random(IN STR_VEC& vtContent, IN BOOL bSort /* = TRUE */)
+{
+	if (bSort)
+	{//排序;
+		std::sort(vtContent.begin(), vtContent.end());
+	}
+	else
+	{//乱序;
+		//设置随即数生成器的种子;
+		std::srand(unsigned(std::time(0)));
+		std::random_shuffle(vtContent.begin(), vtContent.end(), myrandom);
+	}
+}
+
+/************************************************************************/
+/*  函数:[2/21/2017 Jeff];
+/*  描述:;
+/*  参数:;
+/*  	[IN] :;
+/*  	[OUT] :;
+/*  	[IN/OUT] :;
+/*  返回:void;
+/*  注意:;
+/*  示例:;
+/*
+/*  修改:;
+/*  日期:;
+/*  内容:;
+/************************************************************************/
+void filehelper::split(OUT vector<TString>& vtSplit, IN const TString str, IN const TString strSplit)
+{
+	if (str.size() == 0 || strSplit.size() == 0)
+		return;
+
+	INT nIndex = 0;
+	vtSplit.clear();
+	TString strtmp = str;
+	TString strtmp2;
+	do 
+	{
+		if (TString::npos != (nIndex = strtmp.find_first_of(strSplit)))
+		{
+			strtmp2 = strtmp.substr(0, nIndex);
+			if (strtmp2.size())vtSplit.push_back(strtmp2);
+			strtmp = strtmp.substr(nIndex + strSplit.size());
+		}
+	} while (strtmp.find_first_of(strSplit) != TString::npos);
+
+	if (strtmp.size())
+		vtSplit.push_back(strtmp);
+}
+
+//////////////////////////////////////////////////////////////////////////
+BOOL filehelper::getsubfolder(LPCTSTR lpfolder, STR_VEC *pvtfolders)
+{
+	// 路径不存在;
+	if (!PathFileExists(lpfolder))
+		return FALSE;
+
+	// 指针空;
+	if (pvtfolders == NULL) return FALSE;
+	m_pvtfolders = pvtfolders;
+
+	findsubfolder(lpfolder);
+
+	return TRUE;
+}
+
+//////////////////////////////////////////////////////////////////////////
+BOOL filehelper::getallfiles(LPCTSTR lpfolder, LPCTSTR lpfindext, STR_VEC *pvtfiles)
+{
+	// 路径不存在;
+	if (!PathFileExists(lpfolder))
+		return FALSE;
+
+	// 指针空;
+	if (pvtfiles == NULL) return FALSE;
+	m_pvtfiles = pvtfiles;
+
+	findfiles_findin_subfolder(lpfolder);
+
+	return TRUE;
+}
+
+BOOL filehelper::getfolderfiles(LPCTSTR lpfolder, LPCTSTR lpfindext, STR_VEC *pvtfiles)
+{
+	// 路径不存在;
+	if (!PathFileExists(lpfolder))
+		return FALSE;
+
+	// 指针空;
+	if (pvtfiles == NULL) return FALSE;
+	m_pvtfiles = pvtfiles;
+
+	findfiles_findout_subfolder(lpfolder);
+
+	return TRUE;
+}

+ 61 - 0
VideoCapture/filehelper/filehelper.h

@@ -0,0 +1,61 @@
+/************************************************************************/
+/*  Copyright (C), 2016-2020, [IT], 保留所有权利;
+/*  模 块 名:;
+/*  描    述:;
+/*
+/*  版    本:[V];	
+/*  作    者:[IT];
+/*  日    期:[12/22/2016];
+/*
+/*
+/*  注    意:;
+/*
+/*  修改记录:[IT];
+/*  修改日期:;
+/*  修改版本:;
+/*  修改内容:;
+/************************************************************************/
+#ifndef __FILEHELPING_20150818__
+#define __FILEHELPING_20150818__
+
+#pragma once
+
+#include "findfile.h"
+
+#define USE_IMGEXT 0
+
+class filehelper :public findfile
+{
+public:
+	filehelper(void);
+	~filehelper(void);
+
+public:
+	// 排序或乱序;
+	static void random(IN STR_VEC& vtContent, IN BOOL bSort = TRUE);
+	// 分隔数组;
+	static void split(OUT vector<TString>& vtSplit, IN const TString str, IN const TString strSplit);
+
+public:
+	// 只获取当前要目录的子文件夹,不获取子文件夹中的文件夹;
+	BOOL getsubfolder(
+		LPCTSTR lpfolder,								// 要查找的目录;
+		STR_VEC *pvtfolders								// 返回子文件夹;
+		);
+
+	// 查找当前目录及子目录下的所有文件;
+	BOOL getallfiles(
+		LPCTSTR lpfolder,								// 要查找的目录;
+		LPCTSTR lpfindext,								// 要查找的扩展名;
+		STR_VEC *pvtfiles								// 返回要查找的文件全名;
+		);
+
+	// 只查找当前目录的文件,不查找子目录;
+	BOOL getfolderfiles(
+		LPCTSTR lpfolder,								// 要查找的目录;
+		LPCTSTR lpfindext,								// 要查找的扩展名;
+		STR_VEC *pvtfiles							// 返回要查找的文件全名;
+		);
+};
+
+#endif

+ 327 - 0
VideoCapture/filehelper/findfile.cpp

@@ -0,0 +1,327 @@
+#include "stdafx.h"
+#include "findfile.h"
+#include <algorithm>
+
+// 查找文件的最大数量限制在nMaxLimit;
+CONST size_t nMaxLimit = 0xFFFFFFFF;	//--4294967295;
+// 查找文件的默认数量限制在nDefLimit;
+CONST size_t nDefLimit = 0xFFFFF;	//--1048575
+
+// 路径分隔符;
+CONST TCHAR		c_pathSeparator = _T('\\');
+CONST TString	s_pathSeparator = _T("\\");
+CONST TString	g_sVertical = _T("|");
+
+// 正确的扩展名及格式样列;
+// 这个值最好可以从配置文件ini或xml中获取,不用在代码里写死;
+CONST TString	g_sCorrectExt = _T("*.jpg|*.jpeg|*.png|*.bmp|*.cr2|*.nef|*.raw");
+
+
+findfile::findfile(void):
+m_nlimit(nDefLimit),
+m_pvtfiles(NULL),
+m_pvtnames(NULL),
+m_pvtfolders(NULL),
+m_pvtfiles_sth(NULL),
+m_pvtfiles_mth(NULL)
+{
+	
+}
+
+findfile::~findfile(void)
+{
+}
+
+/************************************************************************/
+/*
+函数:match
+描述:判断指定的文件命名是否匹配指定的扩展名;
+参数:
+IN	sFileExt	扩展名;
+IN	sFile		文件名;
+返回:匹配返回非0值,否则返回0;
+注意:
+*/
+/************************************************************************/
+void findfile::setlimit(IN CONST INT &nLimit)
+{
+	if (nLimit < 1)
+		m_nlimit = nDefLimit;
+	if (nLimit < nMaxLimit)
+		m_nlimit = nLimit;
+}
+
+// 获取文件名;
+TString findfile::getfilename(IN CONST TString &file)
+{
+	TString name;
+	TString strfile = file;
+	int nIndex = strfile.find_last_of(_T('\\'));	// 如果file不包含 '\\' ,得不到文件名;
+	if (nIndex == TString::npos)
+	{
+		nIndex = strfile.find_last_of(_T('.'));
+		if ( nIndex == TString::npos )
+			return _T("");
+
+		return strfile.substr(0, nIndex);
+	}
+
+	name = strfile.substr(nIndex+1);
+	nIndex = name.find_last_of(_T('.'));
+	if (nIndex == TString::npos)
+		return _T("");
+
+	return name.substr(0, nIndex);
+}
+
+void findfile::find1st(TString folder, TString &file)
+{
+	TString path = folder;
+	if (path.size() > 0 && c_pathSeparator != path[path.size() - 1])
+		path.append(s_pathSeparator);
+
+	TString _file = _T("*");
+	TString s = path + _file;
+
+	WIN32_FIND_DATA fileinfo = { 0 };
+	HANDLE handle = FindFirstFile(s.c_str(), &fileinfo);
+
+	if (NULL != handle && INVALID_HANDLE_VALUE != handle)
+	{
+		do
+		{
+			// '.'和 '..'的系统文件去除;
+			if (_T('.') != fileinfo.cFileName[0])
+			{
+				if ((FILE_ATTRIBUTE_DIRECTORY & fileinfo.dwFileAttributes) != FILE_ATTRIBUTE_DIRECTORY)	// 目录;
+				{
+					file = path + fileinfo.cFileName;
+					break;
+				}
+			}
+		} while (FindNextFile(handle, &fileinfo));
+
+		FindClose(handle);
+	}
+}
+
+// 全部;
+void findfile::findall(IN CONST TString& folder)
+{
+	TString path = folder;
+	if (path.size() > 0 && c_pathSeparator != path[path.size() - 1])
+		path.append(s_pathSeparator);
+
+	TString file = _T("*");
+	TString s = path + file;
+
+	WIN32_FIND_DATA fileinfo = { 0 };
+	HANDLE handle = FindFirstFile(s.c_str(), &fileinfo);
+
+	if (NULL != handle && INVALID_HANDLE_VALUE != handle)
+	{
+		do
+		{
+			// 检查是否超过最大数;
+			if (checklimit()) break;
+
+			// '.'和 '..'的系统文件去除;
+			if (_T('.') != fileinfo.cFileName[0])
+			{
+				if ((FILE_ATTRIBUTE_DIRECTORY & fileinfo.dwFileAttributes) == FILE_ATTRIBUTE_DIRECTORY)	// 目录;
+				{
+					m_pvtfolders->push_back(path + fileinfo.cFileName);
+					findall(path + fileinfo.cFileName);
+				}
+				else
+				{
+					if (!checklimit())
+					{
+						m_pvtnames->push_back(fileinfo.cFileName);
+						m_pvtfiles->push_back(path + fileinfo.cFileName);
+					}
+				}
+			}
+
+		} while (FindNextFile(handle, &fileinfo));
+
+		FindClose(handle);
+	}
+}
+
+void findfile::findsubfolder(IN CONST TString& folder)	// 查找子目录;
+{
+	TString path = folder;
+	if (path.size() > 0 && c_pathSeparator != path[path.size() - 1])
+		path.append(s_pathSeparator);
+
+	TString file = _T("*");
+	TString s = path + file;
+
+	WIN32_FIND_DATA fileinfo = { 0 };
+	HANDLE handle = FindFirstFile(s.c_str(), &fileinfo);
+
+	if (NULL != handle && INVALID_HANDLE_VALUE != handle)
+	{
+		do
+		{
+			if (_T('.') != fileinfo.cFileName[0])// '.'和 '..'的系统文件去除;
+			{
+				if ((FILE_ATTRIBUTE_DIRECTORY & fileinfo.dwFileAttributes) == FILE_ATTRIBUTE_DIRECTORY)	// 目录;
+				{
+					m_pvtfolders->push_back(path + fileinfo.cFileName);
+				}
+			}
+		} while (FindNextFile(handle, &fileinfo));
+
+		FindClose(handle);
+	}
+}
+
+void findfile::findallsubfolder(IN CONST TString& folder)
+{
+	TString path = folder;
+	if (path.size() > 0 && c_pathSeparator != path[path.size() - 1])
+		path.append(s_pathSeparator);
+
+	TString file = _T("*");
+	TString s = path + file;
+
+	WIN32_FIND_DATA fileinfo = { 0 };
+	HANDLE handle = FindFirstFile(s.c_str(), &fileinfo);
+
+	if (NULL != handle && INVALID_HANDLE_VALUE != handle)
+	{
+		do
+		{
+			if (_T('.') != fileinfo.cFileName[0])// '.'和 '..'的系统文件去除;
+			{
+				if ((FILE_ATTRIBUTE_DIRECTORY & fileinfo.dwFileAttributes) == FILE_ATTRIBUTE_DIRECTORY)	// 目录;
+				{
+					m_pvtfolders->push_back(path + fileinfo.cFileName);
+					findallsubfolder(path + fileinfo.cFileName); // 不入子目录查找;
+				}
+			}
+		} while (FindNextFile(handle, &fileinfo));
+
+		FindClose(handle);
+	}
+}
+
+//////////////////////////////////////////////////////////////////////////
+void findfile::findfiles_findin_subfolder(IN CONST TString& folder)
+{
+	TString path = folder;
+	if (path.size() > 0 && c_pathSeparator != path[path.size() - 1])
+		path.append(s_pathSeparator);
+
+	TString file = _T("*");
+	TString s = path + file;
+
+	WIN32_FIND_DATA fileinfo = { 0 };
+	HANDLE handle = FindFirstFile(s.c_str(), &fileinfo);
+
+	if (NULL != handle && INVALID_HANDLE_VALUE != handle)
+	{
+		do
+		{
+			// 检查是否超过最大数;
+			if (checklimit()) break;
+
+			// '.'和 '..'的系统文件去除;
+			if (_T('.') != fileinfo.cFileName[0])
+			{
+				if ((FILE_ATTRIBUTE_DIRECTORY & fileinfo.dwFileAttributes) == FILE_ATTRIBUTE_DIRECTORY)	// 目录;
+				{
+					findfiles_findin_subfolder(path + fileinfo.cFileName);
+				}
+				else
+				{
+					if (!checklimit())
+					{
+						m_pvtfiles->push_back(path + fileinfo.cFileName);
+					}
+				}
+			}
+		} while (FindNextFile(handle, &fileinfo));
+
+		FindClose(handle);
+	}
+}
+
+void findfile::findfiles_findout_subfolder(IN CONST TString& folder)
+{
+	TString path = folder;
+	if (path.size() > 0 && c_pathSeparator != path[path.size() - 1])
+		path.append(s_pathSeparator);
+
+	TString file = _T("*");
+	TString s = path + file;
+
+	WIN32_FIND_DATA fileinfo = { 0 };
+	HANDLE handle = FindFirstFile(s.c_str(), &fileinfo);
+
+	if (NULL != handle && INVALID_HANDLE_VALUE != handle)
+	{
+		do
+		{
+			// 检查是否超过最大数;
+			if (checklimit()) break;
+
+			// '.'和 '..'的系统文件去除;
+			if (_T('.') != fileinfo.cFileName[0])
+			{
+				if ((FILE_ATTRIBUTE_DIRECTORY & fileinfo.dwFileAttributes) != FILE_ATTRIBUTE_DIRECTORY)	// 目录;
+				{
+					if (!checklimit())
+					{
+						m_pvtfiles->push_back(path + fileinfo.cFileName);
+					}
+				}
+			}
+		} while (FindNextFile(handle, &fileinfo));
+
+		FindClose(handle);
+	}
+}
+
+void findfile::findfiles_within_subfolder(IN CONST TString& folder)
+{
+	TString path = folder;
+	if (path.size() > 0 && c_pathSeparator != path[path.size() - 1])
+		path.append(s_pathSeparator);
+
+	TString file = _T("*");
+	TString s = path + file;
+
+	WIN32_FIND_DATA fileinfo = { 0 };
+	HANDLE handle = FindFirstFile(s.c_str(), &fileinfo);
+
+	if (NULL != handle && INVALID_HANDLE_VALUE != handle)
+	{
+		do
+		{
+			// 检查是否超过最大数;
+			if (checklimit()) break;
+
+			// '.'和 '..'的系统文件去除;
+			if (_T('.') != fileinfo.cFileName[0])
+			{
+				if ((FILE_ATTRIBUTE_DIRECTORY & fileinfo.dwFileAttributes) == FILE_ATTRIBUTE_DIRECTORY)	// 目录;
+				{
+					m_pvtfolders->push_back(path + fileinfo.cFileName);
+					findfiles_within_subfolder(path + fileinfo.cFileName);
+				}
+				else
+				{
+					if (!checklimit())
+					{
+						m_pvtfiles->push_back(path + fileinfo.cFileName);
+					}
+				}
+			}
+		} while (FindNextFile(handle, &fileinfo));
+
+		FindClose(handle);
+	}
+}

+ 86 - 0
VideoCapture/filehelper/findfile.h

@@ -0,0 +1,86 @@
+/************************************************************************/
+/*  Copyright (C), 2016-2020, [IT], 保留所有权利;
+/*  模 块 名:;
+/*  描    述:;
+/*
+/*  版    本:[V];	
+/*  作    者:[IT];
+/*  日    期:[12/22/2016];
+/*
+/*
+/*  注    意:;
+/*
+/*  修改记录:[IT];
+/*  修改日期:;
+/*  修改版本:;
+/*  修改内容:;
+/************************************************************************/
+#ifndef __FIND_FILE_20151003__
+#define __FIND_FILE_20151003__
+
+#include <string>
+#include <vector>
+using namespace std;
+
+#ifndef _UNICODE
+typedef string TString;
+#else
+typedef wstring TString;
+#endif
+
+typedef vector<TString> STR_VEC;
+
+#pragma once
+
+class findfile
+{
+public:
+	findfile(void);
+	virtual ~findfile(void);
+
+//protected:
+public:
+	INT m_nlimit;
+	STR_VEC m_vtEffctExt;
+	STR_VEC *m_pvtfiles;
+	STR_VEC *m_pvtnames;
+	STR_VEC *m_pvtfolders;
+
+	STR_VEC *m_pvtfiles_sth;	// s小图;
+	STR_VEC *m_pvtfiles_mth;	// m小图;	
+public:
+	static inline int findfile::match(IN CONST TString &strExt, IN CONST TString &strfile)
+	{
+		int pos = strfile.find_last_of(_T('.'));
+		if (TString::npos != pos)
+			return !_tcsicmp(strExt.c_str(), strfile.substr(pos).c_str());
+
+		return FALSE;
+	}
+	
+	static TString getfilename(IN CONST TString &file);
+protected:
+	INT  getlimit() const { return m_nlimit; }
+	void setlimit(IN CONST INT &nlimit);
+
+	inline INT checklimit() { return m_pvtfiles->size() == getlimit(); }
+	BOOL IsaDirectory(CONST TString &sDirectory) { return (FILE_ATTRIBUTE_DIRECTORY == GetFileAttributes(sDirectory.c_str())); }
+
+public:
+	void find1st(TString folder, TString &file);
+	// 查找所有文件,包括子文件夹名、文件名、文件路径;
+	void findall(IN CONST TString& folder);
+	// 只返回2级子目录名(测试ok);
+	void findsubfolder(IN CONST TString& folder);
+	// 只返回所有子目录名(测试ok);
+	void findallsubfolder(IN CONST TString& folder);
+
+	// 查找文件路径,以及查找子目录的文件路径,但不获取子目录名(测试ok);
+	void findfiles_findin_subfolder(IN CONST TString& folder);
+	// 查找文件路径,不查找子目录的文件(测试ok);
+	void findfiles_findout_subfolder(IN CONST TString& folder);
+	// 查找文件路径,以及查找子目录的文件路径,同时获取子目录名(测试ok);
+	void findfiles_within_subfolder(IN CONST TString& folder);
+};
+
+#endif