我有一个在NT 5.x,Vista和Windows 7下运行良好的安装程序.它包含适用于NT 6.x上UAC的清单.
但是从Windows 7 RC开始,每次安装程序关闭时,Windows都会产生错误的"此程序可能没有正确安装"消息,即使程序安装正确且没有任何问题.我从来没有在Vista或Windows 7 beta中收到这些虚假消息.
我向微软发送了一个错误报告,但没有收到回复.我认为这可能只是Windows 7 RC中的一个小故障,但问题仍然存在于最新的RTM-escrow版本之一被泄露的新安装中.微软没有任何关于此的文档 - 甚至没有暗示可能触发它的内容.
更令人沮丧的是,我得到了这个"这个程序可能没有正确安装"的消息,即使我在任何安装代码之前在第一个你确定要进行的屏幕上取消安装(创建)一个临时目录,提取文件,复制,注册表等)是永远运行.
有人想过这个吗?
遗憾的是,我并不完全回答我想知道的事情:
上述问题的答案表明它与在开始菜单中添加快捷方式有关,但这不是唯一的原因.到目前为止,我一直无法可靠地弄清楚是什么让Windows认为我的应用程序首先是安装程序,为什么Windows认为它失败了?
我不想简单地在清单中使用兼容性标记来抑制消息.我想写一个合适的解决方案,并告诉Windows我的安装是否失败.此外,使用推荐设置选项的安装是什么,与对话框一起出现?我该如何正确使用此功能?同样,我不想简单地忽略Windows提供的功能,我想使用它们.
我一直在浏览MSDN但没有成功.我问谷歌,但我能找到的方法是使用清单或注册表中的兼容性技巧来抑制消息.如果有人能够在MSDN上提供可以很好地涵盖这一主题的可行资源,我将非常感激.
到目前为止,我正在使用一个使用多个Windows API调用的自定义安装程序.除了注册两个服务之外,我没有搞乱Windows注册表.它也具有requireAdministrator所请求的执行级别(不是任何人都关心,但这是令人惊讶的干净和简单 - 它只是项目设置中的标志).我目前没有使用MFC或CLR.
我有一种非常奇怪的行为,似乎只在一种形式上发生.
基本上我正在创建一个实例Form,并调用Show()以显示非阻塞形式.在那个表单的Load事件处理程序中,我有一些可以this.Close()在某些情况下调用的逻辑.这会关闭表单,但是Show()客户端代码中的表单方法会抛出一个ObjectDisposedException.
ObjectDisposedException的堆栈跟踪如下:
在System.Windows.Forms.Control.CreateHandle()
在System.Windows.Forms.Form.CreateHandle()
在System.Windows.Forms.Control.get_Handle()
在System.Windows.Forms.ContainerControl.FocusActiveControlInternal()
在系统.Windows.Forms.Form.SetVisibleCore(布尔值)
在System.Windows.Forms.Control.Show()
...等.
这就是我所看到的:
Control.Show() 叫做OnFormLoad方法被调用FormLoad事件处理程序被调用,这里面我打电话this.Close()OnFormClosing方法被调用FormClosing事件处理程序被调用Dispose 在我的表单和所有用户控件上调用然后在Control.Show()方法结束的某个地方,它会尝试获取表单的句柄,这会因为对象被标记为处置而变形并抛出异常.
我真正的问题是,为什么我可以在没有例外的其他形式上完成同样的事情?这是GC问题吗?我尝试过GC.Collect()之后立即拨打电话this.Close()并没有任何区别.就像我说的那样,无论子用户控件,表单变量的范围等等,它都会在此表单上100%的时间内发生,而且绝不会在其他任何地方发生.
有任何想法吗?
为什么在我发布我的项目之后,我不能在关闭项目后运行我的exe(你在"Debug"文件夹中找到的那个)而没有收到此错误消息? - 因此不使用我发布的项目,仍然只使用exe
我创建了一个测试项目,只是为了测试是否是这种情况,每次都会发生这种情况.
运行程序
因此打开一个空白表格.
你怎么摆脱这个?我已经读过你应该在你的清单上添加东西等,但肯定有一个更简单的方法吗?我在Windows 7 64位计算机上使用Visual Studio 2008.
编辑:
我找到了问题的解决方案.发生这种情况的原因是因为我的项目名称中有"安装程序"或"安装程序"这个词,你能相信吗......这样的事情可能会像这样影响项目.
我发现这个问题在这里得到解答如何防止Vista上的"此程序可能没有正确安装"消息 这确实是该程序执行此操作的原因.