try CSIDL before resorting to registry or API for paths

git-svn-id: https://svn.code.sf.net/p/nsis/code/NSIS/trunk@4867 212acab6-be3b-0410-9dea-997c60f758d6
This commit is contained in:
kichik 2007-01-23 19:41:28 +00:00
parent edc2d5b49d
commit 0117e3138e
2 changed files with 30 additions and 32 deletions

View file

@ -314,7 +314,7 @@ CEXEBuild::CEXEBuild() :
m_ShellConstants.add("SMSTARTUP",CSIDL_STARTUP, CSIDL_COMMON_STARTUP);
m_ShellConstants.add("DESKTOP",CSIDL_DESKTOPDIRECTORY, CSIDL_COMMON_DESKTOPDIRECTORY);
m_ShellConstants.add("STARTMENU",CSIDL_STARTMENU, CSIDL_COMMON_STARTMENU);
m_ShellConstants.add("QUICKLAUNCH", CSIDL_APPDATA, CSIDL_PRINTERS);
m_ShellConstants.add("QUICKLAUNCH", CSIDL_APPDATA, CSIDL_APPDATA);
m_ShellConstants.add("COMMONFILES",CSIDL_PROGRAM_FILES_COMMON, CSIDL_PROGRAM_FILES_COMMON);
m_ShellConstants.add("DOCUMENTS",CSIDL_PERSONAL, CSIDL_COMMON_DOCUMENTS);
m_ShellConstants.add("SENDTO",CSIDL_SENDTO, CSIDL_SENDTO);

View file

@ -614,45 +614,21 @@ char * NSISCALL GetNSISString(char *outbuf, int strtab)
if (nVarIdx == NS_SHELL_CODE)
{
// NOTE 1: the code CSIDL_PRINTERS, is used for QUICKLAUNCH
// NOTE 2: the code CSIDL_BITBUCKET is used for COMMONFILES
// NOTE 3: the code CSIDL_CONTROLS is used for PROGRAMFILES
LPITEMIDLIST idl;
char *append = 0;
int x = 0;
int x = 2;
*out = 0;
if (fldrs[2] == CSIDL_PRINTERS) // QUICKLAUNCH
// all users' version is CSIDL_APPDATA only for $QUICKLAUNCH
// for normal $APPDATA, it'd be CSIDL_APPDATA_COMMON
if (fldrs[2] == CSIDL_APPDATA)
{
append = "\\Microsoft\\Internet Explorer\\Quick Launch";
x = 2;
}
else if (fldrs[0] == CSIDL_PROGRAM_FILES_COMMON)
{
myRegGetStr(HKEY_LOCAL_MACHINE, SYSREGKEY, "CommonFilesDir", out);
}
else if (fldrs[0] == CSIDL_PROGRAM_FILES)
{
myRegGetStr(HKEY_LOCAL_MACHINE, SYSREGKEY, "ProgramFilesDir", out);
if (!*out)
mystrcpy(out, "C:\\Program Files");
}
else if (fldrs[0] == CSIDL_SYSTEM)
{
GetSystemDirectory(out, NSIS_MAX_STRLEN);
}
else if (fldrs[0] == CSIDL_WINDOWS)
{
GetWindowsDirectory(out, NSIS_MAX_STRLEN);
}
if (!*out)
if (g_exec_flags.all_user_var)
{
x = 4;
if (!g_exec_flags.all_user_var)
x = 2;
}
while (x--)
@ -666,8 +642,30 @@ char * NSISCALL GetNSISString(char *outbuf, int strtab)
break;
}
}
else
*out=0;
*out=0;
}
// resort to old registry methods, only when CSIDL failed
if (!*out)
{
if (fldrs[0] == CSIDL_PROGRAM_FILES_COMMON)
{
myRegGetStr(HKEY_LOCAL_MACHINE, SYSREGKEY, "CommonFilesDir", out);
}
else if (fldrs[0] == CSIDL_PROGRAM_FILES)
{
myRegGetStr(HKEY_LOCAL_MACHINE, SYSREGKEY, "ProgramFilesDir", out);
if (!*out)
mystrcpy(out, "C:\\Program Files");
}
else if (fldrs[0] == CSIDL_SYSTEM)
{
GetSystemDirectory(out, NSIS_MAX_STRLEN);
}
else if (fldrs[0] == CSIDL_WINDOWS)
{
GetWindowsDirectory(out, NSIS_MAX_STRLEN);
}
}
if (*out && append)