当“必需”运行时库不存在时显示(自定义)错误?

时间:2013-05-16 14:45:37

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

我一直在Visual Studio 2012中创建一个程序,它带来的是当我将我的应用程序发送给某人时,他们需要VS2012运行时,有时他们不知道下载的地方或他们需要的东西(对于普通用户“xxx.dll缺失”是非常误导的。)

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

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

这有可能实现吗?

4 个答案:

答案 0 :(得分:1)

不可以,但您可以为您的程序创建安装程序。在程序加载过程中,在代码执行之前抛出错误......

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

是的,你可以这样做:

  1. 将二进制文件中的所有代码移动到DLL中。
  2. 创建一个EXE,使用LoadLibrary动态加载DLL并使用FreeLibrary卸载它。
  3. 如果LoadLibrary失败,请检查它是否由于缺少DLL,如果是,则显示MessageBox /您的自定义消息并退出。
  4. 当然这意味着您的EXE项目不能依赖于运行时本身 - 这不应该是一个问题,因为您只需要调用3个win32 API即可。

答案 3 :(得分:0)

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

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

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

尽管如此,正如其他人所说的那样,它仍然是到目前为止创建自己的安装发布的最佳方法。