osrelate.cpp

来自「◆◆◆ 《投掷飞镖记分工具》◆◆◆ 操作系统 : Windows Mobil」· C++ 代码 · 共 128 行

CPP
128
字号
#include "StdAfx.h"
#include "PublicFunc.h"

TCHAR* hwFormatMessage ( DWORD dwErrorCode )
{
	static TCHAR szError[256] = {0};
    FormatMessage (
		FORMAT_MESSAGE_FROM_SYSTEM,
		NULL,
		dwErrorCode,
		MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT),
		szError,
		LENGTH(szError),
		NULL);
	return szError;
}

//
// 等待线程退出
//
BOOL WaitForThreadEnd ( HANDLE *phThread, DWORD dwWaitTime /*=5000*/ )
{
	BOOL bRet = TRUE;
	ASSERT ( phThread );
	if ( !(*phThread) ) return TRUE;
	if ( ::WaitForSingleObject ( *phThread, dwWaitTime ) == WAIT_TIMEOUT )
	{
		bRet = FALSE;
		::TerminateThread ( *phThread, 0 );
	}
	::CloseHandle ( *phThread );
	(*phThread) = NULL;
	return bRet;
}

/********************************************************************************
* Function Type	:	Global
* Parameter		:	lpProgram	-	存放当前执行程序所在的路径字符串的缓冲
*					dwSize		-	缓冲大小
* Return Value	:	字符个数
* Description	:	得到当前执行程序所在的路径
*********************************************************************************/
int GetProgramDir ( LPTSTR lpProgram, DWORD dwSize )
{
	ASSERT ( lpProgram );
	ZeroMemory(lpProgram,dwSize);
	GetModuleFileName(NULL,(LPTSTR)lpProgram,dwSize);
	LPTSTR p = (LPTSTR)strrchr_hw((LPCTSTR)lpProgram, _T('\\'));
	if(!p) return 0;
	p[1] = _T('\0');
	int nLength = (int)(p - lpProgram)/sizeof(TCHAR);

	return nLength;
}

CString GetProgramDir()
{
	TCHAR szProgram[MAX_PATH] = {0};
	GetProgramDir ( szProgram, sizeof(szProgram) );
	return szProgram;
}

//
// 创建一个进程,返回进程句柄
//
HANDLE hwCreateProcess ( LPCTSTR lpszFileName, LPCTSTR lpszParameter )
{
	PROCESS_INFORMATION proc_info;
	STARTUPINFO startup_info;
	startup_info.cb = sizeof(STARTUPINFO);
	startup_info.lpReserved = NULL;
	startup_info.lpDesktop = NULL;
	startup_info.lpTitle = NULL;
#ifdef WINCE
	startup_info.dwFlags = 0;
#else
	startup_info.dwFlags = STARTF_USESHOWWINDOW;
#endif
	startup_info.wShowWindow = SW_NORMAL;
	startup_info.cbReserved2 = 0;
	startup_info.lpReserved2  = NULL;
	CString csCommandLine;
	if ( lpszParameter && lstrlen(lpszParameter) > 0 )
		csCommandLine.Format ( _T("\"%s\" %s"), lpszFileName, lpszParameter?lpszParameter:_T("") );
	else
		csCommandLine.Format ( _T("\"%s\""), lpszFileName );
	csCommandLine.TrimLeft (); csCommandLine.TrimRight ();
	if ( !CreateProcess(NULL,csCommandLine.GetBuffer(0),NULL,NULL,TRUE,
#ifdef WINCE
		0x04000000,
#else
		CREATE_DEFAULT_ERROR_MODE,
#endif
		NULL,NULL,&startup_info,&proc_info) )
	{
		return NULL;
	}

	return proc_info.hProcess;
}

/********************************************************************************
* Function Type	:	Global
* Parameter		:	lpszFileName	-	程序名
*					dwTimeout		-	超时时间(秒)
										:	=0 - 直接返回
*											>0 - 秒数
* Return Value	:	NO_ERROR		-	执行成功
*					-1				-	执行错误
*					-2				-	执行超时
*					-3				-	取进程返回代码时错误
* Description	:	执行一个程序并等待执行完毕
*********************************************************************************/
int ExecuteProcAndWaitEnd(LPCTSTR lpszFileName, LPCTSTR lpszParameter, DWORD dwTimeout /* = 0 */, LPDWORD lpExitCode/*=NULL*/)
{
	HANDLE hProcess = hwCreateProcess ( lpszFileName, lpszParameter );
	if ( !hProcess ) return -1;
	if(dwTimeout > 0 && WaitForSingleObject ( hProcess, dwTimeout*1000 ) != 0)
	{
		return -2;
	}
	if ( lpExitCode )
	{
		if ( !GetExitCodeProcess ( hProcess, lpExitCode ) )
			return -3;
	}
	return NO_ERROR;
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?