我在另一个大陆的 Windows XP 计算机上有一个程序。如果我通过双击关联文件来启动它,以便它根据文件类型关联运行程序,它会在某个点崩溃。如果我通过将关联文件拖动到程序图标来启动它,它工作正常。如果我双击图标并将关联的文件拖到窗口中,它工作正常。
现场的人向我保证,他已经三重检查了文件类型关联,它应该是正确的。
假设图标与注册表指向同一个可执行文件,那么以这两种不同的方式启动程序会有什么不同呢?
编辑:作为对评论的回应,我遇到问题的机器是用日语运行的,而我的普通机器是美国英语的。
我在另一个大陆的 Windows XP 计算机上有一个程序。如果我通过双击关联文件来启动它,以便它根据文件类型关联运行程序,它会在某个点崩溃。如果我通过将关联文件拖动到程序图标来启动它,它工作正常。如果我双击图标并将关联的文件拖到窗口中,它工作正常。
现场的人向我保证,他已经三重检查了文件类型关联,它应该是正确的。
假设图标与注册表指向同一个可执行文件,那么以这两种不同的方式启动程序会有什么不同呢?
编辑:作为对评论的回应,我遇到问题的机器是用日语运行的,而我的普通机器是美国英语的。
一个可能的区别是初始工作目录:如果将文件拖到可执行文件上,则初始工作目录将设置为包含可执行文件的目录,而如果双击文件,则初始工作目录将设置为与默认值无关的某个默认值文件或可执行文件所在的位置。
如果您想在所有情况下都获得一致的行为,您可以使用SetCurrentDirectory()
将当前工作目录设置为您想要的任何内容;我推荐包含可执行文件的目录,可以通过调用GetModuleFileName(NULL, ...)
并剥离可执行文件名称或通过检查argv[0]
内部文件来找到该目录main()
。
当您双击文件时,程序将运行,并且(通常)您双击的文件的名称作为命令行参数传递给程序。
当您拖到窗口上时,程序已经在运行。
区别显然在于程序具有的启动过程。这个软件是内部写的吗?也许检查它如何处理启动,并确保当命令行参数中有文件时所有适当的代码路径仍然被执行。
如果您无法检查程序代码,或者它在启动时的行为,那么唯一需要检查注册表并可能更改的是文件名是如何传入的。通常它们是在谈话标记内传入的,所以文件路径可以有空格并且不会混淆程序。可以尝试的方法是确保协会在论点中使用谈话标记,或者如果已经使用,请尝试不使用。也许程序没有正确处理谈话标记。