/********************************************************************************************* * 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; }