保存可移植可执行文件的位置

时间:2016-03-20 22:37:29

标签: c++ windows

我想将portable executable文件作为单个exe文件提供。

exe 文件需要一些txt文件来保存logs。但我不希望用户无意中删除它。

administrative操作系统上不需要Windows权限的情况下,可执行文件保存此类文件的标准方法在哪里?

便携式可执行文件也可以在不需要管理权限的情况下运行。

还建议通过便携式可执行文件写入用户系统吗?反病毒软件可以抱怨吗?

1 个答案:

答案 0 :(得分:2)

对于32位程序,可执行文件应安装在"C:\Program Files""C:\Program Files (x86)"中。此安装需要管理员访问权限。

或者您可以在没有管理员权限的情况下安装到"c:\Users\UserName\AppData\Local"目录(或任何其他未受保护的目录,例如"c:\My Programs"),但这是非常规的。

日志文件和其他可写文件无法转到受保护的ProgramFiles目录。它们应该在"c:\Users\UserName\AppData\Local"

用户文件必须位于Documents目录中。

不要忘记程序必须允许用户卸载它。将卸载信息添加到注册表项。

"c:\\Program Files\\MyCompany\\MyAppName\\app.exe"
"c:\\Users\\UserName\\AppData\\Local\\MyCompany\\MyAppName\\app.exe"

HKEY_LOCAL_MACHINE //or use HKEY_CURRENT_USER if there is no admin access
    "software\\microsoft\\windows\\currentversion\\uninstall\\My App Name"
        "UninstallString = full-path-uninstall-command"

卸载字符串通常会添加到HKEY_LOCAL_MACHINE,但如果安装程序没有管理员权限,则可以转到HKEY_CURRENT_USER

要在Vista或更高版本中获取这些文件夹,请使用:

std::wstring documents, appData, programFiles;

wchar_t *ptr;
if (S_OK == SHGetKnownFolderPath(FOLDERID_Documents, 0, NULL, &ptr))
{
    documents = ptr;
    CoTaskMemFree(ptr);
}

if (S_OK == SHGetKnownFolderPath(FOLDERID_LocalAppData, 0, NULL, &ptr))
{
    appData = ptr;
    CoTaskMemFree(ptr);
}

if (S_OK == SHGetKnownFolderPath(FOLDERID_ProgramFilesX86, 0, NULL, &ptr))
{
    programFiles = ptr;
    CoTaskMemFree(ptr);
}