#include <windows.h>
extern "C" BOOL GetProgramFilesDirectory ( char *Dir, DWORD cbDir )
{
char * ProgramFiles = "ProgramFiles";
if ( GetEnvironmentVariable ( ProgramFiles, Dir, cbDir ))
{ return TRUE; }
char * SHFolderDll = "shfolder.dll";
char * SHGetFolderPath = "SHGetFolderPathA";
char pf[MAX_PATH] = "";
HMODULE hm = LoadLibrary ( SHFolderDll );
if ( hm != NULL )
{ BOOL fSuccess = FALSE;
FARPROC fp = GetProcAddress ( hm, SHGetFolderPath );
if ( fp != NULL )
{ char *cpf = &pf[0];
HRESULT hResult;
DWORD StPtr;
__asm { mov StPtr, esp
push cpf
push 0
push 0
push 38
push 0
call fp
mov hResult, eax
mov esp, StPtr }
if ( SUCCEEDED ( hResult ))
{ if ( (DWORD)(lstrlen ( pf )) < cbDir )
{ fSuccess = TRUE;
lstrcpy ( Dir, pf ); } } }
FreeLibrary ( hm );
return fSuccess; }
if ( !GetWindowsDirectory ( pf, sizeof ( pf )))
{ return FALSE; }
int i1 = (int)(lstrlen(pf)) - 1;
while ( i1 >= 0 && pf[i1] != '\\' )
{ i1--; }
if ( i1 < 0 )
{ return FALSE; }
lstrcpy ( &pf[i1], "\\Program Files" );
DWORD Attr = GetFileAttributes ( pf );
if ( Attr == 0xffffffff ||
( Attr & FILE_ATTRIBUTE_DIRECTORY ) != FILE_ATTRIBUTE_DIRECTORY )
{ return FALSE; }
if ( (DWORD)(lstrlen ( pf )) < cbDir )
{ lstrcpy ( Dir, pf );
return TRUE; }
return FALSE; }