2010-02-11 98 views
1

当我部署我在其他机器上的应用程序,这个错误出现:奇怪的安装错误

alt text

现在,如果我卸载我的应用程序,并重新安装它,该错误信息不会来向上。有人遇到过这种情况么?我无法理解堆栈跟踪。这种

+1

您能否以文字形式发布错误消息详情?这将使它能够完全阅读它并可能帮助其他人找到相同的问题来找到这个页面。 – 2010-02-11 14:54:19

+0

你能告诉我们你如何“部署”它吗?什么构建安装程序以及如何运行部署? (例如,点击一次?安装屏蔽等...)。谢谢。 – 2010-02-11 14:57:47

+0

错误在什么时候出现?立即在启动?如果是这样,你能总结一下你在应用程序启动时所做的事情吗? – 2010-02-11 14:59:32

回答

2

该诊断表明本机CreateWindowEx()API函数失败。它失败的原因很少,最常见的是窗口窗口过程中的严重错误。这当然不是Form类的情况,我只见过Windows Forms程序因此错误而失败,因为该进程超出了它的句柄配额。

为了解释这将需要一些挥手。首先,默认情况下,Windows进程只允许创建10,000个句柄,GDI对象和user32对象。你的程序当然不太可能在启动时消耗很多。然而,当安装程序启动时发生这种情况是主角。 Msi.exe得到特别的分配,允许创建更多的句柄。我已经看到它这样做,我运行在一个旧的未打补丁版本的XP上的VS2008 Service Pack 1安装程序在启动它之后大约两个小时,在它确定需要重新启动以完成安装之前,已经处理了500,000个句柄。

您的安装程序将使用CreateProcess()来启动程序。它有一个名为bInheritHandles的参数,用于确定子进程是否继承父进程的句柄。因此,可能的情况是安装程序使用多个句柄,并且它将bInheritHandles参数设置为TRUE。然后你的WF程序将以其已经超过的句柄配额开始,创建另一个句柄将失败。 SetVisibleCore()方法确实是创建主窗体的Handle属性的方法。

这是当然所有的猜想,当进程显示异常对话框时,您应该能够使用Taskmgr.exe,Process选项卡查看自己。使用视图+选择列并勾选句柄,GDI对象和USER对象。最终的解决方案是要找出安装程序为什么要消耗这么多的手柄。或者使用不同的方式来启动程序。

+0

嗯。我可能不得不多看这些,因为错误信息只发生在某些机器上。感谢您的建议。 – broke 2010-02-11 17:11:49

2

问题通常是以下一种:

  • 不是所有的组件都安装:确保所有第三方组件和其它先决条件包括在您的安装程序,并得到正确的设置。这包括COM对象,运行库等。

  • 配置差异:确保您在设置中包含所有相关配置。

  • 32位与64位的问题:如果你的代码必须依赖于你需要设置的x86平台的目标进行编译原生32位库/ COM组件

  • 功能不支持该平台

  • 问题海拔(也更不可能在你的情况有点为你似乎是在XP)

(通常并不是纯.NET应用程序和更多的问题与旧操作系统的情况)

我的感觉告诉我,您可能使用某些第三方控件在应用程序中显示报告。你确定这些控件安装在目标机器上吗?