2009-06-12 119 views
3

我在另一个大陆上的Windows XP计算机上有一个程序。如果我通过双击关联文件来启动它,以便它根据文件类型关联运行程序,它会在某个点崩溃。如果我通过将关联文件拖动到程序图标来启动它,它可以正常工作。如果我双击图标并将关联的文件拖动到窗口,它可以正常工作。Windows程序调用有什么区别?

在现场的人告诉我说,他是三重检查的文件类型关联,它应该是正确的。

假设图标指向同一个可执行文件注册表,有什么不同会有在开始这两种不同方式的程序?

编辑:在回应评论,我有在日本运行的问题,而我的正常的机器是美国英语的机器。

+0

这是对Windows的不同本地化(本地化版本可能具有不同的标准路径名称,如“C:\ Program Files”与德语中的“C:\ Program”)?如果区域设置设置为相同的区域,它是否工作? – 2009-06-12 22:19:49

回答

3

一个可能的区别是初始工作目录:如果您拖动文件到可执行文件,初始工作目录设置为包含可执行文件的目录,而如果您双击该文件,初始工作目录设置为一些默认值与文件或可执行文件的位置无关。

如果你想在所有情况下一致的行为,你可以使用SetCurrentDirectory()设置当前工作目录到任何你想要的;我推荐包含可执行文件的目录,可通过调用GetModuleFileName(NULL, ...)并删除可执行文件名,或通过检查main()中的argv[0]来找到该目录。

1

当您双击该文件,运行程序,和(通常)在你双击,在该程序作为命令行参数传递的文件的名称。

当你拖到窗口上时,程序已经在运行。

显然,在程序启动过程中有所不同。这个软件是内部编写的吗?也许检查它如何处理启动,并确保当命令行参数中有文件时,仍然执行所有适当的代码路径。

如果你不能检查程序代码,或者它在启动时是如何运行的,关于在注册表中检查唯一的东西,并且可能改变,就是如何传入文件名。通常它们被传入内部通话标记,以便文件的路径可以有空格而不会混淆程序。要尝试的一件事就是确保该关联在参数上使用说话标记,或者如果已经存在,则尝试不带。也许该程序没有正确处理说话标记。