【问题标题】:Save Location for Portable Executable保存便携式可执行文件的位置
【发布时间】:2016-07-07 08:09:54
【问题描述】:

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

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

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

便携式可执行文件也无需管理权限即可运行。

还推荐通过可移植可执行文件写入用户系统吗?杀毒软件可以抱怨吗?

【问题讨论】:

  • 在成为保姆程序员之前,您只能保护您的用户。我不认为这是对时间的建设性利用,而且对于 Stack Overflow 来说它太宽泛了。
  • 存在无法写入的文件和文件夹。我要求写一个合适的标准文件夹。那是什么保姆?
  • 标准位置在“用户文档”文件夹中的某处。有 Windows API 可以获取位置。保姆部分正试图防止他们意外删除文件。
  • SingleExe:检查您的链接器选项以使用静态库而不是动态库 (DLL)。把日志放在哪里? GetTempPath (msdn.microsoft.com/en-us/library/windows/desktop/… (msdn.microsoft.com/en-us/library/windows/desktop/…) & 请体谅并不要填满硬盘。另一种选择是使用 Windows 事件日志 (msdn.microsoft.com/en-us/library/windows/desktop/…) 大多数用户甚至不知道它的存在。顺便说一句:大多数应用程序只是把他们所有的文件放在他们自己的目录中

标签: c++ windows


【解决方案1】:

对于 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);
}

【讨论】:

  • 谢谢巴马克。这是便携式可执行文件。所以用户下载它并且通常在下载文件夹中运行它。那么我应该将所有额外的文件保存在c:\Users\UserName\AppData\Local 中吗?可执行文件还应该将其自身复制到 AppDataLocal 文件夹吗?
  • 是的,不要忘记创建一个子目录,例如“c:\Users\UserName\AppData\Local\MyAppName”。您的独立 *.exe 应进行数字签名,否则 WindowVista 或更高版本将阻止它。这是如何安装的?你在使用安装程序吗?通过互联网?
  • 不,实际上并没有安装。只需双击即可运行。它没有经过数字签名。 Windows 会发出警告,但如果用户单击“确定”发出警告,则可以使用它。只是想在用户系统中添加一些额外的文件,这样他们就不会意外删除它。
  • 您可能应该将包放在 zip 文件中,并允许用户下载并解压缩到他们想要的位置,然后将其保留在那里。用户只有在信任你的情况下才会下载未签名的包,你应该以同样的礼貌回应。包括 readme.txt 文件,让用户知道其他文件被复制到哪里。
  • 好的,谢谢。将添加一个ReadMe.txt
猜你喜欢
  • 2011-05-08
  • 1970-01-01
  • 2020-12-17
  • 1970-01-01
  • 1970-01-01
  • 2021-05-05
  • 2020-10-28
  • 1970-01-01
  • 2017-08-06
相关资源
最近更新 更多