xref: /aoo42x/main/desktop/win32/source/wrapper.h (revision cdf0e10c)
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