Beispiel #1
0
void CTunerCtrl::CloseExe(DWORD PID)
{
	wstring pipeName = L"";
	wstring waitEventName = L"";

	Format(pipeName, L"%s%d", CMD2_VIEW_CTRL_PIPE, PID );
	Format(waitEventName, L"%s%d", CMD2_VIEW_CTRL_WAIT_CONNECT, PID );

	cmdSend.SetPipeSetting(waitEventName, pipeName);

	BOOL bFind = TRUE;
	DWORD dwCount=0;
	bFind = _FindOpenExeProcess(PID);
	if( bFind == TRUE ){
		cmdSend.SendViewAppClose();
	}
	while(bFind == TRUE && dwCount<60){
		bFind = _FindOpenExeProcess(PID);
		Sleep(500);
		dwCount++;
	}
	if( bFind == TRUE ){
		//ぶち殺す
		HANDLE hProcess =  OpenProcess(PROCESS_TERMINATE, FALSE, PID);
		TerminateProcess(hProcess, (UINT)-1);
		CloseHandle(hProcess);
		Sleep(500);
	}
}
Beispiel #2
0
UINT WINAPI CNotifyManager::SendNotifyThread(LPVOID param)
{
	CNotifyManager* sys = (CNotifyManager*)param;
	CSendCtrlCmd sendCtrl;
	map<DWORD,DWORD>::iterator itr;
	DWORD wait = 0;
	while(1){
		map<DWORD, DWORD> registGUI;
		map<wstring, REGIST_TCP_INFO> registTCP;
		NOTIFY_SRV_INFO notifyInfo;

		if( ::WaitForSingleObject(sys->notifyStopEvent, wait) != WAIT_TIMEOUT ){
			//キャンセルされた
			break;
		}
		//現在の情報取得
		if( sys->NotifyLock() == FALSE ) return 0;
		registGUI = sys->registGUIMap;
		registTCP = sys->registTCPMap;
		if( sys->notifyList.size() > 0 ){
			notifyInfo = sys->notifyList[0];
			sys->notifyList.erase(sys->notifyList.begin());
		}else{
			//リストないので終了
			sys->NotifyUnLock();
			return 0;
		}
		sys->NotifyUnLock();

		vector<DWORD> errID;
		for( itr = registGUI.begin(); itr != registGUI.end(); itr++){
			if( ::WaitForSingleObject(sys->notifyStopEvent, 0) != WAIT_TIMEOUT ){
				//キャンセルされた
				break;
			}
			if( _FindOpenExeProcess(itr->first) == TRUE ){
				wstring pipe;
				wstring waitEvent;
				Format(pipe, L"%s%d", CMD2_GUI_CTRL_PIPE, itr->first);
				Format(waitEvent, L"%s%d", CMD2_GUI_CTRL_WAIT_CONNECT, itr->first);

				sendCtrl.SetSendMode(FALSE);
				sendCtrl.SetPipeSetting(waitEvent, pipe);
				sendCtrl.SetConnectTimeOut(5*1000);
				DWORD err = sendCtrl.SendGUINotifyInfo2(&notifyInfo);
				if( err == CMD_NON_SUPPORT ){
					switch(notifyInfo.notifyID){
					case NOTIFY_UPDATE_EPGDATA:
						err = sendCtrl.SendGUIUpdateEpgData();
						break;
					case NOTIFY_UPDATE_RESERVE_INFO:
					case NOTIFY_UPDATE_REC_INFO:
					case NOTIFY_UPDATE_AUTOADD_EPG:
					case NOTIFY_UPDATE_AUTOADD_MANUAL:
						err = sendCtrl.SendGUIUpdateReserve();
						break;
					case NOTIFY_UPDATE_SRV_STATUS:
						err = sendCtrl.SendGUIStatusChg((WORD)notifyInfo.param1);
						break;
					default:
						break;
					}
				}
				if( err != CMD_SUCCESS && err != CMD_NON_SUPPORT){
					errID.push_back(itr->first);
				}
			}else{
				errID.push_back(itr->first);
			}
		}

		map<wstring, REGIST_TCP_INFO>::iterator itrTCP;
		vector<wstring> errIP;
		for( itrTCP = registTCP.begin(); itrTCP != registTCP.end(); itrTCP++){
			if( ::WaitForSingleObject(sys->notifyStopEvent, 0) != WAIT_TIMEOUT ){
				//キャンセルされた
				break;
			}

			sendCtrl.SetSendMode(TRUE);
			sendCtrl.SetNWSetting(itrTCP->second.ip, itrTCP->second.port);
			sendCtrl.SetConnectTimeOut(5*1000);

			DWORD err = sendCtrl.SendGUINotifyInfo2(&notifyInfo);
			if( err == CMD_NON_SUPPORT ){
				switch(notifyInfo.notifyID){
				case NOTIFY_UPDATE_EPGDATA:
					err = sendCtrl.SendGUIUpdateEpgData();
					break;
				case NOTIFY_UPDATE_RESERVE_INFO:
				case NOTIFY_UPDATE_REC_INFO:
				case NOTIFY_UPDATE_AUTOADD_EPG:
				case NOTIFY_UPDATE_AUTOADD_MANUAL:
					err = sendCtrl.SendGUIUpdateReserve();
					break;
				case NOTIFY_UPDATE_SRV_STATUS:
					err = sendCtrl.SendGUIStatusChg((WORD)notifyInfo.param1);
					break;
				default:
					break;
				}
			}
			if( err != CMD_SUCCESS && err != CMD_NON_SUPPORT){
				errIP.push_back(itrTCP->first);
			}
		}

		//送信できなかったもの削除
		if( sys->NotifyLock() == FALSE ) return 0;

		if( notifyInfo.notifyID <= 100 ){
			wait = 0;
		}else{
			wait = 0;
			if( sys->notifyList.size() > 0 ){
				if( sys->notifyList[0].notifyID > 100 ){
					wait = 5*1000;
				}
			}
		}

		for( size_t i=0; i<errID.size(); i++ ){
			itr = sys->registGUIMap.find(errID[i]);
			if( itr != sys->registGUIMap.end() ){
				sys->registGUIMap.erase(itr);
			}
		}
		for( size_t i=0; i<errIP.size(); i++ ){
			itrTCP = sys->registTCPMap.find(errIP[i]);
			if( itrTCP != sys->registTCPMap.end() ){
				_OutputDebugString(L"notifyErr %s:%d", itrTCP->second.ip.c_str(), itrTCP->second.port);
				sys->registTCPMap.erase(itrTCP);
			}
		}
		sys->NotifyUnLock();
	}

	return 0;
}
Beispiel #3
0
UINT WINAPI CBatManager::BatWorkThread(LPVOID param)
{
	CBatManager* sys = (CBatManager*)param;
	CSendCtrlCmd sendCtrl;

	while(1){
		if( ::WaitForSingleObject(sys->batWorkStopEvent, 1000) != WAIT_TIMEOUT ){
			//キャンセルされた
			break;
		}
		if( sys->workFlag == TRUE ){
			BAT_WORK_INFO work;
			if( sys->Lock() == TRUE ){
				if( sys->workList.size() == 0 ){
					sys->UnLock();
					break;
				}else{
					work = sys->workList[0];
				}
			}else{
				continue;
			}

			sys->UnLock();

			if( work.reserveInfo.recSetting.batFilePath.size() > 0 ){
				wstring batFilePath = L"";
				if( sys->CreateBatFile(&work, work.reserveInfo.recSetting.batFilePath, batFilePath) == TRUE ){
					wstring strExecute;
					Format(strExecute, L"\"%s\"", batFilePath.c_str());

					BOOL send = FALSE;
					DWORD PID = 0;
					map<DWORD, DWORD>::iterator itr;
					map<DWORD, DWORD> registGUIMap;
					if( sys->notifyManager != NULL ){
						sys->notifyManager->GetRegistGUI(&registGUIMap);
					}
					for( itr = registGUIMap.begin(); itr != registGUIMap.end(); itr++ ){
						wstring pipeName = L"";
						wstring waitEventName = L"";

						Format(pipeName, L"%s%d", CMD2_GUI_CTRL_PIPE, itr->first );
						Format(waitEventName, L"%s%d", CMD2_GUI_CTRL_WAIT_CONNECT, itr->first );

						sendCtrl.SetPipeSetting(waitEventName, pipeName);

						if( sendCtrl.SendGUIExecute(strExecute.c_str(), &PID) == CMD_SUCCESS ){
							send = TRUE;
							break;
						}
					}
					if( send == FALSE ){
						//GUI経由で起動できなかった
						PROCESS_INFORMATION pi;
						STARTUPINFO si;
						ZeroMemory(&si,sizeof(si));
						si.cb=sizeof(si);

						send = CreateProcess( NULL, (WCHAR*)strExecute.c_str(), NULL, NULL, FALSE, GetPriorityClass(GetCurrentProcess()), NULL, NULL, &si, &pi );
						if( send == TRUE ){
							CloseHandle(pi.hThread);
							CloseHandle(pi.hProcess);

							PID = pi.dwProcessId;
						}
					}
					if( send == TRUE ){
						//終了監視
						while(1){
							if( WaitForSingleObject( sys->batWorkStopEvent, 2000 ) != WAIT_TIMEOUT ){
								//中止
								break;
							}
							if( _FindOpenExeProcess(PID) == FALSE ){
								//終わった
								sys->lastSuspendMode = work.reserveInfo.recSetting.suspendMode;
								sys->lastRebootFlag = work.reserveInfo.recSetting.rebootFlag;
								break;
							}
						}
					}
				}else{
					_OutputDebugString(L"BATファイル作成エラー:%s", work.reserveInfo.recSetting.batFilePath);
				}
			}

			if( sys->Lock() == TRUE ){
				sys->workList.erase(sys->workList.begin());
				sys->UnLock();
			}
		}
	}
	sys->workFlag = FALSE;

	return 0;
}