note
cdarke
If it helps, this is how I have changed the PATH env. var. using some other weird obscure language (OK, C++). Sorry it is not in Perl, I hope this is enough for you to get the gist:
<code>
#define ENVNAME "Path"
#define MAXLEN 1024
static void UpdatePath (char *szDir)
{
char szPath [MAXLEN]={0};
DWORD dwReturnValue;
// Get previous value
if ( !GetEnvironmentVariable (ENVNAME, szPath, MAX_PATH) )
ReportError ("GetEnvironmentVariable", GetLastError());
// Update path
strcat (szPath, ";");
strcat (szPath, szDir);
// On W2K we need OSVERSIONINFOEX
OSVERSIONINFO OsVer;
OsVer.dwOSVersionInfoSize = sizeof (OsVer);
GetVersionEx (&OsVer);
if ( OsVer.dwPlatformId == VER_PLATFORM_WIN32_NT )
{
// Write to the user environment variables -
// only exists on WNT/W2K!
HKEY hEnv;
dwReturnValue = RegOpenKeyEx (HKEY_CURRENT_USER,
"Environment", 0,
KEY_SET_VALUE,
&hEnv) ;
if ( dwReturnValue != ERROR_SUCCESS )
ReportError ("RegOpenKeyEx", dwReturnValue);
dwReturnValue = RegSetValueEx (hEnv, ENVNAME, 0,
REG_SZ, (BYTE*)szPath,
strlen(szPath)+1);
if ( dwReturnValue != ERROR_SUCCESS )
ReportError ("RegSetValueEx", dwReturnValue);
RegFlushKey (hEnv);
if ( hEnv ) RegCloseKey(hEnv);
}
// Tell the rest of the world (cmd line)
if ( !SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0,
(LPARAM) "Environment", SMTO_ABORTIFHUNG,
5000, &dwReturnValue) )
{
ReportError ("SendMessageTimeout", GetLastError());
}
// Tell our children
if ( !SetEnvironmentVariable (ENVNAME, szPath) )
ReportError ("SetEnvironmentVariable", GetLastError());
} // UpdEnv
</code>
658253
658278