143 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			143 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
/*********************************************************************************************
 | 
						|
 * Copyright 2002 - Volian Enterprises, Inc. All rights reserved.
 | 
						|
 * Volian Enterprises - Proprietary Information - DO NOT COPY OR DISTRIBUTE
 | 
						|
 * ------------------------------------------------------------------------------
 | 
						|
 * $Workfile: WinExeClass.cpp $     $Revision: 3 $
 | 
						|
 * $Author: Jsj $   $Date: 12/16/03 11:59a $
 | 
						|
 *
 | 
						|
 * $History: WinExeClass.cpp $
 | 
						|
 * 
 | 
						|
 * *****************  Version 3  *****************
 | 
						|
 * User: Jsj          Date: 12/16/03   Time: 11:59a
 | 
						|
 * Updated in $/LibSource/WinExeClass
 | 
						|
 * modified to all use in .net 1.0 and .net 1.1
 | 
						|
 * 
 | 
						|
 * *****************  Version 2  *****************
 | 
						|
 * User: Jsj          Date: 1/06/03    Time: 9:52a
 | 
						|
 * Updated in $/LibSource/WinExeClass
 | 
						|
 * fixed problem of running a C# program - was returning to main process
 | 
						|
 * before completing spawned process
 | 
						|
 * 
 | 
						|
 * *****************  Version 1  *****************
 | 
						|
 * User: Jsj          Date: 8/23/02    Time: 2:57p
 | 
						|
 * Created in $/LibSource/WinExeClass
 | 
						|
 *********************************************************************************************/
 | 
						|
 | 
						|
// This is the main DLL file.
 | 
						|
 | 
						|
#include "stdafx.h"
 | 
						|
 | 
						|
#include "WinExeClass.h"
 | 
						|
 | 
						|
using namespace WinExeClass;
 | 
						|
 | 
						|
	// Spawn off another process and run the passed in program.
 | 
						|
	// Note that the documentation for WinExec() says that it's provided
 | 
						|
	//   for 16-bit windows compatibility and that applications should use
 | 
						|
	//   the CreateProcess function.  So this class gives you access to
 | 
						|
	//   either the WinExe() or the CreateProcess() functions, just in case
 | 
						|
	//   one works better than the other for your current programming needs.
 | 
						|
 | 
						|
bool CLWinExec::RunWinExe(char *prgName)
 | 
						|
{
 | 
						|
	bool RtnVal = false;
 | 
						|
	RtnVal = DoWinExe(prgName);
 | 
						|
	return RtnVal;
 | 
						|
}
 | 
						|
 | 
						|
bool CLWinExec::RunCreateProcess(char *prgName)
 | 
						|
{
 | 
						|
	bool RtnVal = false;
 | 
						|
	RtnVal = DoCreateProcess(prgName);
 | 
						|
	return RtnVal;
 | 
						|
}
 | 
						|
 | 
						|
bool CLWinExec::RunWinExe(String *prgName)
 | 
						|
{
 | 
						|
	USES_CONVERSION;
 | 
						|
	bool RtnVal = false;
 | 
						|
//	UINT hInst;
 | 
						|
 | 
						|
	// Grab the program name from the String class and place
 | 
						|
	// in a NUll terminated char array.
 | 
						|
	// Note that String uses unicode chars so not every character
 | 
						|
	// can be convert to the char array. But this works for
 | 
						|
	// what we currently need.
 | 
						|
	int len;
 | 
						|
	char *tmpstr;
 | 
						|
	len = (prgName->get_Length)();
 | 
						|
	tmpstr = new char(len + 1);
 | 
						|
	ZeroMemory(tmpstr,len+1);
 | 
						|
	for (int i=0; i < len; i++)
 | 
						|
		tmpstr[i] = (prgName->get_Chars)(i);
 | 
						|
 | 
						|
	RtnVal = DoWinExe(tmpstr);
 | 
						|
 | 
						|
	return RtnVal;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
bool CLWinExec::RunCreateProcess(String *prgName)
 | 
						|
{
 | 
						|
	USES_CONVERSION;
 | 
						|
	bool RtnVal = false;
 | 
						|
//	UINT hInst;
 | 
						|
 | 
						|
	// Grab the program name from the String class and place
 | 
						|
	// in a NUll terminated char array.
 | 
						|
	// Note that String uses unicode chars so not every character
 | 
						|
	// can be convert to the char array. But this works for
 | 
						|
	// what we currently need.
 | 
						|
	int len;
 | 
						|
	char tmpstr[256];
 | 
						|
	len = (prgName->get_Length)();
 | 
						|
//	tmpstr = new char[len + 1];
 | 
						|
	ZeroMemory(tmpstr,len+1);
 | 
						|
	for (int i=0; i < len; i++)
 | 
						|
		tmpstr[i] = (prgName->get_Chars)(i);
 | 
						|
 | 
						|
	RtnVal = DoCreateProcess(tmpstr);
 | 
						|
 | 
						|
	return RtnVal;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
bool CLWinExec::DoWinExe(char *prgName)
 | 
						|
{
 | 
						|
	bool RtnVal = false;
 | 
						|
	UINT hInst;
 | 
						|
 | 
						|
	hInst = WinExec(prgName,SW_NORMAL);
 | 
						|
	if (hInst > 31){
 | 
						|
		RtnVal = true;
 | 
						|
		// Wait until child process exits.
 | 
						|
		WaitForSingleObject((HANDLE)hInst,INFINITE);
 | 
						|
	}
 | 
						|
	return RtnVal;
 | 
						|
}
 | 
						|
 | 
						|
bool CLWinExec::DoCreateProcess(char *prgName)
 | 
						|
{
 | 
						|
	bool RtnVal = false;
 | 
						|
	STARTUPINFO procIn;
 | 
						|
	PROCESS_INFORMATION procOut;
 | 
						|
 | 
						|
	ZeroMemory(&procIn,sizeof(procIn));
 | 
						|
	ZeroMemory(&procOut,sizeof(procOut));
 | 
						|
 | 
						|
	procIn.dwFlags = STARTF_FORCEOFFFEEDBACK;
 | 
						|
	procIn.cb = sizeof(STARTUPINFO);
 | 
						|
 | 
						|
//	if (CreateProcess(prgName,NULL,NULL,NULL,FALSE,CREATE_SEPARATE_WOW_VDM,NULL,NULL,&procIn,&procOut))
 | 
						|
	if (CreateProcess(NULL,prgName,NULL,NULL,FALSE,0,NULL,NULL,&procIn,&procOut))
 | 
						|
	{
 | 
						|
		RtnVal = true; // process completed normally
 | 
						|
		// Wait until child process exits.
 | 
						|
		WaitForSingleObject(procOut.hProcess,INFINITE);
 | 
						|
		// Close process and thread handles.
 | 
						|
		CloseHandle(procOut.hProcess);
 | 
						|
		CloseHandle(procOut.hThread);
 | 
						|
	}
 | 
						|
	return RtnVal;
 | 
						|
}
 |