【问题标题】:Show an (custom) error when "required" runtime libraries are not present?当“必需”运行时库不存在时显示(自定义)错误?
【发布时间】:2013-05-11 12:45:40
【问题描述】:

我一直在 Visual Studio 2012 中制作程序,随之而来的是当我将我的应用程序发送给某人时,他们需要 VS2012 运行时,有时他们不知道在哪里下载或他们需要什么(对于普通用户,“xxx.dll is missing”是非常具有误导性的)。

我确切地知道我的应用程序需要哪些依赖项(fantom.dll [Lego Mindstorms stuff] 和 VC++ 2012 Redist)。

我想在应用程序启动时缺少这些库时显示一个对话框,并向用户提供这些库的下载链接。

这可以实现吗?

【问题讨论】:

  • 您的程序不能提供所需的 redist 和 dll 吗?
  • 一个 30kb 的程序应该包含 30MB 的运行时文件? :P 除了包含它们或 readme.txt 真的没有其他方法吗? XD
  • 所以您是在建议用户下载 30Mb 运行时文件?这与您为他们提供它有什么不同,特别是如果它可能不在他们的机器上,例如 Mindstorm dll。
  • 一些用户已经有了这些库,所以为什么要在包中添加和额外的 30 mb :F
  • 这是一个公平的观点;您的目标受众是谁?您如何向他们发送节目?

标签: c++ windows winapi visual-c++ dependencies


【解决方案1】:

是的,你可以这样做:

  1. 将二进制文件中的所有代码移动到 DLL 中。
  2. 创建一个使用 LoadLibrary 动态加载 DLL 并使用 FreeLibrary 卸载它的 EXE。
  3. 如果 LoadLibrary 失败,请检查是否由于缺少 DLL,如果是,则显示 MessageBox/您的自定义消息并退出。

当然,这意味着您的 EXE 项目不能依赖于运行时本身 - 这应该不是问题,因为您只需要调用 3 个 win32 API。

【讨论】:

    【解决方案2】:

    不,这是不可能的,但您可以为您的程序创建安装程序。在加载程序期间,在代码执行之前引发错误...

    你可以试试:http://www.codeproject.com/Articles/24187/Creating-an-Installer

    【讨论】:

      【解决方案3】:

      我不能说动态测试 VS2012 运行时,但您当然可以动态验证 fantom.dll。您可以动态加载它,而不是直接静态链接到 DLL。您可以将项目配置为在运行时延迟加载 DLL,然后提供延迟加载回调处理程序,如果延迟加载失败,RTL 将调用该处理程序。或者您也可以跳过延迟加载功能,直接调用LoadLibrary() 和GetProcAddress() 手动加载DLL。

      【讨论】:

      • 是的,那个 dll 是这样的
      【解决方案4】:

      当然,您可以验证部署的系统上是否存在依赖项。想到了一些事情......

      • 您可以通过调用 AppDomain.AssemblyResolve() 查看程序集是否在正在运行的系统上被识别。 Further reading here

      • 另一个更原始的选择是调用File.Exists(your assembly path here) 测试,但我建议不要这样做,因为要求安装位置硬路径是一种不好的做法。

      也就是说,正如其他人所说,它仍然是到目前为止为自己创建安装分发的最佳方法。

      【讨论】:

      • 我认为这不会有多大用处,标签建议使用 C++ 应用程序,因此需要 .NET 也不太可能有帮助:)
      • 哎呀!通过 Windows 标记组偶然发现了这一点,并将 C++ 视为 C#。笨拙的我。 ;)
      猜你喜欢
      • 2017-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-09
      • 1970-01-01
      • 1970-01-01
      • 2017-11-05
      相关资源
      最近更新 更多