1*cdf0e10cSrcweir #pragma once 2*cdf0e10cSrcweir #ifndef __cplusplus 3*cdf0e10cSrcweir #error Need C++ to compile 4*cdf0e10cSrcweir #endif 5*cdf0e10cSrcweir 6*cdf0e10cSrcweir #include "main.h" 7*cdf0e10cSrcweir 8*cdf0e10cSrcweir #ifndef _WINDOWS_ 9*cdf0e10cSrcweir #if defined _MSC_VER 10*cdf0e10cSrcweir #pragma warning(push, 1) 11*cdf0e10cSrcweir #endif 12*cdf0e10cSrcweir # include <windows.h> 13*cdf0e10cSrcweir #if defined _MSC_VER 14*cdf0e10cSrcweir #pragma warning(pop) 15*cdf0e10cSrcweir #endif 16*cdf0e10cSrcweir #endif 17*cdf0e10cSrcweir 18*cdf0e10cSrcweir 19*cdf0e10cSrcweir #ifndef _INC_TCHAR 20*cdf0e10cSrcweir # ifdef UNICODE 21*cdf0e10cSrcweir # define _UNICODE 22*cdf0e10cSrcweir # endif 23*cdf0e10cSrcweir # include <tchar.h> 24*cdf0e10cSrcweir #endif 25*cdf0e10cSrcweir 26*cdf0e10cSrcweir #ifdef UNICODE 27*cdf0e10cSrcweir # define Main MainW 28*cdf0e10cSrcweir # define GetArgv( pArgc ) CommandLineToArgvW( GetCommandLine(), pArgc ) 29*cdf0e10cSrcweir # define PROCESS_CREATIONFLAGS CREATE_UNICODE_ENVIRONMENT 30*cdf0e10cSrcweir #else 31*cdf0e10cSrcweir # define GetArgv( pArgc ) (*pArgc = __argc, __argv) 32*cdf0e10cSrcweir # define PROCESS_CREATIONFLAGS 0 33*cdf0e10cSrcweir # define Main MainA 34*cdf0e10cSrcweir #endif 35*cdf0e10cSrcweir 36*cdf0e10cSrcweir #define BIN_EXT_STR TEXT(".bin") 37*cdf0e10cSrcweir #define PARAM_LIBPATH_STR TEXT("-libpath=") 38*cdf0e10cSrcweir #define PARAM_LOCAL_STR TEXT("-local") 39*cdf0e10cSrcweir #define PARAM_REMOTE_STR TEXT("-remote") 40*cdf0e10cSrcweir 41*cdf0e10cSrcweir #if defined( REMOTE ) 42*cdf0e10cSrcweir #define DEFAULT_LIBPATH TEXT("remote;") 43*cdf0e10cSrcweir #elif defined( LOCAL ) 44*cdf0e10cSrcweir #define DEFAULT_LIBPATH TEXT("local;") 45*cdf0e10cSrcweir #endif 46*cdf0e10cSrcweir 47*cdf0e10cSrcweir extern "C" int Main() 48*cdf0e10cSrcweir { 49*cdf0e10cSrcweir // Retreive startup info 50*cdf0e10cSrcweir 51*cdf0e10cSrcweir STARTUPINFO aStartupInfo; 52*cdf0e10cSrcweir 53*cdf0e10cSrcweir ZeroMemory( &aStartupInfo, sizeof(aStartupInfo) ); 54*cdf0e10cSrcweir aStartupInfo.cb = sizeof( aStartupInfo ); 55*cdf0e10cSrcweir GetStartupInfo( &aStartupInfo ); 56*cdf0e10cSrcweir 57*cdf0e10cSrcweir // Retrieve command line 58*cdf0e10cSrcweir 59*cdf0e10cSrcweir LPTSTR lpCommandLine = GetCommandLine(); 60*cdf0e10cSrcweir 61*cdf0e10cSrcweir LPTSTR *ppArguments = NULL; 62*cdf0e10cSrcweir int nArguments = 0; 63*cdf0e10cSrcweir 64*cdf0e10cSrcweir ppArguments = GetArgv( &nArguments ); 65*cdf0e10cSrcweir 66*cdf0e10cSrcweir // Calculate application name 67*cdf0e10cSrcweir 68*cdf0e10cSrcweir 69*cdf0e10cSrcweir TCHAR szApplicationName[MAX_PATH]; 70*cdf0e10cSrcweir TCHAR szDrive[MAX_PATH]; 71*cdf0e10cSrcweir TCHAR szDir[MAX_PATH]; 72*cdf0e10cSrcweir TCHAR szFileName[MAX_PATH]; 73*cdf0e10cSrcweir TCHAR szExt[MAX_PATH]; 74*cdf0e10cSrcweir 75*cdf0e10cSrcweir GetModuleFileName( NULL, szApplicationName, MAX_PATH ); 76*cdf0e10cSrcweir _tsplitpath( szApplicationName, szDrive, szDir, szFileName, szExt ); 77*cdf0e10cSrcweir _tmakepath( szApplicationName, szDrive, szDir, szFileName, BIN_EXT_STR ); 78*cdf0e10cSrcweir 79*cdf0e10cSrcweir // Retreive actual environment 80*cdf0e10cSrcweir 81*cdf0e10cSrcweir TCHAR szBuffer[1024]; 82*cdf0e10cSrcweir TCHAR szPathValue[1024] = TEXT(""); 83*cdf0e10cSrcweir 84*cdf0e10cSrcweir #ifdef DEFAULT_LIBPATH 85*cdf0e10cSrcweir _tmakepath( szPathValue, szDrive, szDir, DEFAULT_LIBPATH, TEXT("") ); 86*cdf0e10cSrcweir #endif 87*cdf0e10cSrcweir 88*cdf0e10cSrcweir for ( int argn = 1; argn < nArguments; argn++ ) 89*cdf0e10cSrcweir { 90*cdf0e10cSrcweir if ( 0 == _tcscmp( ppArguments[argn], PARAM_REMOTE_STR ) ) 91*cdf0e10cSrcweir { 92*cdf0e10cSrcweir _tmakepath( szPathValue, szDrive, szDir, TEXT("remote;"), TEXT("") ); 93*cdf0e10cSrcweir break; 94*cdf0e10cSrcweir } 95*cdf0e10cSrcweir else if ( 0 == _tcscmp( ppArguments[argn], PARAM_LOCAL_STR ) ) 96*cdf0e10cSrcweir { 97*cdf0e10cSrcweir _tmakepath( szPathValue, szDrive, szDir, TEXT("local;"), TEXT("") ); 98*cdf0e10cSrcweir break; 99*cdf0e10cSrcweir } 100*cdf0e10cSrcweir else if ( 0 == _tcsncmp( ppArguments[argn], PARAM_LIBPATH_STR, _tcslen(PARAM_LIBPATH_STR) ) ) 101*cdf0e10cSrcweir { 102*cdf0e10cSrcweir LPTSTR pFileSpec = NULL; 103*cdf0e10cSrcweir 104*cdf0e10cSrcweir GetFullPathName( ppArguments[argn] + _tcslen(PARAM_LIBPATH_STR), sizeof(szPathValue) / sizeof(TCHAR), szPathValue, &pFileSpec ); 105*cdf0e10cSrcweir _tcscat( szPathValue, TEXT(";") ); 106*cdf0e10cSrcweir break; 107*cdf0e10cSrcweir } 108*cdf0e10cSrcweir } 109*cdf0e10cSrcweir 110*cdf0e10cSrcweir GetEnvironmentVariable( TEXT("PATH"), szBuffer, sizeof(szBuffer) ); 111*cdf0e10cSrcweir _tcscat( szPathValue, szBuffer ); 112*cdf0e10cSrcweir SetEnvironmentVariable( TEXT("PATH"), szPathValue); 113*cdf0e10cSrcweir 114*cdf0e10cSrcweir LPVOID lpEnvironment = GetEnvironmentStrings(); 115*cdf0e10cSrcweir 116*cdf0e10cSrcweir 117*cdf0e10cSrcweir // Retrieve current directory 118*cdf0e10cSrcweir 119*cdf0e10cSrcweir TCHAR szCurrentDirectory[MAX_PATH]; 120*cdf0e10cSrcweir GetCurrentDirectory( MAX_PATH, szCurrentDirectory ); 121*cdf0e10cSrcweir 122*cdf0e10cSrcweir // Set the Flags 123*cdf0e10cSrcweir 124*cdf0e10cSrcweir DWORD dwCreationFlags = PROCESS_CREATIONFLAGS; 125*cdf0e10cSrcweir 126*cdf0e10cSrcweir PROCESS_INFORMATION aProcessInfo; 127*cdf0e10cSrcweir 128*cdf0e10cSrcweir BOOL fSuccess = CreateProcess( 129*cdf0e10cSrcweir szApplicationName, 130*cdf0e10cSrcweir lpCommandLine, 131*cdf0e10cSrcweir NULL, 132*cdf0e10cSrcweir NULL, 133*cdf0e10cSrcweir TRUE, 134*cdf0e10cSrcweir dwCreationFlags, 135*cdf0e10cSrcweir lpEnvironment, 136*cdf0e10cSrcweir szCurrentDirectory, 137*cdf0e10cSrcweir &aStartupInfo, 138*cdf0e10cSrcweir &aProcessInfo ); 139*cdf0e10cSrcweir 140*cdf0e10cSrcweir if ( fSuccess ) 141*cdf0e10cSrcweir { 142*cdf0e10cSrcweir DWORD dwExitCode; 143*cdf0e10cSrcweir 144*cdf0e10cSrcweir WaitForSingleObject( aProcessInfo.hProcess, INFINITE ); 145*cdf0e10cSrcweir fSuccess = GetExitCodeProcess( aProcessInfo.hProcess, &dwExitCode ); 146*cdf0e10cSrcweir 147*cdf0e10cSrcweir return dwExitCode; 148*cdf0e10cSrcweir } 149*cdf0e10cSrcweir 150*cdf0e10cSrcweir DWORD dwError = GetLastError(); 151*cdf0e10cSrcweir 152*cdf0e10cSrcweir LPVOID lpMsgBuf; 153*cdf0e10cSrcweir 154*cdf0e10cSrcweir FormatMessage( 155*cdf0e10cSrcweir FORMAT_MESSAGE_ALLOCATE_BUFFER | 156*cdf0e10cSrcweir FORMAT_MESSAGE_FROM_SYSTEM, 157*cdf0e10cSrcweir NULL, 158*cdf0e10cSrcweir dwError, 159*cdf0e10cSrcweir MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language 160*cdf0e10cSrcweir (LPTSTR)&lpMsgBuf, 161*cdf0e10cSrcweir 0, 162*cdf0e10cSrcweir NULL 163*cdf0e10cSrcweir ); 164*cdf0e10cSrcweir 165*cdf0e10cSrcweir // Display the string. 166*cdf0e10cSrcweir MessageBox( NULL, (LPCTSTR)lpMsgBuf, NULL, MB_OK | MB_ICONERROR ); 167*cdf0e10cSrcweir 168*cdf0e10cSrcweir // Free the buffer. 169*cdf0e10cSrcweir LocalFree( lpMsgBuf ); 170*cdf0e10cSrcweir 171*cdf0e10cSrcweir return GetLastError(); 172*cdf0e10cSrcweir } 173*cdf0e10cSrcweir 174